Linguagens de Domínio Específico

Documentos relacionados
Compiladores II. Fabio Mascarenhas

Linguagens de Domínio Específico

Linguagens de Domínio Específico

Linguagens de Domínio Específico

Compiladores - Análise Recursiva

Compiladores - Análise Recursiva

Linguagens de Domínio Específico

Linguagens de Domínio Específico

Compiladores - Especificando Sintaxe

Tópicos em LP. Fabio Mascarenhas

Compiladores - Análise Preditiva

Compiladores. Fabio Mascarenhas

Compiladores - Análise Preditiva

Compiladores - Análise LL(1)

Compiladores - Análise LL(1)

Compiladores - Gramáticas

Compiladores - Gramáticas

Compiladores Análise Semântica

Compiladores Análise Semântica

Compiladores - JACC. Fabio Mascarenhas

Linguagens de Programação

Linguagens de Domínio Específico

FACULDADE LEÃO SAMPAIO

Compiladores - Análise Léxica

Compiladores. Introdução

Compiladores - Análise Léxica

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

Familiarização com a ferramenta JavaCC

Programação Funcional. Capítulo 21. Parsers. José Romildo Malaquias. Departamento de Computação Universidade Federal de Ouro Preto 2018.

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

Compiladores - Análise Ascendente

Compiladores - Análise Ascendente

Tratamento dos Erros de Sintaxe. Adriano Maranhão

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

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

Compiladores II. Fabio Mascarenhas

Compiladores I Prof. Ricardo Santos (cap 1)

Análise Sintática. Fabiano Baldo

Linguagens de Domínio Específico

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

Disciplina: LINGUAGENS FORMAIS, AUTÔMATOS E COMPUTABILIDADE Prof. Jefferson Morais

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

Compiladores. Parser LL 10/13/2008

Revisão. Fases da dacompilação

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

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

Compiladores - Gramáticas

Análise Sintática Bottom-up

Python e sua sintaxe LNCC UFRJ

CP Compiladores I Prof. Msc.. Carlos de Salles

Análise Sintática II: Analisadores Descendentes Preditivos

Introdução à Programação

Compiladores. Análise Léxica

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

Linguagens de Programação

Autômatos e Linguagens

Análise Sintática Introdução

Linguagens Formais. Aula 01 - Conceitos Básicos. Prof. Othon Batista Mestre em Informática

Análise Sintática - Final

Linguagens de Programação Aula 5

Linguagens de Programação

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

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

Compiladores - Análise SLR

QUESTÃO 1 (0,6 ponto) Classifique os processadores de linguagens com relação aos tipos das linguagens-fonte e objeto.

Paradigmas de Programação

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

Compiladores - Análise Preditiva

Compiladores Ambiente de Execução

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

Compiladores. Análise lexical. Plano da aula. Motivação para análise lexical. Vocabulário básico. Estrutura de um compilador

Processamento da Consulta. Processamento da Consulta

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

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

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

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

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

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

Compiladores - Autômatos

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

Semântica de Linguagens de Programação

Como construir um compilador utilizando ferramentas Java

UTFPR - Universidade Tecnológica Federal do Paraná. Processamento e otimização de consultas

Compiladores. Conceitos Básicos

Desenvolvimento de Aplicações Desktop

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

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.

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

Compiladores - JFlex. Fabio Mascarenhas

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

15/03/2018. Professor Ariel da Silva Dias Aspectos sintáticos e semânticos básicos de linguagens de programação

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

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

Construção de um compilador para a linguagem Panda

Compiladores Ambiente de Execução

Transcrição:

Linguagens de Domínio Específico Fabio Mascarenhas 2016.1 http://www.dcc.ufrj.br/~fabiom/dsl

Processamento de uma DSL

Erros Uma falha em um parser de combinadores 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! 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 gramática a seguir: bloco -> stat* stat -> "while" exp "do" bloco "end" NAME "=" exp exp -> aexp ">" aexp aexp aexp -> termo (aop termo)* termo -> fator (mop fator)* fator -> NUM NAME "(" 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 a posição

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 é 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 seq, 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

Predicados sintáticos Um predicado sintático é um tipo de combinador que ou falha ou não consome nada da entrada O combinador not recebe um parser p e constrói um predicado que falha se p não falhar, e se p falhar simplesmente não consome nada O combinador and é o contrário de not, e falha caso p falhe e não consome nada caso p não falhe (qualquer coisa consumida por p é simplesmente ignorada) Predicados sintáticos permitem construir parsers que atuam diretamente nos caracteres da entrada, misturando análise léxica e sintática

PEGs As gramáticas de expressões de parsing, ou PEGs (parsing expression grammars) são uma linguagem para especificar parsers determinísticos Ao contrário das gramáticas livres de contexto, PEGs têm um mapeamento natural para os combinadores que estamos usando Uma expressão de parsing pode ser a expressão vazia '', um terminal 'a', um não-terminal A, uma sequência pq, onde p e q são expressões de parsing, uma escolha ordenada p/q, uma repetição p*, ou um predicado!p Uma PEG é simplesmente um mapeamento entre nomes de não-terminais e suas expressões de parsing

Árvore Sintática e AST A estrutura gramatical de uma entrada forma naturalmente uma árvore: tokens são folhas, outros termos sintáticos são nós internos Uma árvore sintática tem muita informação redundante, e vimos também que a gramática mais natural para uma linguagem nem sempre é a melhor para escrever um analisador para ela Resolvemos os dois problemas com uma árvore sintática abstrata: toda informação redundante é descartada, e procuramos a representação ideal da estrutura gramatical daquela linguagem, independentemente da gramática concreta que usamos