Compiladores - Análise Preditiva



Documentos relacionados
Compiladores - Análise Preditiva

Compiladores - Análise Recursiva

Compiladores - Análise Recursiva

Compiladores - Especificando Sintaxe

Compiladores - Análise Preditiva

Linguagens de Domínio Específico

Compiladores - Análise SLR

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

Linguagens de Domínio Específico

Compiladores - Análise LL(1)

Compiladores - Análise LL(1)

Compiladores Análise Semântica

Compiladores Análise Semântica

Compiladores II. Fabio Mascarenhas

Linguagens de Domínio Específico

Compiladores Análise Semântica

Compiladores. Exemplo. Caraterísticas de Gramáticas. A αβ 1 αβ 2. A αx X β 1 β 2. Lembrando... Gramáticas Livres de Contexto

Compiladores - Gramáticas

Compiladores - Gramáticas

Compiladores. Parser LL 10/13/2008

Linguagens de Domínio Específico

Análise Sintática - Final

Linguagens de Domínio Específico

Analisadores Descendentes Tabulares; Cjs First Follow

Compiladores - Análise Ascendente

Compiladores - Análise Ascendente

Compiladores - Gramáticas

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

Análise Sintática Bottom-up

Tópicos em LP. Fabio Mascarenhas

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

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

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

Compiladores - Análise Léxica

Análise Sintática Descendente

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 / 12. Instituto de C

Compiladores - Análise Léxica

Compiladores. Fabio Mascarenhas

Análise Sintática II: Analisadores Descendentes Preditivos

Linguagens de Domínio Específico

Análise Sintática (Cap. 04) Análise Sintática Descendente

Análise Sintática. Fabiano Baldo

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

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

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

Como construir um compilador utilizando ferramentas Java

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

Compiladores. Análise Sintática

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

Revisão. Fases da dacompilação

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

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 Ambiente de Execução

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

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

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

Compiladores - JACC. Fabio Mascarenhas

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

Análise Sintática Introdução

Compiladores. Transformações de GLCs. Plano da aula. Análise Top-Down. Análise Top-Down Exemplo. Gramáticas Livres de Contexto.

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

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 dos Erros de Sintaxe. Adriano Maranhão

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

Aspectos do analisador sintático Usabilidade da Dias de atraso

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 Programação Aula 5

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

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

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

INE5318 Construção de Compiladores. AULA 4: Análise Sintática

Linguagens Livres de Contexto

Linguagens de Programação

Compiladores - Autômatos

Gramáticas Livres de Contexto Parte 1

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

Linguagens de Programação Aula 4

Análise Sintáctica. Definições: Conjuntos First() e Follow() Compiladores, Aula Nº 19 João M. P. Cardoso. Conjunto First(β)

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

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

Conceitos de Linguagens de Programação

Revisão de GLC e Analisadores Descendentes

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 Ambiente de Execução

Análise Sintática LL(1)

Familiarização com a ferramenta JavaCC

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

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

LFA Aula 09. Gramáticas e Linguagens Livres de Contexto 18/01/2016. Linguagens Formais e Autômatos. Celso Olivete Júnior.

Introdução à Programação

Compiladores Aula 6. Celso Olivete Júnior.

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

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

Linguagens de Programação

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

Transcrição:

Compiladores - Análise Preditiva Fabio Mascarenhas 205.2 http://www.dcc.ufrj.br/~fabiom/comp

Analisador Preditivo Uma simplificação do parser recursivo com retrocesso que é possível para muitas gramáticas são os parsers preditivos Um parser preditivo não tenta alternativas até uma ser bem sucedida, mas usa um lookahead na entrada para prever qual alternativa ele deve seguir Só falha se realmente o programa está errado! Quanto mais tokens à frente podemos examinar, mais poderoso o parser Classe de gramáticas LL(k), onde k é quantos tokens de lookahead são necessários

Voltando a TINY Vamos ver quantos tokens de lookahead precisamos para prever cada opção: S -> CMDS CMDS -> CMD { ; CMD } CMD -> if EXP then CMDS [ else CMDS ] end repeat CMDS until EXP id := EXP read id write EXP EXP -> SEXP { < SEXP = SEXP } SEXP -> TERMO { + TERMO - TERMO } TERMO -> FATOR { * FATOR / FATOR } FATOR -> "(" EXP ")" num id

Voltando a TINY Vamos ver quantos tokens de lookahead precisamos para prever cada opção: S -> CMDS CMDS -> CMD { ; CMD } CMD -> if EXP then CMDS [ else CMDS ] end repeat CMDS until EXP id := EXP read id write EXP EXP -> SEXP { < SEXP = SEXP } SEXP -> TERMO { + TERMO - TERMO } TERMO -> FATOR { * FATOR / FATOR } FATOR -> "(" EXP ")" num id

Voltando a TINY Vamos ver quantos tokens de lookahead precisamos para prever cada opção: S -> CMDS CMDS -> CMD { ; CMD } CMD -> if EXP then CMDS [ else CMDS ] end repeat CMDS until EXP id := EXP read id write EXP EXP -> SEXP { < SEXP = SEXP } SEXP -> TERMO { + TERMO - TERMO } TERMO -> FATOR { * FATOR / FATOR } FATOR -> "(" EXP ")" num id

Voltando a TINY Vamos ver quantos tokens de lookahead precisamos para prever cada opção: S -> CMDS CMDS -> CMD { ; CMD } CMD -> if EXP then CMDS [ else CMDS ] end repeat CMDS until EXP id := EXP read id write EXP EXP -> SEXP { < SEXP = SEXP } SEXP -> TERMO { + TERMO - TERMO } TERMO -> FATOR { * FATOR / FATOR } FATOR -> "(" EXP ")" num id

Voltando a TINY Vamos ver quantos tokens de lookahead precisamos para prever cada opção: S -> CMDS CMDS -> CMD { ; CMD } CMD -> if EXP then CMDS [ else CMDS ] end repeat CMDS until EXP id := EXP read id write EXP EXP -> SEXP { < SEXP = SEXP } SEXP -> TERMO { + TERMO - TERMO } TERMO -> FATOR { * FATOR / FATOR } FATOR -> "(" EXP ")" num id

Voltando a TINY Vamos ver quantos tokens de lookahead precisamos para prever cada opção: S -> CMDS CMDS -> CMD { ; CMD } CMD -> if EXP then CMDS [ else CMDS ] end repeat CMDS until EXP id := EXP read id write EXP EXP -> SEXP { < SEXP = SEXP } SEXP -> TERMO { + TERMO - TERMO } TERMO -> FATOR { * FATOR / FATOR } FATOR -> "(" EXP ")" num id

Voltando a TINY Vamos ver quantos tokens de lookahead precisamos para prever cada opção: S -> CMDS CMDS -> CMD { ; CMD } CMD -> if EXP then CMDS [ else CMDS ] end repeat CMDS until EXP id := EXP read id write EXP EXP -> SEXP { < SEXP = SEXP } SEXP -> TERMO { + TERMO - TERMO } TERMO -> FATOR { * FATOR / FATOR } FATOR -> "(" EXP ")" num id

Voltando a TINY Vamos ver quantos tokens de lookahead precisamos para prever cada opção: S -> CMDS CMDS -> CMD { ; CMD } CMD -> if EXP then CMDS [ else CMDS ] end repeat CMDS until EXP id := EXP read id write EXP EXP -> SEXP { < SEXP = SEXP } SEXP -> TERMO { + TERMO - TERMO } TERMO -> FATOR { * FATOR / FATOR } FATOR -> "(" EXP ")" num id TINY é LL()!

Analisador Recursivo Preditivo O analisador recursivo preditivo é parecido com o recursivo com retrocesso, mas ao invés de try nas escolhas usa a informação de lookahead Um terminal continua testando o token atual, e avançando para o próximo token se o tipo for compatível, mas lança um erro se não for Uma sequência simplesmente executa cada termo da sequência Uma alternativa usa o token de lookahead como índice de um switch-case, e o conjunto de lookahead de cada alternativa forma os casos dela;

Analisador Recursivo Preditivo Um opcional verifica se o token de lookahead está no conjunto do seu termo, caso esteja segue executando ele, senão pula Uma repetição repete os seguintes passos: verifica se o token de lookahead está no conjunto de seu termo, se estiver executa ele, se não pára a repetição Um não-terminal vira um procedimento separado, e executa o procedimento correspondente Construir a árvore sintática é simples, já que não há retrocesso, e pode-se sempre adicionar nós à arvore atual

Recursivo Preditivo $parser(termo, arvore) dá o código para análise sintática do termo, guardando o resultado em um ou mais nós de arvore caso seja bem sucedido $parser(terminal, arvore) = ($arvore).child(match($terminal)); $parser(t...tn, arvore) = $parser(t, arvore)... $parser(tn, arvore) $parser(naoterm, arvore) = ($arvore).child(naoterm());

Retrocesso Preditivo $parser(termo, arvore) dá o código para análise sintática do termo, guardando o resultado em um ou mais nós de arvore caso seja bem sucedido $parser(t t2, arvore) = { switch(lookahead.tipo) { // { c,..., cn } é o conjunto de lookahead de t case c :... case cn : $parser(t, arvore); default: $parser(t2, arvore); } }

Retrocesso Local $parser(termo, arvore) dá o código para análise sintática do termo, guardando o resultado em um ou mais nós de arvore caso seja bem sucedido $parser([ termo ], arvore) = switch(lookahead.tipo) { // { c,..., cn } é o conjunto de lookahead de termo case c :... case cn : $parser(termo, arvore); } $parser({ termo }, arvore) = // { c,..., cn } é o conjunto de lookahead de termo while(lookahead.tipo == c... lookahead.tipo == cn ) { $parser(termo, arvore); }

Analisador preditivo para TINY O analisador recursivo preditivo é bem mais simples do que o analisador com retrocesso Pode ler os tokens sob demanda: só precisa manter um token de lookahead Não precisamos de nada especial para detecção de erros: os pontos de falha são pontos de erro, e temos toda a informação necessária lá Temos os mesmos problemas com recursão à esquerda

Recursão à esquerda Outra grande limitação dos analisadores recursivos é que as suas gramáticas não podem ter recursão à esquerda A presença de recursão à esquerda faz o analisador entrar em um laço infinito! Precisamos transformar recursão à esquerda em repetição Fácil quando a recursão é direta: A -> A x... A xn y... yn A -> ( y... yn ) { x... xn }

Eliminação de recursão sem EBNF A -> A x... A -> A xn A -> y... A -> yn A -> y A... A -> yn A A -> x A... A -> xn A A ->