ANTLR4: gestão de erros
Last updated
Last updated
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.
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:
Outro listener que escreva os erros numa janela gráfica:
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.
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: