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