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
不幸的是,这种变化对性能的影响是巨大的,所以在解决之前,会出现不符合预期的边缘情况.
| 归档时间: |
|
| 查看次数: |
10961 次 |
| 最近记录: |