我已为bison
声明了这样的优先级:
%left '+' '-'
%left '*' '/'
算术的递归规则:
exp: exp binary_op exp { .. }
| literal_exp { .. }
| ID { .. }
binary_op: '+' { .. }
| '-' { .. }
| '*' { .. }
| '/' { .. }
我有一个算术表达式:10 * 3 + 5
我的程序计算总和,它是80!我仍然不知道为什么优先权不起作用。
答案 0 :(得分:8)
如果您定义如下表达式,它应该有效:
exp: exp '+' exp { .. }
exp '-' exp { .. }
exp '*' exp { .. }
exp '/' exp { .. }
| literal_exp { .. }
| ID { .. }
仅当运算符作为规则中的终端出现时,优先级才有效。
请参阅How precedence works上的文档:
每个规则都从最后提到的终端符号中获得优先权 在组件中
您的exp规则没有终端,因此不会应用优先级。