2

我正在尝试编写一个语法来解析一个空行表示块结束的文件。我的语法与此类似,几乎可以使用。

file : block+ EOF;
block : line+ NL;
line : stuff NL;

NL : '\r'? '\n';

这有效,只是最后一个块有时没有额外的换行符。当我在文件末尾时,有没有一种好方法可以使块末尾的 NL 可选?

在 antlr3 中,我会做

block : line+ (NL | (EOF) => /* empty */ )

但是,antlr4 没有语法谓词,所以我不能这样做。

block : line+ NL? ;

应该可以工作,但是文件中间的块可以避免其最后的换行符。我不认为它会因为一个块只能跟随一个块。这意味着没有尾随换行符后跟一个块的块看起来像一个块,解析器将贪婪地组合它们。但是,它使结构实际上是什么变得不太清楚。我当然可以想象更复杂的源文件格式,这会导致问题。

有没有解决这个问题的好方法?

4

1 回答 1

0

尝试这样的事情:

file : NL* block (NL+ block)* NL* EOF;
block : line (NL line)*;
line : stuff;

NL : '\r'? '\n';

或者只是在输入的末尾附加一个换行符。

于 2013-10-19T06:26:32.257 回答