2013-07-24 12 views
13

TestDriverのANTLRWorks2では、文法を受け入れないで明示的にEOFを受け入れると、それほど気にならないようです。 Helloの文法では、ANTLR4 Getting Started Guideはどこでも使用しないので、可能であれば明示的にEOFを避けるほうがよいと推測しました。ANTLR 4でEOFが必要なのはいつですか?

EOFを使用する場合のベストプラクティスは何ですか?実際に必要なのはいつですか?

答えて

13

入力ファイル全体を解析しようとするときはいつでも、エントリルールの最後に明示的にEOFを含める必要があります。 EOFが含まれていない場合は、入力全体を解析しようとしていないことを意味します。構文エラーを回避する場合は、入力の一部のみを解析することもできます。例えば

、次のルールを検討:

file : item*; 

をこの規則は、「できるだけ多くのitem要素を解析し、その後、停止します。」という意味つまり、は、常にとなるため、構文エラーから回復しようとします。構文エラーは、fileルールの範囲を超えた構文構造の一部であると仮定します。パーサは単に停止するので、構文エラーは報告されません。

代わりに私は、次のルールがあった場合:手段で

file : item* EOF; 

を「ファイルを0個以上item要素のシーケンスを正確に構成されています。」 item要素の解析中に構文エラーが発生した場合、になります。EOFが必要でまだ到達していないため、構文エラーから回復して処理を続行します。あなただけの入力の一部を解析しようとしている規則について


は、ANTLR 4は、多くの場合、常にではないが、動作します。次の問題は、EOFが省略されている場合、ANTLR 4が常に正しい判断を下せないという技術的な問題を説明しています。それが解決されるまで、あなたが期待するように動作していないエッジケースが存在しますので、

https://github.com/antlr/antlr4/issues/118

は、残念ながら、この変更によるパフォーマンスへの影響は、 かなりです。

+0

これは古いスレッドだとわかっていますが、うまくいけば人々はまだ見ています。私の質問は、文法の開始時に使用するEOFと同等のトークンがあるかどうかです。最初の正当なトークンが見つかるまで、テキストファイルの先頭に任意のガベージを置くことができることを発見しました。 – David

関連する問題