18

ANTLRWorks2 中的TestDriver似乎有点挑剔,什么时候它会接受没有明确的语法,EOF什么时候不接受。ANTLR4 Getting Started Guide中的Hello语法在任何地方都没有使用,所以我推断如果可能的话最好避免显式。EOFEOF

使用的最佳做法是EOF什么?你什么时候真正需要它?

4

1 回答 1

35

EOF每当您尝试解析整个输入文件时,都应该在输入规则的末尾包含一个显式。如果不包含EOF,则意味着您没有尝试解析整个输入,并且如果这意味着避免语法错误,则仅解析输入的一部分是可以接受的。

例如,考虑以下规则:

file : item*;

这条规则的意思是“解析尽可能多的item元素,然后停止”。换句话说,该规则永远不会尝试从语法错误中恢复,因为它总是假定语法错误是超出file规则范围的某些语法结构的一部分。甚至不会报告语法错误,因为解析器会简单地停止。

相反,如果我有以下规则:

file : item* EOF;

In 表示“一个文件完全由一系列零个或多个item元素组成。” item如果在解析元素时遇到语法错误,则此规则尝试从语法错误中恢复(并报告)并继续,因为这EOF是必需的并且尚未达到。


对于您只尝试解析输入的一部分的规则,ANTLR 4 通常有效,但并非总是如此。EOF以下问题描述了一个技术问题,如果省略,则 ANTLR 4 并不总是做出正确的决定。

https://github.com/antlr/antlr4/issues/118

不幸的是,此更改对性能的影响是巨大的,因此在解决此问题之前,将会有一些边缘情况不符合您的预期。

于 2013-07-25T00:33:48.347 回答