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

Documentos relacionados
Tratamento dos Erros de Sintaxe. Adriano Maranhão

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

Compiladores Aula 12. Celso Olivete Júnior.

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

Tratamento de Erros Sintáticos em A.S.D. com implementação de Procedimentos Recursivos. Error Report, Recovery and Repair

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

Compiladores Aula 6. Celso Olivete Júnior.

Análise sintática. Análise sintática. Top-down ou descendente. Com retrocesso: por tentativa e erro. Preditiva: para gramáticas LL(1) 09/04/2012

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

Estrutura geral de um compilador programa-fonte

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. Análise sintática. Prof. Geovane Griesang Universidade de Santa Cruz do Sul UNISC Departamento de informática

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

Análise Sintática II: Analisadores Descendentes Preditivos

Compiladores - Especificando Sintaxe

Compiladores. Análise Léxica

FACULDADE LEÃO SAMPAIO

Compiladores Aula 13. Celso Olivete Júnior.

Como construir um compilador utilizando ferramentas Java

Compiladores. Análise Léxica

Aspectos do analisador sintático Usabilidade da Dias de atraso

Compiladores Análise Semântica

Compiladores - Gramáticas

Análise sintática. Análise sintática ascendente. Bottom-up, ascendente ou redutiva. Analisadores de precedência de operadores Analisadores LR

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

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

Compiladores - Análise Léxica

Compiladores - Análise Preditiva

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

Compiladores - Análise Preditiva

Compiladores - Gramáticas

Um Compilador Simples. Definição de uma Linguagem. Estrutura de Vanguarda. Gramática Livre de Contexto. Exemplo 1

DESENVOLVIMENTO DO COMPILADOR PARA A LINGUAGEM SIMPLE

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

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

Introdução à Programação

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

Compiladores - Análise Recursiva

IV.2 Aspectos Léxicos Convencionais

Compiladores - Análise Ascendente

Compiladores I Prof. Ricardo Santos (cap 3 Análise Léxica: Introdução, Revisão LFA)

Compiladores - Análise Ascendente

Análise Sintática. Fabiano Baldo

Compiladores - Análise Recursiva

Compiladores Aula 3. Celso Olivete Júnior.

Análise sintática. Questão. E se a análise sintática pudesse ser modelada por autômatos?

Compiladores Análise Semântica

Compiladores. Análise Sintática

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

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

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

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

Função de um Analisador Léxico (Scanner)

Introdução Análise Sintática Descendente Análise Sintática Ascendente. Aula Prática. Fernando Antônio Asevedo Nóbrega

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

Compiladores Análise Semântica

CAP. VI ANÁLISE SEMÂNTICA

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

Compiladores. Fabio Mascarenhas

Análise Sintática LL(1)

Como construir um compilador utilizando ferramentas Java

Linguagens de Programação

Compiladores - Gramáticas

Compiladores. Parser LL 10/13/2008

Compiladores Análise de Tipos

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

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

Análise sintática. Prof. Thiago A. S. Pardo. Análise sintática ascendente

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

Reduce: reduz o que está imediatamente à esquerda do foco usando uma produção

Compiladores I Prof. Ricardo Santos (cap 1)

Plano da aula. Compiladores. Os erros típicos são sintáticos. Análise Sintática. Usando Gramáticas. Os erros típicos são sintáticos

Linguagens de Programação Aula 4

Compiladores. Introdução

Compiladores - Análise Léxica

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

Grupo 3: 8,3 - Parte Léxica (2,0): 1,9 - Na parte I especificou tamanho de identificador com 512 caracteres, mas não tratou (-0,1) -Parte Sintática

Projeto de Compiladores

Programação de Computadores II

Análise semântica. Função, interação com o compilador Tabela de símbolos Análise semântica. Prof. Thiago A. S. Pardo

Linguagem e Técnicas em Programação. Gilson de Souza Carvalho

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

Pró-Reitoria Acadêmica Diretoria Acadêmica Assessoria Pedagógica da Diretoria Acadêmica

Linguagens Livres de Contexto

Tokens, Padroes e Lexemas

INE5421 LINGUAGENS FORMAIS E COMPILADORES

Como construir um compilador utilizando ferramentas Java

Descrição da Linguagem Pascal Jr.

Compiladores. Análise Sintática

Linguagens de Programação Aula 5

Função de um Analisador Léxico (Scanner)

Compiladores - Análise SLR

Introdução parte II. Compiladores. Mariella Berger

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

Parsing Preditivo. Antes de ser abordado o Parsing Preditivo, será apresentado o Analisador Sintático Descendente Recursivo.

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

Prof. Adriano Maranhão COMPILADORES

Transcrição:

Análise sintática Função, interação com o compilador Análise descendente e ascendente Especificação e reconhecimento de cadeias de tokens válidas Implementação Tratamento de erros Prof. Thiago A. S. Pardo taspardo@icmc.usp.br 1 Tratamento de erros Funções Deve relatar a presença de erros de forma clara e precisa Deve se recuperar de cada erro para continuar a análise do programa Pode reparar alguns erros Erro sintático Programa não condiz com a gramática da linguagem: símbolo esperado não encontrado A realização efetiva do tratamento de erros pode ser uma tarefa difícil 2 1

Tratamento de erros Felizmente, a maioria dos erros são simples Pesquisa com estudantes de Pascal 80% dos enunciados contém apenas um erro; 13% tem dois 90% são erros em um único token 60% são erros de pontuação: p.ex., uso do ponto e vírgula (;) 20% são erros de operadores e operandos: p.ex., omissão de : no símbolo := 15% são erros de palavras-chave: p. ex., erros ortográficos (wrteln) 3 Tratamento de erros O tratamento inadequado de erros pode introduzir uma avalanche de erros espúrios, que não foram cometidos pelo programador, mas pelo tratamento de erros realizado Tratamento de erros deve ser cauteloso e selecionar os tipos de erros que podem ser tratados para se obter um processamento eficiente Como analisar um programa Fortran em um compilador Pascal? 4 2

Tratamento de erros Muitas técnicas para o tratamento de erros Nenhuma delas se mostrou universalmente aceitável Poucos métodos têm ampla aplicabilidade Artesanal, muitas vezes Estratégias de tratamento de erro Modo de pânico Recuperação de frases Produções de erro Correção global 5 Tratamento de erros Modo de pânico Método mais simples e fácil de implementar; usado pela maioria dos analisadores Ao encontrar um erro 1. Relata-se o erro 2. Pulam-se tokens até que um token de sincronização seja encontrado Tokens de sincronização: pontos do programa (palavras-chave, delimitadores, etc.) em que é possível se retomar a análise sintática com certa segurança; esses tokens precisam ser determinados pelo projetista do compilador while (x<2 do read(y)... Ao notar a falta do parênteses, relata-se a falta do mesmo e se consome tudo até que o token read seja encontrado, a partir de onde se recomeça a análise 6 3

Tratamento de erros Recuperação de frases (correção local) Ao se detectar um erro, realizam-se correções locais na entrada Por exemplo, substituição de vírgula por ponto e vírgula, remover um ponto e vírgula estranho ou inserir um Planejamento das correções possíveis pelo projetista do compilador Atenção: pode gerar um ciclo infinito! Inserem-se símbolos infinitamente 7 Tratamento de erros Produções de erro Com um bom conhecimento dos erros que podem ser cometidos, pode-se aumentar a gramática da linguagem com produções para reconhecer as produções ilegais e tratá-las adequadamente Correção global Idealmente, o compilador deveria fazer tão poucas modificações no programa quanto possível Escolhe-se uma seqüência mínima de modificações no programa que o tornem correto com o menor custo possível Método muito custoso de se implementar; apenas de interesse teórico 8 4

Modo de pânico: pulam-se tokens até que se encontre um a partir do qual se possa retomar a análise program P; var x: integer;... end. Diante da ausência/erro de var, de onde recomeçar a análise? Quem é esse símbolo de recomeço? Próximo id, seguidor do terminal var 9 Modo de pânico: pulam-se tokens até que se encontre um a partir do qual se possa retomar a análise program P; var x: integer;... end. Diante da ausência/erro de um trecho grande de código, de onde recomeçar a análise? Quem é esse símbolo de recomeço? Símbolo de, seguidor do não terminal de declaração de variáveis 10 5

Modo de pânico: pulam-se tokens até que se encontre um a partir do qual se possa retomar a análise program P;... read(x); write(x+2);... end. Diante da ausência/erro do ponto e vírgula (;), de onde recomeçar a análise? Quem é esse símbolo de recomeço? Símbolo de write, primeiro de comando 11 Modo de pânico: pulam-se tokens até que se encontre um a partir do qual se possa retomar a análise Símbolos de sincronização para um símbolo qualquer A sendo consumido Inicialmente, utilizam-se os seguidores(a) Acrescentam-se os símbolos seguidores do pai de A, isto é, de quem o acionou Útil quando tudo dentro de A deu errado Símbolos de sincronização extras, para garantir que muito da entrada não seja consumido Determinados pelo projetista do compilador 12 6

<comandos>::=<cmd>;<comandos> λ <cmd> ::= read... write... while (<condicao>) do <cmd> if... Se acontecer um erro dentro de <condição>, buscam-se seus seguidores para se retomar a análise: ), por exemplo 13 <comandos>::=<cmd>;<comandos> λ <cmd> ::= read... write... while (<condicao>) do <cmd> if... Se acontecer um erro dentro de <condição> e o programador omitiu os seguidores deste, buscam-se os seguidores do pai para continuar a análise: ponto e vírgula (;), por exemplo 14 7

<comandos>::=<cmd>;<comandos> λ <cmd> ::= read... write... while (<condicao>) do <cmd> if... Ao se buscar pelos seguidores, pode-se perder a análise de grande parte do programa nesse caso (a análise de <comandos>, por exemplo). Em pontos críticos do programa, buscam-se, portanto, tokens a partir de onde seja seguro retomar a análise: read, write e if, por exemplo 15 Nos analisadores descendentes preditivos, a busca por tokens de sincronização é feita sempre que um token esperado não é encontrado Análise recursiva: nos pontos de ERRO dos procedimentos recursivos Análise não recursiva: quando não é possível seguir em frente com a análise, por falta de produção na tabela sintática ou por incompatibilidade de terminais na pilha e na cadeia de entrada 16 8

ASD preditiva recursiva: tratamento de erros Algoritmo do procedimento ERRO procedimento ERRO(num_erro, conjunto_simb_sincr) imprimir mensagem de erro relativa ao erro de número num_erro; enquanto (token_corrente não pertence a conjunto_simb_sincr) faça obter_símbolo(); Observações Tomar o cuidado de verificar quando se chegou ao fim do programa-fonte Opcionalmente, a mensagem de erro pode ser impressa antes da chamada do procedimento ERRO Verificar quem é o seguidor encontrado 17 ASD preditiva recursiva: tratamento de erros <programa> ::= program id ; <corpo>. procedimento programa(s) se (simb=program) então obter_símbolo() imprimir( Erro: program esperado ); ERRO({id}+S); se (simb=id) então obter_símbolo() imprimir( Erro: identificador de programa esperado ); ERRO({;}+S); se (simb=simb_pv) então obter_símbolo() imprimir( Erro: ponto e vírgula esperado ); ERRO(Primeiro(corpo)+S); corpo({.}+s); se (simb=ponto) então obter_símbolo() imprimir( Erro: ponto esperado ); Atenção: se id encontrado, continua a análise normalmente; caso contrário, se elemento de S encontrado, deve-se sair desse procedimento Pode-se passar como um ou mais parâmetros 18 9

ASD preditiva recursiva: tratamento de erros <corpo> ::= <dc> <comandos> end procedimento corpo(s) dc({}+s); se (simb=) então obter_símbolo() imprimir( Erro: esperado ); ERRO(Primeiro(comandos)+S); comandos({end}+s); se (simb=end) então obter_símbolo() imprimir( Erro: end esperado ); ERRO(S); 19 ASD preditiva recursiva: tratamento de erros <cmd> ::= read(<variaveis>) write(<variaveis>)... procedimento cmd(s)... se (simb=simb_abre_parenteses) então obter_símbolo() imprimir( Erro: ( esperado ); ERRO(Primeiro(variaveis)+S+{read,write,while,if,id...});... 20 10

ASD preditiva recursiva: tratamento de erros Exercício: faça o procedimento recursivo com tratamento de erro <dc_v> ::= var <variaveis> : <tipo_var> ; <dc_v> 21 ASD preditiva recursiva: tratamento de erros Exercício: faça o procedimento recursivo com tratamento de erro <dc_v> ::= var <variaveis> : <tipo_var> ; <dc_v> procedimento dc_v(s) se (simb=var) então obter_símbolo() imprimir( Erro: var esperado ); ERRO(Primeiro(variaveis)+S); variaveis({:}+s); se (simb=simb_dp) então obter_símbolo() imprimir( Erro: : esperado ); ERRO(Primeiro(tipo_var)+S); tipo_var({;}+s); se (simb=simb_pv) então obter_símbolo() imprimir( Erro: ; esperado ); ERRO(Primeiro(dc_v)+S); dc_v(s); 22 11

ASD preditiva recursiva: tratamento de erros Outra estratégia de tratamento de erro: aninhamento de ifs <dc_v> ::= var <variaveis> : <tipo_var> ; <dc_v> procedimento dc_v(s) se (simb=var) então obter_símbolo(); variaveis({:}+s); se (simb=simb_dp) então obter_símbolo(); tipo_var({;}+s); se (simb=simb_pv) então obter_símbolo(); dc_v(s); imprimir( Erro: ; esperado ); ERRO(S); imprimir( Erro: : esperado ); ERRO(S); imprimir( Erro: var esperado ); ERRO(S); 23 ASD preditiva recursiva: tratamento de erros Outra estratégia de tratamento de erro: verificação de erro ao fim <dc_v> ::= var <variaveis> : <tipo_var> ; <dc_v> procedimento dc_v(s) se (simb=var) então obter_símbolo() imprimir( Erro: var esperado ); variaveis({:}+s); se (simb=simb_dp) então obter_símbolo() imprimir( Erro: : esperado ); tipo_var({;}+s); se (simb=simb_pv) então obter_símbolo() imprimir( Erro: ; esperado ); dc_v(s); ERRO(S); 24 12

ASD preditiva recursiva: tratamento de erros Outra opção No início de cada procedimento, verificação da presença do símbolo esperado Detecção mais cedo de erros Decisão sobre implementação Quais e quantos erros serão detectados e relatados Lógica de programação Controle 25 13