3

私の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)}
;

そのようなエラーは発生しません。なぜ最初の文法には競合があり、2 番目の文法には競合がないのですか? それらは私の理解と同等のようです。

前もって感謝します!

4

1 に答える 1

1

先を見すぎていますが、最初の形式はとにかく間違っています。2 番目の形式が正しいです。AND と OR、および他のすべての演算子については、別々のプロダクションを作成する必要があります。そうしないと、演算子の優先順位を取得できません。

于 2015-08-20T21:42:47.790 に答える