gpt4 book ai didi

java - 查找下一个预期 token 如果发生错误 ANTLR 3

转载 作者:行者123 更新时间:2023-12-01 15:19:39 26 4
gpt4 key购买 nike

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

最佳答案

这并不像听起来那么容易。通常,此类信息是无法获得的。

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

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

但是,当它尝试解析 "1+2)" 时,将再次抛出 MismatchedTokenException,但现在解析器会提示它需要 >EOF,因为它期望只解析像 1+2 这样的表达式。它不会告诉您在“过去”的某个地方,您忘记了一个'('

因此,只有少数情况可以让您从解析器引发的异常中提取预期的标记。在大多数情况下,您需要做(大量艰苦的)工作来自己提取这些信息。在解析器中创建有意义的错误消息并不是一项简单的任务! (至少,与简单地为不太复杂的语言编写语法相比)

我建议浏览ANTLR's API docs查看 ANTLR 抛出了哪些异常,并按目的向解析器提供无效输入,并在解析器中重写 reportError(...) 以查看抛出了哪个异常:

@parser::members {

@Override
public void reportError(RecognitionException e) {
// inspect 'e' and handle/report it
}
}

关于java - 查找下一个预期 token 如果发生错误 ANTLR 3,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11133617/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com