Я новичок в грамматике и не могу исправить ошибку смещения.
Я хочу, чтобы мой язык принимал выражения, представляющие собой простые идентификаторы, 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 говорит, что имеет ошибку уменьшения-сдвига для lvalue INCR и lvalue 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)"
Я пытался удалить lvalue ATR expr, но это не решает проблему.Только удаление expr: lvalue решает проблему, но мне нужно, чтобы выражение тоже было простым идентификатором.
Можете ли вы помочь мне исправить это или сказать, где искать?