ANTLR4: gestão de erros

ANTLR4: relatar erros

Por omissão o ANTLR4 faz uma gestão de erros automática, que, em geral, responde bem às necessidades.

No entanto, por vezes é necessário ter algum controlo sobre este processo.

No que diz respeito à apresentação de erros, por omissão o ANTLR4 formata e envia essa informação para a saída standard da consola.

Esse comportamento pode ser redefinido com a interface ANTLRErrorListener.

Como o nome indica, o padrão de software utilizado é o de um listener, e tal como nos temos habituado em ANTLR existe uma classe base (com os métodos todos implementados sem código): BaseErrorListener.

O método syntaxError é invocado pelo ANTLR na presença de erros e aplica-se ao analisador sintáctico.

Relatar erros: exemplo 1

Como exemplo podemos definir um listener que escreva também a pilha de regras do parser que estão activas.

Podemos agora desactivar os listeners definidos por omissão e activar o novo listener:

Note que podemos detectar a existência de erros após a análise sintáctica (já feito pelo antlr4-main):

Podemos também passar todos os erros de reconhecimento de tokens para a análise sintáctica:

Relatar erros: exemplo 2

Outro listener que escreva os erros numa janela gráfica:

ANTLR4: recuperar de erros

A recuperação de erros é a operação que permite que o analisador sintáctico continue a processar a entrada depois de detectar um erro, por forma a se poder detectar mais do que um erro em cada compilação.

Por omissão o ANTLR4 faz uma recuperação automática de erros que funciona razoavelmente bem.

As estratégias seguidas pela ANTLR4 para esse fim são as seguintes:

  • inserção de token;

  • remoção de token;

  • ignorar tokens até sincronizar novamente a gramática com o fim da regra actual.

ANTLR4: alterar estratégia de gestão de erros

Por omissão a estratégia de gestão de erros do ANTLR4 tenta recuperar a análise sintáctica utilizando uma combinação das estratégias atrás sumariamente apresentadas.

A interface ANTLRErrorStrategy permite a definição de novas estratégias, existindo duas implementações na biblioteca de suporte: DefaultErrorStrategy e BailErrorStrategy.

A estratégia definida em BailErrorStrategy assenta na terminação imediata da análise sintáctica quando surge o primeiro erro.

A documentação sobre como lidar com este problema pode ser encontrada na classe Parser.

Para definir uma nova estratégia de gestão de erros utiliza-se o seguinte código:

Last updated