0

我正在使用 ANTLR 3,我有一个问题是,如果输入中发生任何错误,我如何找到下一个预期的令牌。我试图覆盖解析器的 getErrorMessage(RecognitionException e, String[] tokenNames),我可以得到错误,但我无法得到 What is next expected token 。如果有人可以提供帮助。提前致谢。

4

1 回答 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 回答