Бизон: сдвиг-уменьшение конфликтов, даже если%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 был удален.

0 ответов

Другие вопросы по тегам