Antlr4 匹配整个输入字符串或半身像

Rob*_*obV 5 antlr4

我是 Antlr4 的新手,几天来我一直在绞尽脑汁地思考一种我根本不理解的行为。我有以下组合语法并期望它失败并报告错误,但事实并非如此:

grammar MWE;
parse: cell EOF;
cell: WORD;
WORD: ('a'..'z')+;
Run Code Online (Sandbox Code Playgroud)

如果我给它输入输入

a4
Run Code Online (Sandbox Code Playgroud)

我希望它无法解析它,因为我希望它匹配整个输入字符串,而不仅仅是其中的一部分,如EOF. 但它没有报告任何错误(我使用实现接口的错误监听器监听错误IAntlrErrorListener)并给出以下解析树:

(parse (cell a) <EOF>)
Run Code Online (Sandbox Code Playgroud)

为什么是这样?

Sam*_*ell 5

当到达没有词法分析器规则匹配的输入时,错误恢复机制是删除一个字符并继续下一个字符。在您的情况下,词法分析器正在删除该4字符,因此您的解析器会看到与此输入等效的内容:

a
Run Code Online (Sandbox Code Playgroud)

解决方案是指示词法分析器为删除的字符创建一个标记,而不是忽略它,并将该标记传递给将报告错误的解析器。在语法中,此规则采用以下形式,并且始终添加为语法中的最后一个规则。如果您有多个词法分析器模式,则具有此形式的规则应显示为默认模式中的最后一个规则以及每个额外模式中的最后一个规则。

ErrChar
  : .
  ;
Run Code Online (Sandbox Code Playgroud)