文件末尾的可选标记

时间:2013-10-18 23:05:27

标签: predicate antlr4

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

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

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

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

在antlr3中,我会完成

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

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

block : line+ NL? ;

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

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

1 个答案:

答案 0 :(得分:0)

尝试这样的事情:

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

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

或者只是在输入的末尾添加换行符。