YACC语法修正带有减少/减少的移位减少错误

时间:2019-04-14 20:41:16

标签: grammar yacc lex

我是语法新手,无法解决移位减少错误。

我希望我的语言接受简单的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。

您能帮我解决这个问题或告诉我在哪里看吗?

1 个答案:

答案 0 :(得分:0)

冲突表明您有lvalue的规则,该规则是右递归的并且没有优先级-这是类似以下规则:

lvalue: something lvalue

或可以组合为相同效果的几个规则。这就是您需要查看的规则。