查找下一个预期令牌如果ANTLR 3发生错误

时间:2012-06-21 07:38:45

标签: java antlr grammar antlr3 antlrworks

我正在使用ANTLR 3,我有一个问题是,如果输入中发生任何错误,我怎样才能找到下一个预期的令牌。我试图覆盖解析器的getErrorMessage(RecognitionException e,String [] tokenNames),我可以得到错误,但我无法得到下一个预期的令牌。如果有人可以帮忙。 在此先感谢。

1 个答案:

答案 0 :(得分:1)

这并不像听起来那么容易。而且很多时候,这些信息都不可用。

例如,您的语法可以匹配带括号的表达式:(1+2)

如果您的解析器现在尝试解析"(1+2",则会抛出MismatchedTokenException,其expecting属性将是')'的类型。所以,这很容易。

但是,当它尝试解析"1+2)"时,会再次抛出MismatchedTokenException,但现在解析器会抱怨它期望EOF,因为它希望只解析一个1+2表达式如'('。它告诉你,在“过去”的某个地方,你忘记了reportError(...)

因此,只有几种情况可以让您从解析器引发的异常中提取预期的令牌。在大多数情况下,您需要做(很多努力)工作来自己提取这些信息。在解析器中创建有意义的错误消息并非易事! (至少,与仅为不太复杂的语言编写语法相比)

我建议通过ANTLR's API docs查看ANTLR抛出哪些异常并按目的提供解析器无效输入,并在解析器中覆盖@parser::members { @Override public void reportError(RecognitionException e) { // inspect 'e' and handle/report it } } 以查看抛出的异常:

{{1}}