我想得到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 ×1