ANTLRWorks2 中的TestDriver似乎有点挑剔,什么时候它会接受没有明确的语法,EOF
什么时候不接受。ANTLR4 Getting Started Guide中的Hello语法在任何地方都没有使用,所以我推断如果可能的话最好避免显式。EOF
EOF
使用的最佳做法是EOF
什么?你什么时候真正需要它?
ANTLRWorks2 中的TestDriver似乎有点挑剔,什么时候它会接受没有明确的语法,EOF
什么时候不接受。ANTLR4 Getting Started Guide中的Hello语法在任何地方都没有使用,所以我推断如果可能的话最好避免显式。EOF
EOF
使用的最佳做法是EOF
什么?你什么时候真正需要它?
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
不幸的是,此更改对性能的影响是巨大的,因此在解决此问题之前,将会有一些边缘情况不符合您的预期。