2017-02-10 41 views
1

我想向用户显示更多美丽的错误信息。ANTLR4中的“输入端没有可行的替代方案”<EOF>'“的错误信息

例如,如果有人键入integer i=,则会显示错误消息no viable alternative at input '<EOF>'。由于我的语法规则,这是完全正确和可预测的,但我正在设法改进这些消息。如果在上面的示例中缺少=,则消息更改为mismatched input '<EOF>' expecting '='。再次预测,但我可以在我的代码中做更多类似这样的事情,而不是一般的输入错误。

我应该在代码中捕获它们并尝试评估哪些个案是指?还是有更好的方法来处理这个问题?

回答

1

通常,您会创建自己的错误侦听器并将其添加到解析器,您可以在其中自行处理错误。为此,通过调用parser.removeErrorListeners();删除任何现有的错误侦听器(默认情况下会自动注册一个控制台)。定义从BaseErrorListener派生的自己的错误侦听器类,并通过parser.addErrorListener(yourListener);将其实例添加到解析器。您可以在ANTLR运行时中看到这种自定义错误侦听器的示例(搜索XPathLexerErrorListener)。覆盖syntaxError方法并使用提供的信息生成您自己的错误消息。已经有一条消息传递给这个方法(除了像line + char position,exception等其他东西),你不能自定义它,因为它直接来自生成的代码。所以最好的做法可能是单独离开,从头开始(通过例外是你最好的选择)。

+0

这就是我现在在做的。我试图找出我自己的错误侦听器,我可以或应该显示给用户以支持他解决问题。感谢您确认我在正确的轨道上! – FDeitelhoff

相关问题