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

时间:2014-11-10 09:07:17

标签: antlr4

我是Antlr4的新手,几天来我的大脑一直在喋喋不休地谈论一种我根本不理解的行为。我有以下组合语法并期望它失败并报告错误,但它没有:

grammar MWE;
parse: cell EOF;
cell: WORD;
WORD: ('a'..'z')+;

如果我输入输入

a4

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

(parse (cell a) <EOF>)

为什么会这样?

1 个答案:

答案 0 :(得分:3)

当达到lexer规则匹配的输入时,错误恢复机制是删除一个字符并继续下一个字符。在你的情况下,词法分析器正在删除4字符,因此你的解析器看到的是这个输入的等价物:

a

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

ErrChar
  : .
  ;
相关问题