我是语法新手,我无法修复shift-reduce错误。
我希望我的语言接受一个简单的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上有一个shift-reduce错误。输出说:
"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。
你能帮我解决这个问题还是告诉我去哪儿看看?
冲突表明你有一个lvalue
规则,右递归并且没有优先权 - 这是一个规则:
lvalue: something lvalue
或几个可以结合相同效果的规则。这是你需要看的规则。