1

Jisonにパーサーを実装しようとしています。パーサーは、JSON オブジェクト:{ a: 1 }とブロック:の両方をサポートしていますif (true) { statement(); }

私の文法は次のようになります。

block:
  : '{' '}'
  | '{' statementList '}'
  ;

objectExpression:
  : '{' '}'
  | '{' properties '}'
  ;

空のオブジェクトと空のブロックの両方をサポートする必要があるため、との{}両方にルールがあります。blockobjectExpression

動作しますが、次のような多くの警告を出力します。

Conflict in grammar: multiple actions possible when lookahead token is ; in state 52
- reduce by rule: objectExpression -> { }
- reduce by rule: block -> { }

これらの警告を修正または抑制するにはどうすればよいですか?

4

2 に答える 2

2

文字列{}は、ブロックまたは objectExpression として解析できます。いくつかの選択肢があります。

Javascript パーサーでは、 と の間にあいまいさがある場合blockobjectExpression親ルールで最初に来るものを選択します。次の式では、空のオブジェクトよりも空のブロックが優先されます。

expression:
    : block
    | objectExpression
    ;

パーサーはあいまいさ (shift/reduce の競合とも呼ばれます) について文句を言いますが、それでも機能します。Jison パーサーが Bison パーサーと互換性があると仮定すると、expect宣言を使用して警告を抑制します。

また、ブロックと objectExpressions を異なるコンテキストでのみ表示することもできます (たとえば、ブロックはifステートメントまたはforステートメントの後にのみ表示できます)。3 番目の選択肢は、空のオブジェクトのサポートを削除することです。

于 2014-10-19T17:58:36.140 に答える
1

別の lex ルールを追加して終了しました。

\{\} return 'EMPTY_OBJECT';

を次のように変更objectExpressionします。

objectExpression:
  : 'EMPTY_OBJECT'
  | '{' properties '}'
  ;

うまくいきました(少し醜いですが)。

于 2014-10-19T20:46:40.113 に答える