空白行がブロックの終わりを示すファイルを解析するための文法を作成しようとしています。私はこれに似た文法を持っていますが、これはほとんど機能します。
file : block+ EOF;
block : line+ NL;
line : stuff NL;
NL : '\r'? '\n';
これは、最後のブロックに余分な改行がない場合があることを除いて機能します。ファイルの最後にいるときに、ブロックの最後にある NL をオプションにする良い方法はありますか?
antlr3では、私はやったでしょう
block : line+ (NL | (EOF) => /* empty */ )
ただし、antlr4 には構文述語がないため、それができません。
block : line+ NL? ;
動作するはずですが、ファイルの途中のブロックが最後の改行を回避する可能性があります。ブロックの後にはブロックしか続かないので、そうなるとは思いません。つまり、末尾に改行がなく、その後にブロックが続くブロックは 1 つのブロックのように見え、パーサーは貪欲にそれらを結合します。ただし、構造が実際に何であるかはあまり明確ではありません。これが問題を引き起こす、より複雑なソース ファイル形式を想像することは確かにできます。
これを解決する良い方法はありますか?