fsyacc 正在为所有二进制操作发出移位/减少错误。
我有这个递归生产:
scalar_expr:
| scalar_expr binary_op scalar_expr { Binary($2, $1, $3) }
将其更改为
scalar_expr:
| constant binary_op constant { Binary($2, Constant($1), Constant($3)) }
消除了错误(但不是我想要的)。优先级和关联性定义如下:
%left BITAND BITOR BITXOR
%left ADD SUB
%left MUL DIV MOD
这是列表文件的摘录,显示了产生错误的状态(另一个状态具有相同的错误)。
state 42:
items:
scalar_expr -> scalar_expr . binary_op scalar_expr
scalar_expr -> scalar_expr binary_op scalar_expr .
actions:
action 'EOF' (noprec): reduce scalar_expr --> scalar_expr binary_op scalar_expr
action 'MUL' (explicit left 9999): shift 8
action 'DIV' (explicit left 9999): shift 9
action 'MOD' (explicit left 9999): shift 10
action 'ADD' (explicit left 9998): shift 6
action 'SUB' (explicit left 9998): shift 7
action 'BITAND' (explicit left 9997): shift 11
action 'BITOR' (explicit left 9997): shift 12
action 'BITXOR' (explicit left 9997): shift 13
您可以看到解析器在所有情况下都发生了变化,我认为这是正确的。至少,我还没有发现行为不正确的情况。
如何重述语法以消除这些错误?