Binary bison中应该如何定义二进制运算符?

Binary bison中应该如何定义二进制运算符?,binary,bison,operator-keyword,shift-reduce,Binary,Bison,Operator Keyword,Shift Reduce,我正在用C编写一个带有bison的解析器,虽然它似乎在我迄今为止尝试过的所有情况下都能正常工作,但我在二进制运算符(以及一元NOT运算符)上收到了一系列shift/reduce警告 当我在bison--verbose中运行.y文件时,我看到: state 51 11 set_existence: expr . IN set 12 | expr . NOT IN set 34 expr: expr . binary_op expr 34 |

我正在用C编写一个带有bison的解析器,虽然它似乎在我迄今为止尝试过的所有情况下都能正常工作,但我在二进制运算符(以及一元NOT运算符)上收到了一系列shift/reduce警告

当我在bison--verbose中运行.y文件时,我看到:

state 51
   11 set_existence: expr . IN set
   12              | expr . NOT IN set
   34 expr: expr . binary_op expr
   34     | expr binary_op expr .

   ...
   NOT    shift, and go to state 26
   AND    shift, and go to state 27
   OR     shift, and go to state 28
   ....
   NOT     [reduce using rule 34 (expr)]
   AND     [reduce using rule 34 (expr)]
   OR      [reduce using rule 34 (expr)]
我没有发现解析二进制运算符时有任何问题,但似乎我应该解决移位/减少问题。我想不出冲突在哪里——SETU的存在似乎完全无关。我的最佳猜测(暗中拍摄)可能与EQ用作二进制运算符(相等比较)以及赋值(例如,“foo=bar=baz;”将根据bar和baz是否相等将foo设置为true/false)有关。如果我将相等性比较更改为==(“foo=bar==baz;”),那么我的解析器将按预期操作,但仍然具有相同的移位/减少冲突

编辑:我确实指定了关联性:

%left OR
%left AND
%left NOT
%left LT LE GT GE NE EQ
%left PLUS MINUS
%left TIMES MOD SLASH
%left POWER

有几种方法可以避免这种情况。第一种是使用
%left
%right
%nonassoc
命令来指定优先级(请参阅)

我个人更喜欢的另一种选择是,将优先级直接编码到语法中。例如,下面是简单算术表达式的BNF:

expr ::= term | expr + term
term ::= factor | term * factor
factor ::= number | ( expr )

这消除了语法层面上的歧义分析。

对不起,我应该指定我有优先权,尽管我不能确定这是否不完整。在这种情况下,请发布更多关于
expr
的规则。你发布的剪报中没有任何内容应该被删除。
expr ::= term | expr + term
term ::= factor | term * factor
factor ::= number | ( expr )