私が設計していない単純な言語を解析する必要があるため、言語を変更することはできません。C# で結果が必要なので、使いやすく、パーサーを実行するために外部ライブラリを必要としないので、TinyPGを使用しています。
言語でこの構造に出くわすまで、物事はかなりうまくいっていました。(これは単純化されたバージョンですが、問題を示しています):
EOF -> @"^\s*$";
[Skip] WHITESPACE -> @"\s+";
LIST -> "LIST";
END -> "END";
IDENTIFIER -> @"[a-zA-Z_][a-zA-Z0-9_]*";
Expr -> LIST IDENTIFIER+ END;
Start -> (Expr)+ EOF;
結果のパーサーはこれを解析できません:
LIST foo BAR Baz END
END をキーワードIDENTIFIER
として適切にではなく、貪欲に lexes するためです。END
だから、ここに私の質問があります:
この文法は LL(1) 解析に対してあいまいですか、それとも間違っていますか? それともTinyPGのバグですか?
TinyPG
例の行を適切に解析するように文法を再設計する方法はありますか?C#
コードを出力し、追加のライブラリを必要としない単純なパーサーに関する他の提案はありますか?LLLPG
とを見てきましたがANTLR4
、 よりもはるかに面倒TinyPG
でした。