Tratamento dos Erros de Sintaxe. Adriano Maranhão

Documentos relacionados
Análise sintática. Prof. Thiago A. S. Pardo Tratamento de erros sintáticos

COMPILADORES. Análise sintática. Prof. Geovane Griesang Universidade de Santa Cruz do Sul UNISC Departamento de informática

Compilação: Erros. Detecção de Erros: * Analisadores Top-Down - Preditivo Tabular (LL) - Feito a mão. * Analisadores Botton-Up: - Shift-Reduce (SLR)

Análise Sintática. Eduardo Ferreira dos Santos. Outubro, Ciência da Computação Centro Universitário de Brasília UniCEUB 1 / 18

Universidade Estadual da Paraíba - UEPB Curso de Licenciatura em Computação

Compiladores. Análise Léxica

Compiladores. Introdução

COMPILADORES. Análise sintática. Prof. Geovane Griesang Universidade de Santa Cruz do Sul UNISC Departamento de informática

CAP. VI ANÁLISE SEMÂNTICA

Como construir um compilador utilizando ferramentas Java

Análise Sintática I. Eduardo Ferreira dos Santos. Abril, Ciência da Computação Centro Universitário de Brasília UniCEUB 1 / 42

FACULDADE LEÃO SAMPAIO

Compiladores. Motivação. Tradutores. Motivação. Tipos de Tradutores. Tipos de Tradutores

Introdução à Programação

Compiladores. Bruno Lopes. Bruno Lopes Compiladores 1 / 12. Instituto de C

Compiladores. Conceitos Básicos

Compiladores - Especificando Sintaxe

Prof. Adriano Maranhão COMPILADORES

Compiladores. Análise Léxica

Universidade Federal de Goiás Bacharelado em Ciências da Computacão Compiladores

Autômatos e Linguagens

II.1 Conceitos Fundamentais. Uma delas é programar o =>

COMPILADORES. Análise sintática. Prof. Geovane Griesang Universidade de Santa Cruz do Sul UNISC Departamento de informática

CP Compiladores I Prof. Msc.. Carlos de Salles

FERRAMENTA DE AUXÍLIO AO PROCESSO DE DESENVOLVIMENTO DE SOFTWARE INTEGRANDO TECNOLOGIAS OTIMIZADORAS

Universidade de Santa Cruz do Sul UNISC Departamento de informática COMPILADORES. Introdução. Geovane Griesang

Compiladores Aula 3. Celso Olivete Júnior.

Introdução. Compiladores Análise Semântica. Introdução. Introdução. Introdução. Introdução 11/3/2008

Linguagens de Programação

Compiladores - Gramáticas

Compiladores. Fabio Mascarenhas

Compiladores I Prof. Ricardo Santos (cap 1)

Compiladores - Gramáticas

Introdução aos Compiladores

Introdução parte II. Compiladores. Mariella Berger

Análise Sintática. Fabiano Baldo

Compiladores - Análise Recursiva

Uma gramática é ambígua se existe alguma cadeia para qual ela tem mais de uma árvore sintática

Conclusões. Baseado no Capítulo 9 de Programming Language Processors in Java, de Watt & Brown

Gramáticas Livres de Contexto Parte 1

Papel do analisador léxico: ler o arquivo fonte em busca de unidades significativas (os tokens) instanciadas por lexemas ou átomos.

Compiladores - Análise Recursiva

Identificadores Nome de variáveis, constantes, métodos, etc...

INE5421 LINGUAGENS FORMAIS E COMPILADORES

DESENVOLVIMENTO DO COMPILADOR PARA A LINGUAGEM SIMPLE

Compiladores - Gramáticas

Análise Sintática Introdução

Vantagens de uma Gramática. Sintaxe de uma Linguagem. Analisador Sintático - Parser. Papel do Analisador Sintático. Tiposde Parsers para Gramáticas

Compiladores. Bruno Lopes. Bruno Lopes Compiladores 1 / 32. Instituto de C

IV.2 Aspectos Léxicos Convencionais

Análise Léxica I. Eduardo Ferreira dos Santos. Março, Ciência da Computação Centro Universitário de Brasília UniCEUB 1 / 31

FOLHA DE PROVA. Descreva e ilustre, com um exemplo, o algoritmo de minimização de um autômato.

Especificações Gerais do Compilador e Definição de FRANKIE

Paradigmas de Programação

Aspectos do analisador sintático Usabilidade da Dias de atraso

Conceitos de Linguagens de Programação

ACH2043 INTRODUÇÃO À TEORIA DA COMPUTAÇÃO

Introdução à Programação Aula 03. Prof. Max Santana Rolemberg Farias Colegiado de Engenharia de Computação

Analisador Léxico parte II

Análise Sintática. Compiladores Cristina C. Vieira. Compiladores 2012/2013

Compiladores. Parser LL 10/13/2008

Linguagens de Programação Aula 3

Universidade Católica de Pelotas Bacharelado em Ciência da Computação Linguagens Formais e Autômatos TEXTO 6 Introdução à Compilação

Conceitos de Linguagens de Programação

INE5416 Paradigmas de Programação. Ricardo Azambuja Silveira INE CTC UFSC E Mail: URL:

Análise Sintática LL(1)

Paradigmas de Programação

Compiladores. Prof. Bruno Moreno Aula 8 02/05/2011

Projeto de Compiladores

Projeto de Compiladores

Construção de Compiladores

Como construir um compilador utilizando ferramentas Java

Compiladores Analisador Sintático. Prof. Antonio Felicio Netto Ciência da Computação

Conversões de Linguagens: Tradução, Montagem, Compilação, Ligação e Interpretação

COMPILAÇÃO. Ricardo José Cabeça de Souza

Estrutura geral de um compilador programa-fonte

Apresentação. !! Familiarização com os métodos de construção de compiladores de linguagens e com as técnicas de compilação mais habituais.

Compiladores - Análise Ascendente

Sintaxe e Semântica. George Darmiton da Cunha Cavalcanti.

Compiladores - Análise Ascendente

Função, interação com o compilador Especificação e reconhecimento de tokens Implementação Tratamento de erros. Prof. Thiago A. S.

Análise sintática. Análise sintática ascendente. Parte-se dos símbolos terminais em direção ao símbolo inicial da gramática. Derivação mais à direita

Compiladores. Eduardo Ferreira dos Santos. Fevereiro, Ciência da Computação Centro Universitário de Brasília UniCEUB 1 / 38

Compiladores. Análise Sintática

Tokens, Padroes e Lexemas

Análise Sintática II. Eduardo Ferreira dos Santos. Outubro, Ciência da Computação Centro Universitário de Brasília UniCEUB 1 / 34

Algoritmos e Programação

Programação I Apresentação

Análise Semântica e Representação Intermédia

Trabalho de Linguagens Formais e Compilação

Linguagens de Programação Aula 5

Construção de Compiladores. Capítulo 1. Introdução. José Romildo Malaquias. Departamento de Computação Universidade Federal de Ouro Preto 2014.

Construção de Compiladores Aula 16 - Análise Sintática

V.2 Especificação Sintática de Linguagens de Programação

PROGRAMAÇÃO de COMPUTADORES: LINGUAGEM FORTRAN 90/95

Linguagens de Domínio Específico

Questões de Paradigmas de Programação Matéria: Prova 1 4ª EDIÇÃO

Linguagens de Domínio Específico

Transcrição:

Tratamento dos Erros de Sintaxe Adriano Maranhão

Introdução Se um compilador tivesse que processar somente programas corretos, seu projeto e sua implementação seriam grandemente simplificados. Mas os programadores frequentemente escrevem programas incorretos, e um bom compilador deveria assistir o programador na identificação e localização de erros. É gritante que, apesar dos erros serem lugarcomum, poucas linguagens sejam projetadas tendo-se o tratamento de erros em mente. Nossa civilização seria radicalmente diferente se as linguagens faladas tivessem as mesmas exigências de correção sintática que as das linguagens de computadores.

Introdução (cont) A maioria das especificações das linguagens de programação não descreve como um compilador deveria responder aos erros; tal tarefa é deixada para o projetista do compilador. O planejamento do tratamento de erros exatamente desde o início poderia tanto simplificar a estrutura de um compilador quanto melhorar sua resposta aos erros.

Qual a sua função? Na recuperação de erros, tenta-se colocar o analisador em um estado tal que o restante da sentença de entrada ainda possa ser analisada. Este processo pode envolver: a modificação da entrada (excluir tokens), a modificação da pilha, ou de ambos.

Problema de fazer essa recuperação gerar mais erros do que se não tivesse tratado.

Tipos de erros Léxicos Sintáticos Semânticos Lógicos

Erro Léxico tais como errar a grafia de um identificador, palavra-chave ou operador. Ex: intiger,classe...

Erro sintático tais como uma expressão aritmética com parênteses não-balanceados, inserção de um caracter estranho. Ex: result=var++var2

Erro Semantico tais como um operador aplicado à um operando incompatível. Int i; i=9/6;

Erro Lógico tais como uma chamada infinitamente recursiva.

Comportamento de um compilador ao se deparar com um erro Pane Detectar Reparar Corrigir

Pane travar a máquina OU gerar código objeto errado OU abortar a compilação, são comportamentos absolutamente inaceitáveis;

Detectar acusar o erro da forma mais precisa possível e recuperar-se para poder continuar a compilação até o fim (pelo menos com a análise léxica, sintática e semântica);

Reparar Reparar o erro, transformando um símbolo de entrada errado em algo similar que seja aceitável (p.ex. ao ver 2 = 3 * 4 acusa o erro de atribuição inválida, substitui o 2 por um identificador virtual e continua a análise);

Corrigir Corrigir o erro tentando prever (advinhar) o objetivo do usuário de modo a continuar a compilação e geração de código para produzir um módulo executável (onde alguns erros de execução possam ser observados). Por exemplo, ao ver IF A > B C = D, acusa o erro de falta de THEN, insere o símbolo automaticamente e segue em frente.

ACUSANDO ERROS mostrar o erro exatamente (ou o mais próximo possível) onde ocorreu em relação ao arquivo fonte do programa; ser significativas e compreensivas para o usuário (p.ex. "falta fecha- parênteses na linha 5" é melhor que "5: erro RB04");

Acusando erros (cont) ser específicas e indicadoras do problema (p.ex. "variável SOMA não declarada na função SOMATÓRIO" ao invés de "identificador não declarado"; não ser redundantes (p.ex. se a variável SOMA não for declarada, isso deve ser dito na primeira, e não em toda, ocorrência de SOMA no programa fonte).

Estratégia de Recuperação de Erros modalidade do desespero nível de frase produções de erro correção global

Recuperação na modalidade do desespero Este é o método mais simples de implementar e pode ser usado pela maioria dos métodos de análise sintática. Ao descobrir um erro, o analisador sintático descarta símbolos de entrada, um de cada vez, até que seja encontrado um token pertencente a um conjunto designado de tokens de sincronização. Os tokens de sincronização são usualmente delimitadores, tais como o ponto-e-vírgula ou o fim, cujo papel no programa-fonte seja claro. Naturalmente, o projetista do compilador precisa selecionar os tokens de sincronização apropriados à linguagem-fonte. A correção na modalidade do desespero, que frequentemente pula uma parte considerável da entrada sem verificá-la, procurando por erros adicionais, possui a vantagem da simplicidade e, diferentemente dos outros métodos a serem enfocados adiante, tem a garantia de não entrar num laço infinito. Nas situações em que os erros múltiplos num mesmo enunciados sejam raros, esse método pode ser razoavelmente adequado.

Recuperação de frases Ao descobrir um erro, o analisador sintático pode realizar uma correção local na entrada restante. Isto é, pode substituir um prefixo da entrada remanescente por alguma cadeia que permita ao analisador seguir em frente. Correções locais típicas seriam substituir uma vírgula por ponto-e-vírgula, remover um ponto-e- vírgula estranho ou inserir um ausente. A escolha da correção local é deixada para o projetista do compilador. Naturalmente devemos ser cuidadosos, escolhendo substituições que não levem a laços infinitos, como seria o caso, por exemplo, se inseríssemos para sempre na entrada algo à frente do seu símbolo corrente. Esse tipo de substituição pode corrigir qualquer cadeia e foi usado em vários compiladores de correção de erros. O método foi primeiramente usado na análise sintática descendente. Sua maior desvantagem está na dificuldade que tem ao lidar com situações nas quais o erro efetivo ocorreu antes do ponto de detecção

Regras de Produções para erro Se tivéssemos uma boa idéia dos erros comuns que poderiam ser encontrados, poderíamos aumentar a gramática para a linguagem em exame com as produções que gerassem construções ilegais. Usamos, então, a gramática aumentada com essas produções de erro para construir um analisador sintático. Se uma produção de erro for usada pelo analisador, podemos gerar diagnósticos apropriados para indicar a construção ilegal que foi reconhecida na entrada.

Correção global Idealmente, gostaríamos que um compilador fizesse tão poucas mudanças quanto possível, ao processar uma cadeia de entrada ilegal. Existem algoritmos para escolher uma sequência mínima de mudanças de forma a se obter uma correção global de menor custo. Dadas uma cadeia de entrada incorreta x e uma gramática G, esses algoritmos irão encontrar uma árvore gramatical para uma cadeia relacionada y, de tal forma que as inserções, remoções e mudanças de tokens requeridas para transformar x em y sejam tão pequenas quanto possível.

Considerações sobre as estratégias de recuperação de erro Infelizmente, esses métodos são em geral muito custosos de implementar, em termos de tempo e espaço e, então, essas técnicas são correntemente apenas de interesse teórico.devemos assinalar que o programa correto mais próximo pode não ser aquele que o programador tinha em mente. Apesar de tudo, a noção de correção de custo mínimo fornece um padrão de longo alcance para avaliar as técnicas de recuperação de erros e foi usada para encontrar cadeias ótimas de substituição para a recuperação em nível de frase.