我是语法新手,无法解决移位减少错误。
我希望我的语言接受简单的ID,ID ++,ID-,-ID或ID ++形式的表达式。
我有以下定义:
lvalue : ID (will be extended to have more ways to address variables)
expr : lvalue
| lvalue INCR
| lvalue DECR
| INCR lvalue
| DECR lvalue
| lvalue ATR expr
(...)
| expr '&' expr
| expr '|' expr
| '(' expr ')'
;
我有以下优先顺序:
%nonassoc INCR DECR
%left '+' '-'
%right ATR
(...)
对于INCR左值和DECR左值,我没有收到任何错误,但是YACC表示它在左值INCR和左值DECR上存在移位减少错误。输出显示:
"95: shift/reduce conflict (shift 123, reduce 57) on INCR
95: shift/reduce conflict (shift 124, reduce 57) on DECR
state 95
expr : lvalue . (57)
expr : lvalue . INCR (61)
expr : lvalue . DECR (62)
expr : lvalue . ATR expr (65)"
我尝试删除左值ATR expr,但不能解决问题。仅删除expr:lvalue可以解决此问题,但是我也需要将该表达式也设置为简单的ID。
您能帮我解决这个问题或告诉我在哪里看吗?
答案 0 :(得分:0)
冲突表明您有lvalue
的规则,该规则是右递归的并且没有优先级-这是类似以下规则:
lvalue: something lvalue
或可以组合为相同效果的几个规则。这就是您需要查看的规则。