18

ANTLRWorks2のTestDriver は、明示的でなくてもグラマーを受け入れる場合とそうでない場合について、ちょっと気難しいようですEOFANTLR4 入門ガイドHello文法はどこにも使用されていないため、可能であれば明示的なものは避けたほうがよいと推測しました。EOFEOF

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

4

1 に答える 1

35

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

たとえば、次のルールを考えてみましょう。

file : item*;

このルールは、「itemできるだけ多くの要素を解析してから停止する」ことを意味します。つまり、このルールは、構文エラーがルールの範囲外の構文構造の一部であると常に想定するため、構文エラーからの回復を試みることはありません。パーサーが停止するだけなので、構文エラーは報告されません。file

代わりに、次のルールがあったとします。

file : item* EOF;

In は、「ファイルは、0 個以上のitem要素のシーケンスで正確に構成されている」ことを意味します。要素の解析中に構文エラーに達した場合item、このルールは構文エラーからの回復 (および報告)EOF試みて続行します。


入力の一部のみを解析しようとしているルールの場合、ANTLR 4 はしばしば機能しますが、常に機能するとは限りません。EOF次の問題は、が省略されている場合、ANTLR 4 が常に正しい決定を下すとは限らないという技術的な問題について説明しています。

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

残念ながら、この変更によるパフォーマンスへの影響はかなり大きいため、それが解決されるまでは、想定どおりに動作しないエッジ ケースが発生する可能性があります。

于 2013-07-25T00:33:48.347 に答える