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

Antlr4匹配整个输入字符串或半身像,antlr4,Antlr4,我是Antlr4的新手,几天来一直在绞尽脑汁思考一个我根本不理解的行为。我有以下组合语法,希望它失败并报告错误,但它没有: grammar MWE; parse: cell EOF; cell: WORD; WORD: ('a'..'z')+; 如果我给它输入 a4 我希望它不能解析它,因为我希望它匹配整个输入字符串,而不仅仅是它的一部分,如EOF所示。但是它没有报告错误(我使用实现iantlerrorlistener接口的errorlistener侦听错误),并给出以下解析树: (pars

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

grammar MWE;
parse: cell EOF;
cell: WORD;
WORD: ('a'..'z')+;
如果我给它输入

a4
我希望它不能解析它,因为我希望它匹配整个输入字符串,而不仅仅是它的一部分,如
EOF
所示。但是它没有报告错误(我使用实现
iantlerrorlistener
接口的errorlistener侦听错误),并给出以下解析树:

(parse (cell a) <EOF>)
(解析(单元格a))

这是为什么?

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

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

ErrChar
  : .
  ;