栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

处理ANTLR4中的错误

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

处理ANTLR4中的错误

由于我对现有的两个答案有些挣扎,所以我想分享一下最终得到的解决方案。

首先,我像SamHarwell建议的那样创建了自己的ErrorListener版本:

public class ThrowingErrorListener extends baseErrorListener {   public static final ThrowingErrorListener INSTANCE = new ThrowingErrorListener();   @Override   public void syntaxError(Recognizer<?, ?> recognizer, Object offendingSymbol, int line, int charPositionInLine, String msg, RecognitionException e)      throws ParseCancellationException {         throw new ParseCancellationException("line " + line + ":" + charPositionInLine + " " + msg);      }}

请注意使用a

ParseCancellationException
而不是a,
RecognitionException
因为DefaultErrorStrategy会捕获后者,并且永远不会到达您自己的代码。

建议不要像BradMace一样创建一个全新的ErrorStrategy,因为DefaultErrorStrategy默认情况下会产生非常好的错误消息。

然后,我在解析函数中使用自定义的ErrorListener:

public static String parse(String text) throws ParseCancellationException {   MyLexer lexer = new MyLexer(new ANTLRInputStream(text));   lexer.removeErrorListeners();   lexer.addErrorListener(ThrowingErrorListener.INSTANCE);   CommonTokenStream tokens = new CommonTokenStream(lexer);   MyParser parser = new MyParser(tokens);   parser.removeErrorListeners();   parser.addErrorListener(ThrowingErrorListener.INSTANCE);   ParserRuleContext tree = parser.expr();   MyParseRules extractor = new MyParseRules();   return extractor.visit(tree);}

这将为您提供与默认情况下打印到控制台相同的错误消息,只是形式为适当的异常。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/569212.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号