Analisadores Descendentes Tabulares; Cjs First Follow

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

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

Compiladores. Análise Sintática

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

Compiladores - Análise Ascendente

Revisão de GLC e Analisadores Descendentes

Como construir um compilador utilizando ferramentas Java

Análise Sintática Bottom-up

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

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

Análise Sintática II: Analisadores Descendentes Preditivos

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

Compiladores. Exemplo First/Follow. proc Follow(B N) Gramática LL(1) proc First(α: string of symbols) Observações First/Follow

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 (Cap. 04) Análise Sintática Descendente

Compiladores. Prof. Bruno Moreno Aula 11 20/05/2011

Análise Sintática LL(1)

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

Análise Sintática Descendente

Compiladores - Análise LL(1)

Análise Sintática. Análise Sintática. Tipos de Analisadores Gramáticais: PARSERS

Compiladores - Análise LL(1)

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 Preditiva

Compiladores - Análise Preditiva

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

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

Compiladores. Parser LL 10/13/2008

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

BNF (Backus-Naur Form) Gramática Livres de Contexto / Estruturas Recursivas

Compiladores. Top-Down x Bottom Up. Plano da aula. Redução exemplo 1. Redução exemplo 1. Lembrando: construir a tabela de análise LL(1) A Abc b B d

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

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

Compiladores - Análise Recursiva

INE5317 Linguagens Formais e Compiladores AULA 9: Propriedades e Reconhecimento das Linguagens Livres do Contexto

Revisão. Fases da dacompilação

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

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

Compiladores - Análise SLR

Análise Bottom-Up. Compiladores. Parsing LR. Tabela Ações/Transições. Análise LR. Construindo tabelas LR

Compiladores - Gramáticas

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

Análise Sintática - Final

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

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. Bruno Lopes. Bruno Lopes Compiladores 1 / 30. Instituto de C

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

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

Análise Sintática. Fabiano Baldo

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

Análise Sintática Introdução

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

CP Compiladores I Prof. Msc. Carlos de Salles

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

Compiladores: P ASCAL jr

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

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

Construção de Compiladores. José de Oliveira Guimarães Departamento de Computação UFSCar - São Carlos, SP Brasil

Analisadores Sintáticos. Análise Recursiva com Retrocesso. Análise Recursiva Preditiva. Análise Recursiva Preditiva 05/04/2010

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

Conceitos de Linguagens de Programação

Compiladores Aula 4. Celso Olivete Júnior.

Se o símbolo inicial não fizer parte do conjunto de símbolos férteis, a linguagem gerada pela gramática é vazia.

Tokens, Padroes e Lexemas

Gramáticas Livres de Contexto Parte 1

Compiladores - Gramáticas

Compiladores I Notas de aula Prof. José Carlos Bins Filho

Análise Sintática (Cap. 04) Análise Sintática Ascendente Analisador Sintático LR

Compiladores. Capítulo 3: Análise Sintática Introdução

Analisadores Sintáticos LR

Linguagens Livres de Contexto

O uso de gramáticas traz vantagens para projetistas de linguagens e escritores de compiladores pelas seguintes razões:

Compiladores I. Caracterizar um método de análise bottom-up. Compreender os mecanismos básicos envolvidos no processo de análise LR.

Compiladores - Análise Léxica

GALS GERADOR DE ANALISADORES LÉXICOS E SINTÁTICOS

CAP. VI ANÁLISE SEMÂNTICA

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

COMPILADORES. Revisão Linguagens formais Parte 02. Prof. Geovane Griesang

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

Construção de Compiladores Aula 3 - Analisador Sintático

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

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 Semântica

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

Conceitos de Linguagens de Programação

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

Concurso Público para provimento de cargo efetivo de Docentes. Edital 20/2015 CIÊNCIA DA COMPUTAÇÃO II Campus Rio Pomba

Problemas decidíveis para LICs

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

Compiladores - Autômatos

tipoveiculo = (bicicleta, motociclo, motorizada, automovel, autocomreb, camioneta, autocarro, camiao, reboque); veiculo : tipoveiculo;

Aula 8: Gramáticas Livres de Contexto

Construção de Compiladores

Programação Dinâmica. Prof. Anderson Almeida Ferreira. Adaptado do material elaborado por Andrea Iabrudi Tavares

Gramáticas e Linguagens independentes de contexto

SOFTWARE PARA GERAÇÃO DE CÓDIGO FONTE A PARTIR DO REPOSITÓRIO DA FERRAMENTA CASE SYSTEM ARCHITECT

Como construir um compilador utilizando ferramentas Java

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

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

Introdução à Programação

Transcrição:

Conteúdo da aula nalisadores Descendentes Tabulares; Cjs First Follow Marcelo Johann nalisadores Descendentes Recursivos com Retrocesso Recursivos Preditivos Conjunto FIRT e Implementação nalisador Preditivo Tabular Conjuntos FIRT e FOLLOW Montagem da Tabela Implementação YCC INF01033 - Compiladores - Marcelo Johann - 2012/1 ula 08 : lide 2 Definição: Conjuntos First eja α qualquer seqüência de símbolos terminais ou não terminais First(α): Definição informal: conjunto de todos os terminais que começam qualquer seqüência derivável de α. Definição formal: e existe um t T e um β V* tal que α * t β então t First(α) e α * ε então ε First(α) C D First()={b,c,d b First()={b C c First(C)={c D d First(D)={d INF01033 - Compiladores - Marcelo Johann - 2012/1 ula 08 : lide 3 Condição para que se possa usar um analisador preditivo Informalmente: no caso que em os First() dos lados direitos das regras de produção sejam simpáticos, não terá retrocesso. Formalmente: para qualquer produção α 1 α 2... α n, quer-se: First(α 1 ) First(α 2 )... First(α n ) = Ø INF01033 - Compiladores - Marcelo Johann - 2012/1 ula 08 : lide 4 Repeat { proc First(α: string of symbols) Para todas as produções α X 1 X 2 X 3 X n do if X 1 T then // caso simples onde X 1 é um terminal First(α) := First(α) {X 1 else { // caso menos simples: X 1 é um não-terminal First(α) = First(α) First{X 1 \ {ε; for (i=1 ; i<=n ; i++) { if ε is in First(X 1 ) and in First(X 2 ) and in First(X i-1 ) First(α) := First(α) First(X i ) \ {ε if (α =>* ε) then First(α) := First(α) {ε end do until no change in any First(α) INF01033 - Compiladores - Marcelo Johann - 2012/1 ula 08 : lide 5 proc Follow( N) Follow() := {; Repeat foreach p P do { // Laço sobre as produções case p == X α // a produção termina por Follow() := Follow() Follow(X); case p == X αβ { // a produção NÃO termina por Follow() := Follow() First(β)\{ε; if ε First(β) then Follow() := Follow() Follow(X); end until no change in any Follow() INF01033 - Compiladores - Marcelo Johann - 2012/1 ula 08 : lide 6 1

Observações First/Follow ó terminais entram em First e Follow. O algoritmo de cálculo de First(α): É trivial quando α é um terminal t. varre as produções X tω quando α é um não-terminal X; é chato quando o início de uma derivação se α deriva em ε. Inclui ε apenas quando α pode derivar em ε. O algoritmo de cálculo de Follow() É reservado aos não-terminais Inclui o em alguns casos triviais ( == o start ) Varre as produções onde aparece à direita (X ωω ) É chato quando aparece no fim (ou logo antes de algo que deriva em ε) NUNC inclui ε Exemplo First/Follow XYZ INF01033 - Compiladores - Marcelo Johann - 2012/1 ula 08 : lide 7 INF01033 - Compiladores - Marcelo Johann - 2012/1 ula 08 : lide 8 Exemplo First/Follow XYZ First(X) = {a, ε Follow(X) = {c, d, b, e, f First(Y) = {c, d Follow(Y) = {e, f First(Z) = {e, f Follow(Z) = {, c, d First() = {a, c, d Follow() = { INF01033 - Compiladores - Marcelo Johann - 2012/1 ula 08 : lide 9 Gramática LL(1) Condições necessárias: sem ambigüidade sem recursão a esquerda Uma gramática G é LL(1) se e somente se Para qualquer produção do tipo: α β * t 1. First(α) First(β) = 2. α * ε implies!(β * ε) 3. α * ε implies First(β) Follow() = LL(1) = leitura Left -> right + derivação mais a esquerda (Left) + uso de 1 token lookahead. INF01033 - Compiladores - Marcelo Johann - 2012/1 ula 08 : lide 10 nálise top-down com tabela preditiva Os dois métodos apresentados até agora para fazer análise descendente (top-down) usam recursividade. Cada não-terminal tem um procedimento associado; Há chamadas com ou sem retrocesso. Para gramáticas LL1 não tem retrocesso. Chamadas recursivas usam uma pilha implícita pilha das chamadas! obrecusto! Reconhecedor preditivo com Pilha Tem um buffer de símbolos em entrada; marca seu fim. Tem um fluxo de saída; Usa uma pilha cujo fundo é marcado por Inicializada com (tart) Usa uma tabela sintática preditiva M if ( idf ) uffer de entrada Idéia: de-recursificar o procedimento: Usa-se uma pilha para armazenar os não-terminais encontrados; Usa-se uma tabela para orientar as derivações. Ver o uso de tabelas para derecursificar um algoritmo em programação dinâmica. Pilha Parser preditivo top-down aída INF01033 - Compiladores - Marcelo Johann - 2012/1 ula 08 : lide 11 Tabela INF01033 - Compiladores - Marcelo Johann - 2012/1 ula 08 : lide 12 2

Funcionamento do parser eja X o símbolo no topo da pilha eja a o símbolo de entrada (terminal/token de lookahead) a analisar Etapas: 1. e X == e a == : para e reconheceu uma sentença. 2. e X == a e a!= : desempilha X e avança de um símbolo na entrada. 3. e X é um não-terminal: Consulta a tabela M(X, a) e for vazia: ERRO e contém X UVW, então substitui na pilha X por UVW (U no topo). INF01033 - Compiladores - Marcelo Johann - 2012/1 ula 08 : lide 13 Como construir a tabela? (Re-escrever a gramática para satisfazer condições de LL(1) isso é um pre-requisito!) Calcular os conjuntos First e Follow Para cada produção α na gramática: 1. Para cada terminal a First(α) incluir a produção α em M[, a] 2. e ε First(α) incluir a produção α em M[,b] para cada b em Follow() 3. e ε First(α) e Follow() incluir a produção α em M[,] Todas as entradas não definidas são erros INF01033 - Compiladores - Marcelo Johann - 2012/1 ula 08 : lide 14 tabela preditiva M(X, t) First() = {c Follow() = { INF01033 - Compiladores - Marcelo Johann - 2012/1 ula 08 : lide 15 First() = {c Follow() = { INF01033 - Compiladores - Marcelo Johann - 2012/1 ula 08 : lide 16 c c First() = {c Follow() = { First() = {c Follow() = { INF01033 - Compiladores - Marcelo Johann - 2012/1 ula 08 : lide 17 INF01033 - Compiladores - Marcelo Johann - 2012/1 ula 08 : lide 18 3

c c bc First() = {c Follow() = { First() = {c Follow() = { INF01033 - Compiladores - Marcelo Johann - 2012/1 ula 08 : lide 19 INF01033 - Compiladores - Marcelo Johann - 2012/1 ula 08 : lide 20 c ε bc ERRO ERRO ERRO c ERRO ε bc ERRO ERRO First() = {c Follow() = { First() = {c Follow() = { INF01033 - Compiladores - Marcelo Johann - 2012/1 ula 08 : lide 21 INF01033 - Compiladores - Marcelo Johann - 2012/1 ula 08 : lide 22 Usando a tabela tring: cbca Pilha Entrada ção c bc c cbc cbc bc bc bc c ->ca casar c -> ->bc casar b casar c -> ε casar a casar, sucesso E TE E +TE ε T FT T *FT ε F (E) Id Mais um exemplo... ímbolo E E T T F First {(, id {+, ε {(, id {*, ε {(, id Follow {, ) {, ) {+,, ) {+,, ) {*, +,, ) INF01033 - Compiladores - Marcelo Johann - 2012/1 ula 08 : lide 23 INF01033 - Compiladores - Marcelo Johann - 2012/1 ula 08 : lide 24 4

XYZ Exemplo LL(1) Construir Tabela nalisar abcdfcf First(X) = {a, ε Follow(X) = {c, d, b, e, f First(Y) = {c, d Follow(Y) = {e, f First(Z) = {e, f Follow(Z) = {, c, d Observação sobre a Tabela tabela indica se há ambigüidade! Mais de uma regra numa entrada! oluções? Tornar a gramática LL(1) Eliminar ambiguidade, recursividade... Usar uma heurística para desempatar as regras Qual? Usar outros algoritmos do que os top-down! Exemplo total: if... Then... Else: i E t i E t e a E b First() = {a, c, d Follow() = { INF01033 - Compiladores - Marcelo Johann - 2012/1 ula 08 : lide 25 INF01033 - Compiladores - Marcelo Johann - 2012/1 ula 08 : lide 26 Retornando ao Gerador Yacc Leituras e Tarefas sugeridas Makefile: continuando Produções entre %% e %% %token %type, %union e yy.lval Repetir os experimentos com yacc feitos pelo professor com etapa1 Implementar uma outra gramática com o código de analisador tabular INF01033 - Compiladores - Marcelo Johann - 2012/1 ula 08 : lide 27 INF01033 - Compiladores - Marcelo Johann - 2012/1 ula 08 : lide 28 5