如何在简单语法中添加括号作为最高优先级?
Posted
技术标签:
【中文标题】如何在简单语法中添加括号作为最高优先级?【英文标题】:How can I add parentheses as the highest level of precedence in a simple grammar? 【发布时间】:2013-01-11 08:40:43 【问题描述】:我正在尝试在我的语法中添加两件事:
一元减号,即“-”和
括号
这是我目前的语法:
<comp> ::= <expr> | <comp> <op0> <expr>
<expr> ::= <term> | <expr> <op1> <term>
<term> ::= <darg> | <term> <op2> <darg>
<darg> ::= <digit> | <darg> <digit>
<digit> ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
<op0> ::= > | < | =< | => | =
<op1> ::= + | -
<op2> ::= * | /
我已经尝试了所有方法,但无法解决这个问题。如何使一元减号处于最高优先级,然后是括号,然后是描述的其余运算符?
【问题讨论】:
【参考方案1】:将<term>
更改为使用<fred>
而不是<darg>
并定义
<fred> ::= -<fred> | (<comp>) | <darg>
【讨论】:
@rici 感谢您修复它。【参考方案2】:我正在添加一个名为 <new>
的新变量在您当前的语法中添加三个新的生产规则,以添加 Unary minus sign
和 Parentheses
:
<comp> ::= <expr> | <comp> <op0> <expr>
<expr> ::= <term> | <expr> <op1> <term>
<term> ::= <new> | <term> <op2> <darg>
<new> ::= (<comp>) | -<darg> | <darg>
<darg> ::= <digit> | <darg> <digit>
<digit> ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
<op0> ::= > | < | =< | => | =
<op1> ::= + | -
<op2> ::= * | /
通过添加括号,您将在语法中添加两个新终端 (, )
另外,如果你想生成(-7)
、(7)
和((6+7))
这样的表达式,你可以添加<new> ::= ( <new> )
。(这些是有效的表达式)
我想通知您,如果您正在编写编译器,请改用歧义语法并在 YACC 工具中添加运算符优先级,以便高效解析
编辑:
如果你想添加像-(7)
这样的表达式,那是一个有效的表达式。所以<new> ::= -<new>
而不是<new> ::= <drag>
【讨论】:
如果您不明白我为什么要添加新变量,请告诉我。我希望它会有所帮助 我不确定在哪里放置我的新非终端。你所做的很有意义,谢谢! 不应该<new>
的第二个选择是 -<new>
以便可以否定带括号的表达式吗?
@ebohlman 是的,如果你想添加像-(7)
这样的表达式,那是一个有效的表达式。所以<new> ::= -<new>
而不是<new> ::= <drag>
那好以上是关于如何在简单语法中添加括号作为最高优先级?的主要内容,如果未能解决你的问题,请参考以下文章