Грамматика YACC исправляет ошибку сдвига-уменьшения с увеличением / уменьшением - PullRequest
0 голосов
/ 14 апреля 2019

Я новичок в грамматике и не могу исправить ошибку смещения.

Я хочу, чтобы мой язык принимал выражения, представляющие собой простые идентификаторы, 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 решает проблему, но мне нужно, чтобы выражение тоже было простым идентификатором.

Можете ли вы помочь мне исправить это или сказать, где искать?

1 Ответ

0 голосов
/ 15 апреля 2019

Конфликт указывает, что у вас есть правило для lvalue, которое является праворекурсивным и не имеет приоритета - это правило что-то вроде:

lvalue: something lvalue

или несколько правил, которые могут сочетаться с одинаковым эффектом. Это правило (правила), на которое нужно обратить внимание.

...