Бизон: сдвиг-уменьшение конфликтов, даже если%left %right
Я знаю, что большинство конфликтов сдвига / уменьшения можно решить с помощью директив% left или% right. Но даже с этим у меня возникают конфликты. Ниже приведен блок моей грамматики:
expression: variable '=' expression
| expression operator expression
| '-' expression %prec UMINUS
| '(' expression ')'
| value_holder
;
operator: relational_operator
| arithmetic_operator
;
relational_operator: LESS
| GREATER
| LESS_OR_EQUAL
| GREATER_OR_EQUAL
| EQUAL
| NOT_EQUAL
;
arithmetic_operator: '+'
| '-'
| '*'
| '/'
| '%'
;
У меня есть директивы приоритета и ассоциативности, такие как:
%right '='
%left EQUAL NOT_EQUAL
%left LESS LESS_OR_EQUAL GREATER GREATER_OR_EQUAL
%left '+' '-'
%left '*' '/'
%left '%'
%right UMINUS
Тем не менее, это дает 11 ошибок уменьшения сдвига. Вот состояние 84, которое дает эти ошибки.
State 84
33 expression: expression . operator expression
33 | expression operator expression .
EQUAL shift, and go to state 56
NOT_EQUAL shift, and go to state 57
LESS shift, and go to state 58
LESS_OR_EQUAL shift, and go to state 59
GREATER shift, and go to state 60
GREATER_OR_EQUAL shift, and go to state 61
'+' shift, and go to state 62
'-' shift, and go to state 63
'*' shift, and go to state 64
'/' shift, and go to state 65
'%' shift, and go to state 66
EQUAL [reduce using rule 33 (expression)]
NOT_EQUAL [reduce using rule 33 (expression)]
LESS [reduce using rule 33 (expression)]
LESS_OR_EQUAL [reduce using rule 33 (expression)]
GREATER [reduce using rule 33 (expression)]
GREATER_OR_EQUAL [reduce using rule 33 (expression)]
'+' [reduce using rule 33 (expression)]
'-' [reduce using rule 33 (expression)]
'*' [reduce using rule 33 (expression)]
'/' [reduce using rule 33 (expression)]
'%' [reduce using rule 33 (expression)]
$default reduce using rule 33 (expression)
operator go to state 68
relational_operator go to state 69
arithmetic_operator go to state 70
Я не могу понять, почему директивы не работают.
При необходимости это файл парсера: parser.y
Редактировать: файл parser.y
был удален.