TestDriverのANTLRWorks2では、文法を受け入れないで明示的にEOF
を受け入れると、それほど気にならないようです。 Helloの文法では、ANTLR4 Getting Started Guideはどこでも使用しないので、可能であれば明示的にEOF
を避けるほうがよいと推測しました。ANTLR 4でEOFが必要なのはいつですか?
EOF
を使用する場合のベストプラクティスは何ですか?実際に必要なのはいつですか?
TestDriverのANTLRWorks2では、文法を受け入れないで明示的にEOF
を受け入れると、それほど気にならないようです。 Helloの文法では、ANTLR4 Getting Started Guideはどこでも使用しないので、可能であれば明示的にEOF
を避けるほうがよいと推測しました。ANTLR 4でEOFが必要なのはいつですか?
EOF
を使用する場合のベストプラクティスは何ですか?実際に必要なのはいつですか?
入力ファイル全体を解析しようとするときはいつでも、エントリルールの最後に明示的にEOF
を含める必要があります。 EOF
が含まれていない場合は、入力全体を解析しようとしていないことを意味します。構文エラーを回避する場合は、入力の一部のみを解析することもできます。例えば
、次のルールを検討:
file : item*;
をこの規則は、「できるだけ多くのitem
要素を解析し、その後、停止します。」という意味つまり、は、常にとなるため、構文エラーから回復しようとします。構文エラーは、file
ルールの範囲を超えた構文構造の一部であると仮定します。パーサは単に停止するので、構文エラーは報告されません。
代わりに私は、次のルールがあった場合:手段で
file : item* EOF;
を「ファイルを0個以上item
要素のシーケンスを正確に構成されています。」 item
要素の解析中に構文エラーが発生した場合、はになります。EOF
が必要でまだ到達していないため、構文エラーから回復して処理を続行します。あなただけの入力の一部を解析しようとしている規則について
は、ANTLR 4は、多くの場合、常にではないが、動作します。次の問題は、EOF
が省略されている場合、ANTLR 4が常に正しい判断を下せないという技術的な問題を説明しています。それが解決されるまで、あなたが期待するように動作していないエッジケースが存在しますので、
これは古いスレッドだとわかっていますが、うまくいけば人々はまだ見ています。私の質問は、文法の開始時に使用するEOFと同等のトークンがあるかどうかです。最初の正当なトークンが見つかるまで、テキストファイルの先頭に任意のガベージを置くことができることを発見しました。 – David