ANTLRWorks2のTestDriver は、明示的でなくてもグラマーを受け入れる場合とそうでない場合について、ちょっと気難しいようですEOF
。ANTLR4 入門ガイドのHello文法はどこにも使用されていないため、可能であれば明示的なものは避けたほうがよいと推測しました。EOF
EOF
を使用するためのベスト プラクティスは何EOF
ですか? 実際にそれが必要になるのはいつですか?
ANTLRWorks2のTestDriver は、明示的でなくてもグラマーを受け入れる場合とそうでない場合について、ちょっと気難しいようですEOF
。ANTLR4 入門ガイドのHello文法はどこにも使用されていないため、可能であれば明示的なものは避けたほうがよいと推測しました。EOF
EOF
を使用するためのベスト プラクティスは何EOF
ですか? 実際にそれが必要になるのはいつですか?
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
残念ながら、この変更によるパフォーマンスへの影響はかなり大きいため、それが解決されるまでは、想定どおりに動作しないエッジ ケースが発生する可能性があります。