Docsity
Docsity

Prepare-se para as provas
Prepare-se para as provas

Estude fácil! Tem muito documento disponível na Docsity


Ganhe pontos para baixar
Ganhe pontos para baixar

Ganhe pontos ajudando outros esrudantes ou compre um plano Premium


Guias e Dicas
Guias e Dicas


Análise Sintática Descendente Não Recursiva: ASD, Notas de aula de Informática

Este documento explica o processo de análise sintática descendente não recursiva (asd) para gramáticas ll(1), incluindo passos para construção de grafos sintáticos, programa principal e procedimento, e solução de ambiguidade. O documento também inclui um exercício para reconhecer uma cadeia de símbolos.

Tipologia: Notas de aula

Antes de 2010

Compartilhado em 01/12/2009

ygor-dos-santos-luz-3
ygor-dos-santos-luz-3 🇧🇷

4.7

(3)

55 documentos

1 / 35

Toggle sidebar

Esta página não é visível na pré-visualização

Não perca as partes importantes!

bg1


Este material é baseado nos materiais de autoria da profa. V. Feltrim
pf3
pf4
pf5
pf8
pf9
pfa
pfd
pfe
pff
pf12
pf13
pf14
pf15
pf16
pf17
pf18
pf19
pf1a
pf1b
pf1c
pf1d
pf1e
pf1f
pf20
pf21
pf22
pf23

Pré-visualização parcial do texto

Baixe Análise Sintática Descendente Não Recursiva: ASD e outras Notas de aula em PDF para Informática, somente na Docsity!

Este material é baseado nos materiais de autoria da profa. V. Feltrim

 ASD preditiva  Gramáticas LL(1)  Dado um único símbolo da cadeia de entrada, sabe-seque regra da gramática aplicar  Restrições: sem recursividade à esquerda; para um nãoterminal, não há regras que derivem o mesmo símboloterminal como primeiro símbolo da cadeia  ASD preditiva recursiva  Regras gramaticais  grafos sintáticos  procedimentos recursivos

 Passo 1: a gramática é LL(1)? Se não,transforme-a ::= ::= + | λ ::= a | b

 Passo 1: a gramática é LL(1)? Se não,transforme-a ::= ::= + | λ ::= a | b sim, é LL(1)  G r a m á t i c a s L L ( 1 )  D a d o u m ú n ic o s ím b o lo d a c a d e ia d e e n tra d a , s a b e -s e q u e re g ra d a g ra m á tic a a p lic a r  R e s triç õ e s : s e m re c u rs iv id a d e à e s q u e rd a ; p a ra u m n ã o te rm in a l, n ã o h á re g ra s q u e d e riv e m o m e s m o s ím b o lo te rm in a l c o m o p rim e iro s ím b o lo d a c a d e ia

 Passo 2: construa os grafos sintáticos ::= ::= + | λ ::= a | b E T E’ E E’

T a b É possível reduzir?

 Passo 2: construa os grafos sintáticos ::= ::= + | λ ::= a | b E

  • a b Grafo reduzido

 Passo 3: construa o programa principal e o procedimento para E E

  • a b procedimento Ebegin se (token=‘a’) ou (token=‘b’) então prox_token() senão ERRO;enquanto (token=‘+’) faça prox_token();se (token=‘a’) ou (token=‘b’) então prox_token() senão ERRO; end procedimento ASDbegin prox_token();E();se (terminou_cadeia) então SUCESSOsenão ERRO; end

 Alternativa para os procedimentos recursivos  Gramáticas LL(1)  O que é a recursividade? Como eliminá-la?

início da pilha (delimitador) 

 Funcionamento  Um símbolo não terminal a ser expandido éempilhado ::= ::= + | λ ::= a | b E $ Pilha topo po

 Ao expandir um não terminal no topo da pilha, ele édesempilhado e seu lado direito da regra gramatical éempilhado (em sentido inverso) para expansão  O sentido inverso garante a ordem natural de expansão daesquerda para a direita ::= ::= + | λ ::= a | b E $ Pilha topo T E’ $ Pilha topo

 Considere X o topo da pilha e ‘a’ o símbolo inicial da cadeiade entrada  Possibilidades durante a análise:

Se X = a = $ , então o analisador termina a análise com sucesso

Se X = a  $ , então o analisador desempilha X e consome o símbolo inicial da cadeia

Se X é não terminal, então o analisador procura na tabelasintática a regra de X que produz o símbolo inicial da cadeia eempilha seu lado direito (em sentido inverso)

Se X é terminal e é diferente de ‘a’ ou se X é não terminal e nãohá regra cuja derivação produza ‘a’, então ocorreu um erro

 Algoritmo de análise sintática descendente não recursiva empilhe um símbolo delimitador ($) e o símbolo inicial da gramática;concatene ao final da cadeia um símbolo delimitador ($);faça p apontar para o primeiro símbolo da cadeia; repetir X = símbolo no topo da pilha; a = símbolo apontado por p ; se (X for um terminal ou o símbolo delimitador) então se X=a então desempilhar X;avançar p ; senão ERRO; senão /X é um não terminal/ se (existe na tabela sintática uma regra de X que produza a) então desempilhar X;empilhar em sentido inverso o lado direito da regra selecionada; senão ERRO; até que X=símbolo delimitador /pilha está vazia/

 Exemplo ::= ::= + | λ ::= a | b Reconhecer a*b T → b T → a T E’ → λ E’ → +E E’ E → TE’ E → TE’ **E $

b a** Tabela sintática ERRO *b$ $E’

ab$ $E’a T  a ab$ $E’T E  TE’ a*b$ $E Regra Cadeia Pilha A cadeia não pertence à linguagem!

 Exercício: reconheça a cadeia 01012 ::= 0 | 1 ::= 1 | 2 ::= 0 | 2 B → 2 A → 2 2 B → 0A B A → 1B A S → 1B S → 0A S 1 0 Tabela sintática