言語ChucKの Jison を介して JavaScript でパーサーを生成しようとしていますが、生成されたパーサーが処理できない言語にあいまいさがあることを除いて、良いスタートを切りました。元の ChucK コンパイラは Bison によって生成されたものであり、これらのあいまいさを何らかの形で解決できるはずです。
この質問の目的のために、私は問題を解釈された文法に単純化し、曖昧さを 1 つだけ提示しました。参考までに、関連するすべてのファイル (生成されたパーサーを含む) の要旨を掲載しました。プロジェクトの構造は次のとおりです。
- language/lexer.js : レクサー。
- language/grammar.js : 文法の定義と、
generate
Jison を介してパーサーを生成するための関数 ( )。 - language/helpers.js : ヘルパー関数
- src/parser.js : 生成されたパーサー。
- testparse.js : 次のソース コードを使用してパーサーをテストするプログラム:
Type var => out;
.
文法自体は次のようになります。
grammar = {
Program: [
['ProgramSection', '$$ = new yy.Program($1);']
],
ProgramSection: [
['Expression SEMICOLON', '$$ = new yy.ExpressionStatement($1);']
],
Expression: [
['DeclExpression', '$$ = $1;'],
['Expression OP DeclExpression', '$$ = new yy.ExpFromBinary($1, $2, $3);']
],
DeclExpression: [
['TypeDecl VarDeclList', '$$ = new yy.DeclExp($1, $2, 0);'],
['PrimaryExpression', '$$ = $1;']
],
VarDeclList: [
['VarDecl', '$$ = new yy.VarDeclList($1);']
],
VarDecl: [
['ID', '$$ = new yy.VarDecl($1);']
],
TypeDecl: [
['ID', '$$ = new yy.TypeDecl(new yy.IdList($1), 0);']
],
PrimaryExpression: [
['ID', '$$ = new yy.ExpFromId($1);']
]
};
あいまいさは、非終端 DeclExpression が または のいずれTypeDecl VarDeclList
かに一致する可能性があることPrimaryExpression
です。これにより、Jison は次の警告を発します。
States with conflicts:
State 7
TypeDecl -> ID . #lookaheads= ID SEMICOLON OP
PrimaryExpression -> ID . #lookaheads= ID SEMICOLON OP
Type var => out;
生成されたパーサーは、次のようにテスト コード ( )の解析に失敗します。
Error: Parse error on line 1: Unexpected 'SEMICOLON'
私の理解では=>
、パーサーがルールと照合しようとするのは、演算子の後の部分TypeDecl VarDeclList
です。
では、このあいまいさに対処できるパーサーを生成するにはどうすればよいでしょうか?