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

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

Compiladores Aula 6. Celso Olivete Júnior.

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

Análise Sintática LL(1)

Análise Sintática Descendente

Compiladores - Análise LL(1)

Compiladores - Análise LL(1)

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

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

Análise Sintática II: Analisadores Descendentes Preditivos

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

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

Analisadores Descendentes Tabulares; Cjs First Follow

Como construir um compilador utilizando ferramentas Java

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

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

Compiladores Aula 4. Celso Olivete Júnior.

Revisão de GLC e Analisadores Descendentes

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

Compiladores. Análise Sintática

LL Parser ( TOP-DOWN)

Linguagens de Programação Aula 5

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

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

Compiladores. Parser LL 10/13/2008

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

Análise Sintática Bottom-up

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

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

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

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

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

Compiladores - Gramáticas

Compiladores - Gramáticas

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

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

INE5317 Linguagens Formais e Compiladores. AULA 10: Anális e S intática

Análise Sintática Introdução

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

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

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

Compiladores - Análise Preditiva

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

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 Ascendente

Compiladores - Análise Ascendente

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

Paradigmas de Linguagem de Programação

Analisadores Sintáticos LR

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

Python e sua sintaxe LNCC UFRJ

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

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

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

Recursividade. Prof. Jesus José de Oliveira Neto

Compiladores - Especificando Sintaxe

Compiladores - Análise SLR

Compiladores - Análise Preditiva

DEP. INFORMÁTICA - UNIVERSIDADE DA BEIRA INTERIOR

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

Revisão. Fases da dacompilação

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

Marcos Castilho. DInf/UFPR. 21 de março de 2019

Folha 4.1 Análise sintática descendente

DEP. INFORMÁTICA - UNIVERSIDADE DA BEIRA INTERIOR

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

Compiladores Análise Semântica

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

Recursividade. Métodos iterativos. Prof. Cesar Augusto Tacla. Métodos iterativos utilizam estruturas de repetição

Compiladores Análise Semântica

Aspectos do analisador sintático Usabilidade da Dias de atraso

Linguagens Livres de Contexto

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

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

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

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

Conceitos de Linguagens de Programação

Capítulo II Gramáticas

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

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

Linguagens de Domínio Específico

Capítulo II Gramáticas

Compiladores - Análise Recursiva

Análise Sintática - Final

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

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

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

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

Linguagens Formais e Autômatos

Linguagens de Domínio Específico

Conceitos de Linguagens de Programação

Árvores & Árvores Binárias

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

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

Compiladores. Análise Léxica

LINGUAGEM LIVRE DE CONTEXTO GRAMÁTICA LIVRE DE CONTEXTO

Introdução à Programação

Transcrição:

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

Análise Sintática Análise sintática descendente Constrói a árvore de derivação de cima para baixo, da raíz para as folhas, criando os nós da árvore em pré ordem Produz uma derivação mais à esquerda para uma cadeia de entrada Exercício: mostre a árvore sintática descendente para a cadeia id+id*id considerando a gramática: E > T E' E' > +TE' ℇ T > FT' T' > *FT' ℇ F > (E) id

Análise Sintática Descendente Recursiva (ASDR) Um método de ASDR consiste em um conjunto de procedimentos, um para cada não terminal da gramática A execução começa com o (procedimento do símbolo) nãoterminal que representa o símbolo inicial da gramática A execução avança caracter por caracter a medida que os símbolos são reconhecidos. A execução indica um erro quando o símbolo não é reconhecido

Análise Sintática Descendente Recursiva (ASDR) Exemplo: void A(){ 1) escolha uma produção A, A > X1 X2... Xk 2) para (cada i de 1 até k) 3) se (Xi é um não terminal) 4) invocar procedimento Xi() 5) senão se (Xi==a) //a é o símbolo de entrada atual 6) avance na entrada para o próximo símbolo 7) senão /* erro */ }

Observe que gramáticas recursivas à esquerda não funcionam com o analisador sintático descendente recursvivo Exemplo: expr > expr + termo termo int expr(void) { return (expr () && require(token( + )) && termo() termo()); } Observe o loop infinito em expr()

Análise Sintática Descendente Recursiva (ASDR) Exemplo: aplicar ASDR com a entrada w=cad e a gramática: S > cad A > ab a

Durante a análise descendente, as variáveis First e Follow nos ajudam a escolher qual produção deve ser usada, com base no próximo símbolo de entrada Dada uma entrada a e o não terminal A, deve se saber qual das produções alternativas A > B1 B2 B3... deriva a seqüência que inicia por a Calcula se então os conjuntos de primeiros símbolos produzidos por todas as alternativas na gramática, ou seja, os conjuntos FIRST Durante a recuperação de erros, os valores retornados por FOLLOW podem ser usados como tokens de sincronismo

Análise Sintática First(A), onde A é qualquer cadeia de símbolos da gramática, é o conjunto de símbolos terminais que iniciam as cadeias derivadas de A Cálculo de FIRST(X): Se X é terminal, então First(X)={X} Se X é não terminal e X >Y1Y2...Yk é produção para algum k>=1, então acrescente a a First(X) se, para algum i, a estiver em First(Yi) e epsilon estiver em First(Y1)...First(Yi 1). Se epsilon está em First(Yj) para todo j=1,2,...,k então adicione epsilon a First(X) Se X >epsilon é uma produção, então acrescente epsilon a First(X)

Exemplo: A partir da gramática a seguir: COMAND > COND ITER ATRIB COND > if EXPR then COMAND ITER > repeat LISTA until EXPR while EXPR do COMAND ATRIB > id := EXPR Calcule: First(ATRIB): {id} First(ITER): {repeat, while} First(COND): {if} First(COMAND): {if, repeat, while, id}

Follow(A), para o não terminal A, é o conjunto de terminais a que podem aparecer imediamente à direita de A em alguma forma sentencial. Se A é o não terminal mais a direita em alguma forma setencial, então $ (símbolo marcador de final de sentença/arquivo) estará em Follow(A) Para calcular Follow: Coloque $ em Follow(S) se S é o símbolo inicial da gramática Se houver uma produção A >abc, então tudo em First(C), exceto epsilon, está em Follow(B) Se há uma produção A >ab, ou uma produção A >abc, onde o First(C) contém epsilon, então inclua o Follow(A) em Follow(B)

Exemplo: A partir da gramática a seguir: S > cad A > b a Calcule: First(S): {c} First(A):{b, a} Follow(S): {$} Follow(A): {d}

Exercício: Calcule os conjuntos Follow e First para a seguinte gramática: E > T E' E' > + T E' epsilon T > F T' T' > * F T' epsilon F > ( E ) id

Gramáticas LL(1) Gramáticas que utilizam ASDR O primeiro L refere se à maneira como os caracteres de entrada são lidos > da esquerda para a direita O segundo L indica que há uma derivação mais à esquerda O 1 indica que 1 símbolo de entrada é visto na entrada Uma gramática G é LL(1) sse qualquer regra A >B C são duas produções distintas de G tal que: 1) Dado um terminal a, ambos B e C não derivam uma mesma string que inicia com a 2)No máximo um entre B e C podem derivar a string vazia 3)Se C >epsilon em zero ou mais passos, então B não deriva qualquer string iniciando com um terminal em Follow(A). O mesmo caso ocorre para B >epsilon em zero ou mais passos

Analisadores sintáticos preditivos podem ser construídos para gramáticas LL(1) se podemos selecionar a produção adequada a partir do símbolo de entrada atual O algoritmo a seguir obtém informações dos conjuntos First e Follow e armazena em uma tabela de predição, na forma M[A,a], onde M é o nome da tabela, A é o símbolo nãoterminal e a é o símbolo terminal Idéia básica: A produção A >B é escolhida se o próximo símbolo de entrada a está em First(B) Obs: Uma complicação surge quando B >epsilon ou, mais comumemente, B >epsilon em zero ou mais passos. Nesse caso, escolhemos A >B se o símbolo de entrada atual está em Follow(A) ou se $ foi alcançado e $ está em Follow(A)

Algoritmo: construção da tabela do analisador preditivo Entrada: Gramática G Saída: Tabela M Para cada produção A >B da gramática: Para cada terminal a em First(A), adicionar A >B em M[A,a] Se epsilon está em First(B), então, para cada terminal b em Follow(A), adicionar A >B em M[A,b]. Se epsilon, está em First(B) e $ está em Follow(A), adicionar A >B em M[A,$] também. Se, após realizar os passos anteriores, não existe produção para M[A,a] então, indicar um erro (entrada vazia na tabela)

Exemplo: Considere a gramática: S > cad A > b a e seus conjuntos First e Follow: First(S): {c}; First(A):{b, a}; Follow(S): {$}; Follow(A): {d} Não terminal c d a b S S >cad A A >a A >b

Exercício: Dada a expressão: id+id*id e a gramática: E >T E' E' > + T E' epsilon T > F T' T' > * F T' epsilon F > ( E ) id Construa a tabela do analisador sintático preditivo

Analisador Sintático preditivo não recursivo É um AS que mantém, explicitamente, uma pilha de símbolos nãoterminais. Nesse caso, o AS imita uma derivação à esquerda a + b $ X Y Z $ Analisador Sint. Preditivo Tabela saída

Analisador Sintático preditivo não recursivo Algoritmo: Entrada: string w e tabela M para gramática G Saída: derivação à esquerda de w ou indicação de erro definir ip como ponteiro para o 1o. Símbolo de w definir X como ponteiro para o topo da pilha while (X >topo!=$) if (X >topo==a) //a é o símbolo apontado por ip retirar X >topo da pilha e avançar ip else if (X >topo==terminal) error(); else if (M[X >topo,a]==erro) error(); else if (M[X >topo,a]==x >Y1, Y2,..., Yk){ retirar X >topo da pilha; colocar Yk,..., Y2, Y1 na pilha } definir X como ponteiro para o topo da pilha