YACC语法通过递增/递减来修复shift-reduce错误

问题描述 投票:0回答:1

我是语法新手,我无法修复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。

你能帮我解决这个问题还是告诉我去哪儿看看?

grammar yacc lex
1个回答
0
投票

冲突表明你有一个lvalue规则,右递归并且没有优先权 - 这是一个规则:

lvalue: something lvalue

或几个可以结合相同效果的规则。这是你需要看的规则。

© www.soinside.com 2019 - 2024. All rights reserved.