3

В попытке создать грамматику 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)} 
; 

Я не получаю таких ошибок или, почему первая грамматика имеет конфликт, но не второй? Они, похоже, соответствуют моему пониманию.

Заранее благодарен!

ответ

1

Слишком много вперед, но в любом случае первая форма является неправильной. Вторая форма правильная. Вам нужно написать отдельные произведения для AND и OR, а также для всех других операторов. В противном случае вы не сможете получить приоритет оператора.

+0

Да, но почему операторы с одинаковым приоритетом не могут группироваться вместе? –

+1

@GabrielRatener: поскольку приоритет статичен; каждое производство имеет ровно одно преимущество. Другими словами, приоритет не «заглядывает» в предыдущее сокращение, поэтому «Операция: выражение оператора выражения» имеет тот же приоритет, независимо от того, что «Оператор» уменьшил. – rici