我正在使用 ANTLR 3,我有一个问题是,如果输入中发生任何错误,我如何找到下一个预期的令牌。我试图覆盖解析器的 getErrorMessage(RecognitionException e, String[] tokenNames),我可以得到错误,但我无法得到 What is next expected token 。如果有人可以提供帮助。提前致谢。
问问题
639 次
1 回答
1
这并不像听起来那么容易。而且很多时候,这样的信息是不可用的。
例如,您的语法可以匹配带括号的表达式,如下所示:(1+2)
.
如果您的解析器现在尝试解析"(1+2"
,MismatchedTokenException
则会抛出 a ,其expecting
属性将是')'
. 所以,这很容易。
但是,当它尝试解析时"1+2)"
,MismatchedTokenException
会再次抛出 a,但现在解析器会抱怨它需要EOF
,因为它只希望解析像1+2
. 它不会告诉你在“过去”的某个地方,你忘记了一个'('
.
因此,只有少数情况可以让您从解析器引发的异常中提取预期标记。在大多数情况下,您需要自己做(大量的)工作来提取这些信息。在解析器中创建有意义的错误消息并非易事!(至少,不能与简单地为不太复杂的语言编写语法相比)
我建议通过ANTLR 的 API 文档查看 ANTLR 抛出了哪些异常,并按目的为您的解析器提供无效输入,并reportError(...)
在您的解析器中覆盖以查看抛出了哪些异常:
@parser::members {
@Override
public void reportError(RecognitionException e) {
// inspect 'e' and handle/report it
}
}
于 2012-06-21T17:57:58.437 回答