3

言語ChucKの Jison を介して JavaScript でパーサーを生成しようとしていますが、生成されたパーサーが処理できない言語にあいまいさがあることを除いて、良いスタートを切りました。元の ChucK コンパイラは Bison によって生成されたものであり、これらのあいまいさを何らかの形で解決できるはずです。

この質問の目的のために、私は問題を解釈された文法に単純化し、曖昧さを 1 つだけ提示しました。参考までに、関連するすべてのファイル (生成されたパーサーを含む) の要旨を掲載しました。プロジェクトの構造は次のとおりです。

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

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です。

では、このあいまいさに対処できるパーサーを生成するにはどうすればよいでしょうか?

4

2 に答える 2