ANTLR não jogando erros na input inválida

Estou usando o ANTLR para analisar expressões lógicas em uma ferramenta Java que estou escrevendo, e estou tendo problemas porque passar cadeias de input inválidas para o lexer e analisador ANTLR gerado não causa nenhuma exceção. Em vez de lançar uma RecognitionException, como seria de esperar, os arquivos gerados apenas imprimem a mensagem de erro para o console e retornam como se nenhum erro tivesse ocorrido, fazendo com que meu programa travasse quando fosse executado posteriormente nos dados vazios.

Eu usei ANTLRWorks versão 1.4.3 para gerar os arquivos, e parece que deve haver algum tipo de opção para que ele realmente lançar erros em vez de imprimir para o console, mas eu não encontrei nada. Alguém sabe como obter ANTLR para realmente lançar mensagens de erro? Eu vi que este mesmo problema em C # foi resolvido usando uma versão mais antiga do ANTLR, é isso que eu preciso fazer?

EDIT: Depois de Bart me apontou na direção do que eu estava procurando, encontrei esta página

https://theantlrguy.atlassian.net/wiki/display/ANTLR3/Migrating+from+ANTLR+2+to+ANTLR+3

cuja seção “Manipulação de erros” tinha código que fez o que eu quero mais exatamente. Para alterar a maneira como o ANTLR detecta exceções, você pode dizer isso no arquivo de gramática:

@rulecatch { catch (RecognitionException e) { throw e; } } 

Isso força o ANTLR a lançar a exceção em vez de manipulá-lo e recuperá-lo. Há também algumas coisas nessa seção sobre a substituição das funções de incompatibilidade e recuperação para garantir que todas as possíveis exceções sejam lançadas.

Uma solução fácil seria replace o reportError do seu lexer e do parser reportError(...) e lançar uma exceção sua ao invés de deixar o ANTLR tentando recuperar a syntax / input incorreta:

 grammar YourGrammar; // options/header/tokens @parser::members { @Override public void reportError(RecognitionException e) { throw new RuntimeException("I quit!\n" + e.getMessage()); } } @lexer::members { @Override public void reportError(RecognitionException e) { throw new RuntimeException("I quit!\n" + e.getMessage()); } } // lexer & parser rules 

Mais sobre relatórios de erros (e recuperação): https://theantlrguy.atlassian.net/wiki/display/ANTLR3/Error+reporting+and+recovery

Você deve usar um ouvinte de erro conforme sugerido nesta resposta

No entanto, para uma migration rápida de antlr3 para antlr4 / antlr v4, você pode usar isso como sua gramática:

 @parser::members { private final Logger log = LogManager.getLogger(this.getClass().getName()); public java.util.HashMap memory = new java.util.HashMap(); @Override public void notifyErrorListeners(Token offendingToken, String msg, RecognitionException ex) { throw new RuntimeException(msg); } } @lexer::members { @Override public void recover(RecognitionException ex) { throw new RuntimeException(ex.getMessage()); } }