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