ANTLR 4何时需要EOF?

Dao*_*Wen 16 antlr antlrworks

ANTLRWorks2中的TestDriver似乎有点挑剔,它什么时候会接受没有和明确的语法EOF,什么时候不接受.ANTLR4入门指南中的Hello语法不会在任何地方使用,因此我推断如果可能的话,最好避免显式.EOFEOF

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

Sam*_*ell 24

EOF每当您尝试解析整个输入文件时,都应在输入规则的末尾包含一个显式.如果你不包含EOF,那就意味着你没有尝试解析整个输入,如果它意味着避免语法错误,那么只解析一部分输入是可以接受的.

例如,请考虑以下规则:

file : item*;
Run Code Online (Sandbox Code Playgroud)

此规则意味着"尽可能多地解析item元素,然后停止".换句话说,此规则永远不会尝试从语法错误中恢复,因为它始终假定语法错误是超出file规则范围的某些语法结构的一部分.甚至不会报告语法错误,因为解析器将停止.

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

file : item* EOF;
Run Code Online (Sandbox Code Playgroud)

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


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

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

不幸的是,这种变化对性能的影响是巨大的,所以在解决之前,会出现不符合预期的边缘情况.

  • 在搜索为什么 antlr4 默默地忽略输入文件末尾的标记时偶然发现了这一点。谢谢萨姆! (2认同)