我想向用户显示更漂亮的错误消息。
例如,如果有人键入integer i=
,则会显示错误消息no viable alternative at input '<EOF>'
。由于我的语法规则,这完全可以预测,但我正在找出改进这些信息的方法。如果上面示例中缺少=,则消息将更改为mismatched input '<EOF>' expecting '='
。再次可预测,但我可以在我的代码中对这样的事情做更多的事情而不是一般的输入错误。
我应该在代码中捕获它们并尝试评估哪些情况意味着什么?或者有更好的方法来解决这个问题吗?
答案 0 :(得分:1)
通常,您可以创建自己的错误侦听器并将其添加到解析器中,您可以自己处理错误。为此,通过调用parser.removeErrorListeners();
删除任何现有的错误侦听器(默认情况下会自动注册一个控制台)。定义从BaseErrorListener
派生的自己的错误监听器类,并通过parser.addErrorListener(yourListener);
将其实例添加到解析器中。您可以在ANTLR运行时中查看此类自定义错误侦听器的示例(搜索XPathLexerErrorListener
)。覆盖syntaxError
方法并使用提供的信息生成您自己的错误消息。已经有一条消息传递给这个方法(除了其他东西,比如line + char position,exception等),你无法自定义,因为它直接来自生成的代码。所以最好的办法就是单独留下并从头开始(传递异常是你最好的选择)。