我想两件事情添加到我的语法:
一元减号,即“ - ”,和
括弧
下面是我的语法迄今:
<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> ::= * | /
我用尽了一切并不能想出解决办法。 我怎样才能让一元减号是在最高优先级,其次是下一个括号,然后剩下的运营商为他们描述?
我加入了一个名为新变量<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> ::= * | /
通过添加括号,你在你的语法加拖新终端{ (, ) }
另外,还可以添加<new> ::= ( <new> )
如果要生成(-7)
(7)
和((6+7))
等表达式。( 这些是有效的表达式 )
我想告诉你,如果你正在写的编译器,用暧昧的语法,而不是添加在YACC工具运算符优先级,使高效解析
编辑 :
如果你想要添加类似的表达-(7)
这是一个有效的表达式。 所以<new> ::= -<new>
而不是<new> ::= <drag>
变化<term>
使用<fred>
代替<darg>
并定义
<fred> ::= -<fred> | (<comp>) | <darg>
文章来源: How can I add parentheses as the highest level of precedence in a simple grammar?