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で登録してやれば良いようです。