私はflex/bisonから文法を移植しており、ほとんどすべてが稼働しているように見えます(特に、トークンストリームは問題ないようで、パーサー文法はコンパイルおよび実行されています)が、暴走の問題が発生しているようです私の文法への非常に小さい/中程度のサイズの入力であっても、スタック/メモリの使用量。同じ非末端の制限されていない配列を一緒に連鎖させるための好ましい構築物は何ですか? 私の Bison 文法では、次の形式の生成規則がありました。
statements: statement | statement statements
words: | word words
ANTLR では、同じルール設定を維持すると、小さな入力 (4kB 程度) では見事に機能するように見えますが、より大きな入力 (100kB 程度) ではスタック オーバーフローが発生します。どちらの場合も、生成された自動解析ツリーも見栄えが悪いです。
これらのプロダクション ルールを (再帰的な形式ではなく) 明示的に付加的なものに変更して実験しました。
statements: statement+
words: word*
ただし、これにより、非常に小さな入力でもメモリ使用量が大幅に増加し (1GB 以上)、パーサーは 20 分間実行した後でも解析ツリーを返すことができませんでした。
任意のポインタをいただければ幸いです。