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