ANTLR4のパースエラーを捕捉する
文法エラーの時、エラーメッセージが表示されるだけで例外が発生しないので少々悩みました。パーサーにステータスを持っている様子もないなー、など追ってみれば、ANTLRErrorListenerを実装したクラスをパーサーにaddErrorListenerで追加するだけという単純な話でした。
ANTLRErrorListenerを実装。
public class MyErrorListener implements ANTLRErrorListener {
@Override
public void syntaxError(Recognizer<?, ?> recognizer,
Object offendingSymbol, int line, int charPositionInLine,
String msg, RecognitionException e) {
throw new RuntimeException(msg, e);
}
...
}
addErrorListenerで追加。
MyLexer lexer = new MyLexer(new ANTLRInputStream("1 + 2"));
CommonTokenStream tokens = new CommonTokenStream(lexer);
MyParser parser = new MyParser(tokens);
parser.addErrorListener(new MyErrorListener());
もっと色々やりたい場合は、ANTLRErrorStrategyを実装、もしくはDefaultErrorStrategyを継承したクラスを書き、setErrorHandlerで登録してやれば良いようです。