2

小さなプロジェクト用の型付き変数も含む小さな JavaScript パーサーを生成しようとしています。

幸いなことに、jison はすでに jscore.js を提供しており、これを自分のニーズに合わせて調整しました。タイプを追加した後、削減の競合に遭遇しました。この最小の JISON に問題を最小化しました。

ジソン:

%start SourceElements
%%

// This is up to become more complex soon
Type
    : VAR
    | IDENT
    ;

// Can be a list of statements
SourceElements
    : Statement
    | SourceElements Statement
    ;

// Either be a declaration or an expression
Statement
    : VariableStatement
    | ExprStatement
    ;

// Parses something like: MyType hello;
VariableStatement
    : Type IDENT ";"
    ;

// Parases something like hello;
ExprStatement
    : PrimaryExprNoBrace ";"
    ;

// Parses something like hello;
PrimaryExprNoBrace
    : IDENT
    ;

実際、このスクリプトは 2 つのステートメントを解析するだけです。

変数ステートメント

IDENT IDENT ";"

ExpStatement

IDENT ";"

これは非常に最小化された JISON スクリプトであるため、単純に「Type」を「IDENT」に置き換えることはできません (ところで、これはうまくいきました)。

パーサーを生成すると、次の競合がスローされます。

Conflict in grammar: multiple actions possible when lookahead token is IDENT in state 8
- reduce by rule: PrimaryExprNoBrace -> IDENT
- reduce by rule: Type -> IDENT
Conflict in grammar: multiple actions possible when lookahead token is ; in state 8
- reduce by rule: PrimaryExprNoBrace -> IDENT
- reduce by rule: Type -> IDENT

States with conflicts:
State 8
  Type -> IDENT . #lookaheads= IDENT ;
  PrimaryExprNoBrace -> IDENT . #lookaheads= IDENT ;

この競合を解決するためのトリックはありますか?

よろしくお願いします!〜ベンジャミン

4

1 に答える 1

1

これは私にはジソンのバグのように見えます。次の 2 つのトークン シーケンスの場合、あいまいさについて不平を言っています。

  1. IDENT IDENT
  2. IDENT ";"

問題の状態は、最初の IDENT トークンをシフトした後に到達した状態です。Jison は、そのトークンを削減する必要があること、および Type に削減するか、PrimaryExpressionNoBrace に削減するかがわからない (と主張している) ことに気付きます。

しかし、Jison は次のトークンに基づいて区別できるはずです。それが 2 番目の IDENT である場合は、Type への還元のみが有効な解析につながる可能性がありますが、それが ";" の場合です。その場合、PrimaryExpressionNoBrace に減らすだけで、有効な解析につながる可能性があります。

指定された出力が指定された文法に合っていると確信していますか? ルールを追加するか、指定されたルールを変更して、説明したようなあいまいさを生成することが可能です。これは非常に単純なケースのように思えるので、Jison が間違っていることに驚いています。ただし、実際にそうである場合は、バグ レポートの提出を検討する必要があります。

于 2013-10-28T21:46:54.253 に答える