2

我正在尝试在我的语法中添加两件事:

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

我已经尝试了一切,但无法弄清楚。如何使一元减号处于最高优先级,然后是括号,然后是描述的其余运算符?

4

2 回答 2

2

改为<term>使用<fred>而不是<darg>定义

<fred> ::= -<fred> | (<comp>) | <darg>
于 2013-01-28T03:03:58.250 回答
1

我在您当前的语法中添加了一个<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))like 表达式,您可以添加。(这些是有效的表达式

我想通知您,如果您正在编写编译器,请改用模棱两可的语法并在 YACC 工具中添加运算符优先级,以实现高效解析

编辑

如果您想添加类似的表达式-(7),那是一个有效的表达式。所以<new> ::= -<new>而不是<new> ::= <drag>

于 2013-01-28T19:00:22.117 回答