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