В попытке создать грамматику Jison я имел:Jison: Бинарные операции грамматика конфликт
%left 'OR' 'AND'
%%
Expression:
Operation
;
Operation:
Expression Operator Expression {$$ = new yy.LogicalExpression($2, $1, $3)}
;
Operator:
'AND'
| 'OR'
;
Но это привело к следующему сообщению конфликта:
Conflict in grammar: multiple actions possible when lookahead token is OR in state 6
- reduce by rule: Operation -> Expression Operator Expression
- shift token (then go to state 5)
Conflict in grammar: multiple actions possible when lookahead token is AND in state 6
- reduce by rule: Operation -> Expression Operator Expression
- shift token (then go to state 4)
States with conflicts:
State 6
Operation -> Expression Operator Expression . #lookaheads= $end OR AND
Operation -> Expression .Operator Expression
Operator -> .AND
Operator -> .OR
Когда я заменяю устранить Operator
не -терминал и вместо этого прямо выписывают шаблоны выражений:
%left 'OR' 'AND'
%%
Expression:
Operation
;
Operation:
Expression 'AND' Expression {$$ = new yy.LogicalExpression($2, $1, $3)}
| Expression 'OR' Expression {$$ = new yy.LogicalExpression($2, $1, $3)}
;
Я не получаю таких ошибок или, почему первая грамматика имеет конфликт, но не второй? Они, похоже, соответствуют моему пониманию.
Заранее благодарен!
Да, но почему операторы с одинаковым приоритетом не могут группироваться вместе? –
@GabrielRatener: поскольку приоритет статичен; каждое производство имеет ровно одно преимущество. Другими словами, приоритет не «заглядывает» в предыдущее сокращение, поэтому «Операция: выражение оператора выражения» имеет тот же приоритет, независимо от того, что «Оператор» уменьшил. – rici