Bison - 运算符优先级

3

我有一个有关Bison中操作符优先级和结合性的问题。

在每个示例中,产生式都像这样:expr 'op' expr,例如:http://dinosaur.compilertools.net/bison/bison_8.html

但是,如果我要使用bison的%left和其他结合性工具,并且我要使用类似以下语法的文法:

  expr|     expr binop expr
      |     expr relop expr
      |     expr logical_op expr

并且

 binop: '+' 
      | '-' 
      | '*' 
      | '/' 
      ;
 relop: EE
      | NE
      | LE
      | '<'
      | GE
      | '>'
      ;
 logical_op: AND
           | OR
           ;

需要使用结合性和优先级规则吗?

或者我需要为每个运算符编写明确的expr 'op' expr吗?

我问这个问题是因为当我尝试使用像我发布的那样的语法时,我会收到有关冲突的警告。

但是当我手动编写像expr '+' expr这样的产生式时,我没有收到任何警告。

2个回答

8
为了让优先规则生效,终端符号本身必须出现在含有歧义的产生式中。因此,您不能将终端符号分组为非终端符号,并保留使用优先规则的能力。

谢谢您确认了我的怀疑。 - Andna

1

我更喜欢添加语法规则(产生式)来解释运算符优先级。请查看我的答案这里


有趣的是,我知道通过语法反映运算符优先级的技巧,但我想使用与Bison一起提供的工具。无论如何,还是谢谢你提醒我其他可能性。 - Andna

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接