Notes - MIECT
Compiladores
Notes - MIECT
Compiladores
  • Compiladores
  • Compiladores, Linguagens e Gramáticas
    • Enquadramento
    • Compiladores
      • Interpretadores
      • Estrutura de um Compilador
    • Implementação de um Compilador
    • Linguagens: Definição como Conjunto
      • Conceito básicos e terminologia
      • Operações sobre palavras
      • Operações sobre linguagens
    • Introdução às gramáticas
      • Hierarquia de Chomsky
      • Autómatos
  • Introdução, Estrutura, Aplicação
    • Exemplos
      • Expr
      • Exemplo figuras
      • Exemplo visitor
      • Exemplo listener
    • Construção de gramáticas
      • Especificação de gramáticas
    • Estrutura léxica
    • Regras léxicas
      • Padrões léxicos típicos
      • Operador léxico “não ganancioso”
    • Estrutura sintática
      • Secção de Tokens
      • Acções no preâmbulo da gramática
    • Regras sintácticas
      • Padrões sintácticos típicos
      • Precedência
      • Associatividade
      • Herança de gramáticas
    • Outras funcionalidades
      • Tabelas CSV
      • Gramáticas ambíguas
      • Predicados semânticos
      • Separar analisador léxico do analisador sintáctico
      • “Ilhas” lexicais
      • Enviar tokens para canais diferentes
      • Reescrever a entrada
      • Desacoplar código da gramática - ParseTreeProperty
  • Análise Semântica
    • Estrutura de um Compilador
    • Sistema de Tipos
    • Gramáticas de Atributos
    • Tabela de símbolos
    • Instruções restringidas por contexto
    • ANTLR4: gestão de erros
  • Síntese
    • Síntese: Geração de código
    • String Template
    • Síntese: geração de código intermédio
  • Análise Lexical
    • Análise Lexical: Estrutura de um Compilador
    • Linguagens regulares
    • Gramáticas regulares
    • Expressões regulares
    • Conversão entre ER e GR
    • Reconhecimento de tokens
    • Autómatos finitos
    • Autómato finito não determinista
    • Autómato finito determinista
      • Projecto de autómato finito determinista
    • Conversão de AFND em AFD
    • Conversão de uma expressão regular num AFND
    • Autómato finito generalizado (AFG)
  • Gramática de Atributos
    • Conteúdo semântico
    • Gramática de atributos
    • Avaliação Dirigida pela Sintaxe
  • Análise Sintática Descendente
    • Análise Sintática
    • Análise Sintática Descendente
    • Analisador (parser) Recursivo-Descendente Preditivo
    • Questões a resolver
    • Fatorização à Esquerda
    • Eliminação de Recursividade á Esquerda
    • Conjuntos predict, first e follow
      • Conjunto first
      • Conjunto follow
    • Reconhecedor Descendente Preditivo
  • Análise Sintática Ascendente
    • Análise Sintática Ascendente
    • Construção de um reconhecedor ascendente
    • Tabela de decisão de um reconhecedor ascendente
    • Reconhecedor Ascendente
    • Tabela de Decisão de um Reconhecedor Ascendente
Powered by GitBook
On this page
  • ANTLR4: relatar erros
  • Relatar erros: exemplo 1
  • Relatar erros: exemplo 2
  • ANTLR4: recuperar de erros
  • ANTLR4: alterar estratégia de gestão de erros
  1. Análise Semântica

ANTLR4: gestão de erros

PreviousInstruções restringidas por contextoNextSíntese: Geração de código

Last updated 3 years ago

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: