小さなプロジェクト用の型付き変数も含む小さな 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 ;
この競合を解決するためのトリックはありますか?
よろしくお願いします!〜ベンジャミン