我正在尝试编写一个语法来解析一个空行表示块结束的文件。我的语法与此类似,几乎可以使用。
file : block+ EOF;
block : line+ NL;
line : stuff NL;
NL : '\r'? '\n';
这有效,只是最后一个块有时没有额外的换行符。当我在文件末尾时,有没有一种好方法可以使块末尾的 NL 可选?
在 antlr3 中,我会做
block : line+ (NL | (EOF) => /* empty */ )
但是,antlr4 没有语法谓词,所以我不能这样做。
block : line+ NL? ;
应该可以工作,但是文件中间的块可以避免其最后的换行符。我不认为它会因为一个块只能跟随一个块。这意味着没有尾随换行符后跟一个块的块看起来像一个块,解析器将贪婪地组合它们。但是,它使结构实际上是什么变得不太清楚。我当然可以想象更复杂的源文件格式,这会导致问题。
有没有解决这个问题的好方法?