如何添加括号作为优先的简单语法的最高水平?(How can I add parentheses as

2019-07-18 19:27发布

我想两件事情添加到我的语法:

  1. 一元减号,即“ - ”,和

  2. 括弧

下面是我的语法迄今:

<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>   ::= * | /

我用尽了一切并不能想出解决办法。 我怎样才能让一元减号是在最高优先级,其次是下一个括号,然后剩下的运营商为他们描述?

Answer 1:

我加入了一个名为新变量<new> 讨论你现在的语法增加三个新的生产规则 Unary minus signParentheses

<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>



Answer 2:

变化<term>使用<fred>代替<darg>并定义

<fred> ::= -<fred> | (<comp>) | <darg>


文章来源: How can I add parentheses as the highest level of precedence in a simple grammar?