相关疑难解决方法(0)

ANTLR4 的 errorListener 和 errorHandler 有什么区别?

我想得到ANTLR4解析器的具体错误信息。我发现有两种处理错误的方法:errorListener 和 errorHandler。

// set error handler
parser.removeErrorListeners();
parser.addErrorListener(new QueryErrorListener());

parser.setErrorHandler(new BailErrorStrategy());
Run Code Online (Sandbox Code Playgroud)

但我对它们之间的区别感到困惑。

我发现,errorListener可以获取具体的错误信息,但是只能打印或者记录,不能抛出异常。

errorListener 的实现如下:

public class QueryErrorListener extends BaseErrorListener {

    private static final Logger LOGGER = LoggerFactory.getLogger(QueryDispatcher.class);


    @Override
    public void syntaxError(Recognizer<?, ?> recognizer, Object offendingSymbol,
                            int line, int charPositionInLine, String msg,
                            RecognitionException e)
    {
        List<String> stack = ((Parser)recognizer).getRuleInvocationStack(); Collections.reverse(stack);
        String errorMessage = "line "+line+":"+charPositionInLine+" at "+
                offendingSymbol+": "+msg;
        LOGGER.error("rule stack: "+stack);
        LOGGER.error(errorMessage);
        QueryParseErrorStrategy queryParseErrorStrategy = new QueryParseErrorStrategy();

    }
}
Run Code Online (Sandbox Code Playgroud)

同时errorHandler只能抛出异常ParseCancellationException,没有任何具体的消息。

public class BailErrorStrategy extends DefaultErrorStrategy {
    /** Instead …
Run Code Online (Sandbox Code Playgroud)

antlr4

4
推荐指数
1
解决办法
1471
查看次数

标签 统计

antlr4 ×1