ANTLR 4中何时需要EOF?

ANTLR 4中何时需要EOF?,antlr,antlrworks,Antlr,Antlrworks,ANTLRWorks2中的TestDriver似乎对何时接受没有显式EOF的语法以及何时不接受语法有点挑剔。中的Hello语法在任何地方都不使用EOF,因此我推断,如果可能,最好避免显式EOF 使用EOF的最佳实践是什么?您什么时候真正需要它?当您试图解析整个输入文件时,应该在输入规则的末尾包含一个显式的EOF。如果没有包含EOF,则表示您没有试图解析整个输入,如果这意味着避免语法错误,则只解析输入的一部分是可以接受的 例如,考虑下面的规则: file : item*; file : item

ANTLRWorks2中的TestDriver似乎对何时接受没有显式
EOF的语法以及何时不接受语法有点挑剔。中的Hello语法在任何地方都不使用
EOF
,因此我推断,如果可能,最好避免显式
EOF


使用
EOF
的最佳实践是什么?您什么时候真正需要它?

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

例如,考虑下面的规则:

file : item*;
file : item* EOF;
此规则意味着“解析尽可能多的
元素,然后停止”。换句话说,此规则永远不会尝试从语法错误中恢复,因为它始终假定语法错误是超出
文件
规则范围的某个语法构造的一部分。语法错误甚至不会被报告,因为解析器将简单地停止

如果我有以下规则:

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


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


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

在搜索为什么antlr4会自动忽略输入文件末尾的标记时,偶然发现了这一点。谢谢你,山姆!