“的漂亮错误消息”;输入端没有可行的替代方案'&书信电报;EOF>'&引用;在ANTLR4中

“的漂亮错误消息”;输入端没有可行的替代方案'&书信电报;EOF>'&引用;在ANTLR4中,antlr4,Antlr4,我想向我的用户显示更漂亮的错误消息 例如,如果有人键入integer i=,则会出现错误消息在输入“”处没有可行的替代项。由于我的语法规则,这是完全可以预测的,但我正在想办法改进这些信息。如果上面的示例中缺少=,则消息将更改为不匹配的输入“”,预期为“=”。同样可以预测,但是我可以在我的代码中做更多类似的事情,而不是处理一般的输入错误 我是否应该在代码中捕捉它们,并尝试评估哪些情况是正确的?或者有更好的方法来处理这个问题吗?通常,您应该创建自己的错误监听器,并将其添加到解析器中,您可以自己处理错

我想向我的用户显示更漂亮的错误消息

例如,如果有人键入
integer i=
,则会出现错误消息
在输入“”处没有可行的替代项
。由于我的语法规则,这是完全可以预测的,但我正在想办法改进这些信息。如果上面的示例中缺少=,则消息将更改为
不匹配的输入“”,预期为“=”
。同样可以预测,但是我可以在我的代码中做更多类似的事情,而不是处理一般的输入错误


我是否应该在代码中捕捉它们,并尝试评估哪些情况是正确的?或者有更好的方法来处理这个问题吗?

通常,您应该创建自己的错误监听器,并将其添加到解析器中,您可以自己处理错误。为此,通过调用
parser.removeErrorListeners()删除任何现有的错误监听器(控制台的监听器默认自动注册)。定义从
BaseErrorListener
派生的自己的错误侦听器类,并通过
parser.addErrorListener(yourListener)将该类的实例添加到解析器中。您可以在ANTLR运行时(搜索
XPathLexerErrorListener
)中看到这样一个自定义错误侦听器的示例。重写
syntaxError
方法,并使用提供的信息生成您自己的错误消息。已经有一条消息传递给这个方法(除了行+字符位置、异常等其他内容),您不能自定义它,因为它直接来自生成的代码。所以最好的办法可能是不去管它,从头开始(传入的异常是您最好的选择)。

这就是我现在正在做的。我试图在我自己的错误监听器中找出我可以或应该向用户显示什么来支持他解决问题。谢谢你的确认,我在正确的轨道上!