Compiladores II. Fabio Mascarenhas

Documentos relacionados
Linguagens de Domínio Específico

Compiladores II. Fabio Mascarenhas

Compiladores - Análise Recursiva

Compiladores - Análise Recursiva

Compiladores - Análise Preditiva

Compiladores - Especificando Sintaxe

Tópicos em LP. Fabio Mascarenhas

Compiladores - Análise Preditiva

Linguagens de Domínio Específico

Compiladores - Gramáticas

Compiladores - Gramáticas

Linguagens de Domínio Específico

Linguagens de Domínio Específico

Compiladores. Fabio Mascarenhas

Compiladores - Análise LL(1)

Compiladores - Análise LL(1)

Linguagens de Domínio Específico

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

Compiladores - Gramáticas

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

Sintaxe do Pascal Simplificado Estendido de 12 novas construções em Notação EBNF (BNF estendida)

Revisão. Fases da dacompilação

Compiladores - Análise Preditiva

Linguagens de Programação

Compiladores - Análise Léxica

Linguagens Formais e Autômatos

Compiladores - Análise Léxica

Análise Sintática Introdução

Linguagens de Programação

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

Compiladores Análise Semântica

Compiladores - Análise SLR

Análise Sintática. Fabiano Baldo

Compiladores Análise Semântica

Linguagem de Programação e Compiladores

Acadêmica: Giselle Mafra Schlosser Orientador: Everaldo Artur Grahl

Linguagens de Programação

Compiladores Análise Semântica

Compiladores. Parser LL 10/13/2008

Compilação da linguagem Panda

Linguagens de Domínio Específico

V Teoria de Parsing. Termos Básicos: Parser Analisador Sintático Parsing Analise Sintática Parse Representação da analise efetuada

Linguagens de Programação. Fluxo de Controle. Carlos Bazilio

Compiladores - Autômatos

Notação EBNF BNF estendida Notação usada com o YACC (gerador de parsers Bottom-up)

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

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

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

MAB Análise Sintática. Wednesday, April 4, 12

Introdução à Linguagem Lua Variáveis e Expressões

Compiladores - JFlex. Fabio Mascarenhas

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

Compiladores - JFlex. Fabio Mascarenhas Monday, April 15, 13

MAB Análise Sintática. Wednesday, August 31, 11

Paradigmas de Programação

V Análise Sintática. V.1.1 Gramáticas Livres de Contexto Definições de GLC

Análise Sintática - Final

Folha 4.1 Análise sintática descendente

Linguagens de Programação

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

Linguagens de Domínio Específico

Compiladores. Análise Léxica

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

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

Introdução à Programação Aula 17 Deteção e correção de erros

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

Intuição da sintaxe de L2 (35)

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

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

Análise Sintática Bottom-up

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

Compiladores Geração de Código

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

Notação EBNF BNF estendida Notação usada com o YACC (gerador de parsers Bottom-up)

Introdução à Programação em C

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

Processamento da Informação Estruturas de seleção simples e composta

Linguagens Formais e Autômatos

Linguagens de Programação

Compiladores Ambiente de Execução

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

Compiladores. Introdução

Capítulo 7. Expressões e Sentenças de Atribuição

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

Linguagens de Programação. Marco A L Barbosa

Paradigmas de Linguagens de Programação. Descrevendo a Sintaxe e a Semântica

Linguagens de Programação

Expressões e sentença de atribuição

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

Linguagens de Programação

Estruturas de Decisão. APROG (Civil) Aula 6

O AMBIENTE DE PROGRAMAÇÃO VISUAL -PLANO DE ENSINO. Prof. Angelo Augusto Frozza, M.Sc.

Introdução à Programação

Linguagens de Programação

Transcrição:

Compiladores II Fabio Mascarenhas - 2014.2 http://www.dcc.ufrj.br/~fabiom/comp2

Erros Uma falha em um parser de combinadores ou PEGs tem dois significados: A alternativa que estamos tentando não está correta, mas outra estará A entrada tem um erro de sintaxe A união dessas duas condições em um único estado do parser causa problemas para gerar boas mensagens de erro para o usuário do parser! Um erro de sintaxe pode fazer o parser todo falhar sem indicar onde, ou fazer ele consumir apenas parte da entrada

Erros - exemplo Vamos ver o que acontece com a PEG a seguir: bloco <- stat* stat <- "while" exp "do" bloco "end" / "id" "=" exp exp <- aexp ">" aexp / aexp aexp <- term (aop term)* term <- fac (mop fac)* fac <- "number" / "id" / "(" exp ")" aop <- "+" / "-" mop <- "*" / "/" Vamos analisar o programa abaixo, que tem um erro de sintaxe: n = 5 f = 1 while n > 0 do f = f * n n n 1 -- falta um = end

Falha mais distante Uma estratégia para indicar ao usuário onde um erro aconteceu é guardar a posição na entrada onde aconteceu a falha mais distante Ou, de maneira equivalente, o tamanho do menor sufixo da entrada onde uma falha aconteceu Isso requer que o parser mantenha mais esse estado: ao invés de receber a entrada e dar o resultado, ele recebe a entrada e o menor sufixo, e retorna o resultado e o menor sufixo (que pode ser outro) Todos os combinadores que manipulam diretamente a entrada precisam ser mudados

Falha mais distante - exemplo Vamos usar o mesmo exemplo de antes, e escrever uma função que faz o pósprocessamento do menor sufixo e da entrada inicial para gerar uma mensagem de erro com linha e coluna

Falha mais distante terminais esperados Podemos melhorar ainda mais as mensagens de erro mantendo, além do menor sufixo, um conjunto de terminais esperados A ideia é incluir um terminal nesse conjunto toda vez que ele falhar com um sufixo de tamanho igual do do menor sufixo Na atualização do menor sufixo um novo conjunto é usado Ao final do parsing temos não apenas a posição onde o provável erro aconteceu, mas quais terminais (ou tokens) eram esperados naquela posição, ajudando o usuário a corrigir o erro

Combinadores LL(1) Uma outra maneira de detectar erros em parsers de combinadores e PEGs é introduzir um valor de erro explícito, além da falha Esse valor interrompe a análise, diretamente no local onde o erro aconteceu Mas quando um parser deve sinalizar um erro? Uma ideia é assumir que uma restrição análoga à restrição LL(1) de gramáticas livres de contexto: no bind, se o primeiro parser consumiu algo da entrada, uma falha no parser subsequente é transformada em um erro LL(1) é bastante restrito, então também acrescentamos um jeito de aumentar o lookahead : um combinador try que transforma um erro que tenha acontecido em uma falha

Outras extensões A ideia de erros em parsers determinísticos e PEGs pode ser estendida a vários tipos de erros, correspondendo a diferentes tipos de exceções em uma linguagem de programação Podemos permitir a parametrização dos não-terminais de PEGs, dando um poder de abstração similar ao dos combinadores A proibição de não haver recursão à esquerda também pode ser removida, permitindo escrever gramáticas de expressões sem o uso de chainr/chainl, e sem não-terminais diferentes para as várias classes de prioridade

SmallLua bloco <- stat* (ret / '') stat <- "while" exp "do" bloco "end" / "local" "id" "=" exp / "id" "=" exp / "function" "id" "(" (ids / '') ")" bloco "end" / "if" exp "then" bloco ("else" bloco) "end" / pexp "(" (exps / '') ")" ret <- "return" exp ids <- "id" ("," "id")* exps <- exp ("," exp)* exp <- lexp ("or" lexp)* lexp <- rexp ("and" rexp)* rexp <- cexp (rop cexp)* cexp <- aexp ".." cexp / aexp aexp <- mexp (aop mexp)* mexp <- sexp (mop sexp)* sexp <- "-" sexp / "not" sexp / "nil" / "false" / "true" / "number" / "string" / lmb / pexp lmb <- "function" "(" (ids / '') ")" bloco "end" pexp <- ("(" exp ")" / "id") ("(" (exps / '') ")")* rop <- "<" / "==" / "~=" aop <- "+" / "-" mop <- "*" / "/"