Você está na página 1de 25

Tipos de Analisadores Descendentes

Análise Sintática Descendente (Top-Down)

Thierson Couto Rosa

Instituto de Informática
Universidade Federal de Goiás

26 de maio de 2010

Thierson Couto Rosa Análise Sintática Descendente (Top-Down)


Tipos de Analisadores Descendentes

Análise Descendente

Definição (Top-Down)
A análise sintática descendente consiste na construção ou na
simulação da construção de uma árvore gramátical para uma dada
cadeia de entrada, iniciando pela raiz da árvore que corresponde ao
símbolo inicial, até obter as folhas da árvore que correspondem aos
tokens encontrados na entrada.

Thierson Couto Rosa Análise Sintática Descendente (Top-Down)


Tipos de Analisadores Descendentes

Tipos de Analisadores Descendentes

Tipos de Analisdores Descendentes


Analisador descendente com retrocesso.
Análisadores preditivos (sem retrocesso).

Thierson Couto Rosa Análise Sintática Descendente (Top-Down)


Tipos de Analisadores Descendentes

Tipos de Analisadores Descendentes

Analisador com Retrocesso


Ex.: Considere a gramática :
S → cAd, A → ab | a
Considere w = cad

A primeira tentativa de expandir A com ab falha. Um retrocesso ao


último não-terminal expandido (A) é feito e finalmente a expansão
com a combina com a entrada.

Thierson Couto Rosa Análise Sintática Descendente (Top-Down)


Tipos de Analisadores Descendentes

Tipos de Analisadores Descendentes

Analisador sem Retrocesso ou Preditivo


Consegue decidir qual produção escolher para expandir a
derivação a cada passo.
Toma como base para a decisão o próximo símbolo na entrada.
Algumas características de uma gramática impedem o
desenvolvimento de analisadores preditivos para a gramática:
Recursividade à esquerda.
Não fatoração à esquerda. Ex.:A → abC | abD.
Ambiguidade.

Thierson Couto Rosa Análise Sintática Descendente (Top-Down)


Tipos de Analisadores Descendentes

Análise Descendente Preditiva

Gramáticas LL(k)
Gramáticas LL(k) permitem o desenvolvimento direto de um
analisador sintático preditivo. O primeiro L significa que a
análise é feita varrendo-se a entrada da esquerda para direita.
O segundo L indica que uma derivação mais a esquerda é
simulada em cada passo e o k indica o número máximo de
próximos tokens na entrada que podem ser considerados para
decidir a expansão em cada passo.

Thierson Couto Rosa Análise Sintática Descendente (Top-Down)


Tipos de Analisadores Descendentes

Gramáticas LL(1)

Exemplo
Dada a gramática:
E → T E0
E 0 → +T E 0
E0 → ε
T → FT0
T 0 → ∗F T 0
T0 → ε
F → (E)
F → id

Thierson Couto Rosa Análise Sintática Descendente (Top-Down)


Tipos de Analisadores Descendentes

Análise Descendente Preditiva

Tabela Sintática LL(1)


Tabela sintática LL(1) mostra para cada par < não-terminal,
próximo-token > qual a produção que deve ser utilzada para
expandir o não-terminal.
As etradas em branco da tabela correspondem a erros
sintáticos.
As tabelas LL(1) funcionam como algoritmos para
implementar analisadores preditivos para as gramáticas LL(1).

Thierson Couto Rosa Análise Sintática Descendente (Top-Down)


Tipos de Analisadores Descendentes

Análise Descendente

Tabela Sintática
Tabela sintática correspondente à gramática do exemplo do
anterior

Figura: Tabela Sintática

Thierson Couto Rosa Análise Sintática Descendente (Top-Down)


Tipos de Analisadores Descendentes

Análise Descendente

A Tabela Sintática como Algoritmo


Considere a entrada correspondente ao não-terminal E na
tabela sintática anterior:
voidE(){
if (token == id){T (); E_linha(); return; }
if (token == M AISktoken == M U LT ktoken ==
F ECHA_P AREN ){tratarErroSintatico(); }
if (token == ABRE_P AREN ){T (); E_linha(); return; }
if (token == EOF/ ∗ EOF equivalea $
natabela ∗ /)tratarErroSinttico();
}

Thierson Couto Rosa Análise Sintática Descendente (Top-Down)


Tipos de Analisadores Descendentes

Análise Descendente

Construção de Tabelas Sintáticas


Considere a gramática anterior. Temos que
E ⇒ T E 0 ⇒ F T 0 E 0 ⇒ idT 0 E 0 . Logo, na entrada [E, id] da tabela
é necessário que apareça a produção E → T E 0 .
Para cada construção da tabela é necessário saber para cada não
terminal os símbolos terminais que iniciam cadeias derivadas pelo
não terminal.

Thierson Couto Rosa Análise Sintática Descendente (Top-Down)


Tipos de Analisadores Descendentes

Análise Descendente

Conjunto Primeiro
O conjunto primeiro de um símbolo X é utilizado para se saber
todos os terminais a que iniciam cadeias de terminais derivadas

de X. Se X ⇒ ε, então ε está também em primeiro(X).

Thierson Couto Rosa Análise Sintática Descendente (Top-Down)


Tipos de Analisadores Descendentes

Análise descendente

Conjunto Seguinte
O cojunto seguinte de um não-terminal A é formado pelo
conjunto de terminais a que aparecem à direita de A em
alguma forma sentencial derivada pela gramática, isto é, se

existir αAaβ, tal que S ⇒ αAaβ para algum α e β. O
conjunto seguinte de A é util para indicar quando a produção
A → ε (se exisitir) deve ser usada.

Thierson Couto Rosa Análise Sintática Descendente (Top-Down)


Tipos de Analisadores Descendentes

Análise descendente

Construção da Tabela Sintática


Para cada produção A → α da gramática G faça:
Para cada terminal b, insira a produção A → α na entrada
M [A, b] da tabela, se b está em primeiro(A).
Se ε está em primeiro(α), então inserir A → α em toda
entrada M [A, b] da tabela, onde b pertence a seguinte(A).
Cada entrada vazia da tabela é uma situação de erro sintático.

Thierson Couto Rosa Análise Sintática Descendente (Top-Down)


Tipos de Analisadores Descendentes

Análise descendente

Escrevendo uma gramática


Eliminando a recursividade à esquerda
Uma gamática é recursiva à esquerda se ela possui um
+
não-terminal A, tal que A ⇒ Aα para alguma forma sentencial
α.
Analisadores preditivos não funcionam com gramáticas
recursivas à esquerda.
Dada uma gramática recursiva à esquerda G, podemos obter
uma nova gramática não recursiva à esquerda G’, se G não
tiver ciclos e não levar à cadeia vazia.

Thierson Couto Rosa Análise Sintática Descendente (Top-Down)


Tipos de Analisadores Descendentes

Análise descendente

Eliminando a Recursivadade à Esquerda

Entrada: Uma gramática G livre de contexto sem ciclos e -livre.


Saída: Uma gramática G0 equivalente a G, não recursiva à
esquerda.
Arranjar os não-terminais de G em alguma ordem: A1 , A2 ,
A3 ,. . . An ;
para cada i ← 1 até n faça
para cada j ← 1 até j = i − 1 faça
substitua cada produção do tipo Ai → Aj γ por produções
do tipo Ai → δ1 γ | δ2 γ |δ3 γ| . . . |δk γ, onde
Aj → δ1 |δ2 |δ3 . . . |δk
eliminar a recursividade direta das Ai produções

Thierson Couto Rosa Análise Sintática Descendente (Top-Down)


Tipos de Analisadores Descendentes

Análise descendente

Eliminando a Recursivadade à Esquerda


Ao término de cada iteração do laço mais externo, elimina-se a
reucursividade direta à esquerda, se houver. A recursividade
direta é dada por produções tipo Ai → Ai α, ao final de cada
iteração do laço mais interno.
Eliminação da recursividade direta à esquerda: dados os dois
tipos de Ai -produções: Ai → Ai α e Ai → β, onde β, não
inicia com Ai , podemos transformar a recursividade à esquerda
em recursividade à direita, substituindo as Ai -produções por:
Ai → βA0 e A0 → αA0 | ε

Thierson Couto Rosa Análise Sintática Descendente (Top-Down)


Tipos de Analisadores Descendentes

Eliminando a Recursivadade à Esquerda


Exemplo

EE+T
 A1A1+A3

ET
 A1A3

TT*F
 A3A3*A2

TF
 A3A2

F(E)
 A2(A1)

Fid
 A2id


Figura: Exemplo de eliminação Análise


Thierson Couto Rosa
de recursividade à esquerda
Sintática Descendente (Top-Down)
Tipos de Analisadores Descendentes

Eliminando a Recursivadade à Esquerda


Exemplo

EE+T
 A1A1+A3
 O
Laço
interno



ET
 A1A3
 não
é
executado

TT*F
 A3A3*A2
 para
i=1.

TF
 A3A2
 Eliminando
a

F(E)
 A2(A1)
 recursividade

Fid
 A2id
 direta
à
esquerda

de
A1



Figura: Exemplo de eliminação Análise


Thierson Couto Rosa
de recursividade à esquerda
Sintática Descendente (Top-Down)
Tipos de Analisadores Descendentes

Eliminando a Recursivadade à Esquerda


Exemplo

EE+T
 A1A1+A3
 O
Laço
interno



ET
 A1A3
 não
é
executado

TT*F
 A3A3*A2
 para
i=1.

TF
 A3A2
 Eliminando
a

F(E)
 A2(A1)
 recursividade

Fid
 A2id
 direta
à
esquerda

de
A1


A1A3
Z

Z+A3
Z|ε

A3A3*A2

A3A2

A2(A1)

A2id


Figura: Exemplo de eliminação Análise


Thierson Couto Rosa
de recursividade à esquerda
Sintática Descendente (Top-Down)
Tipos de Analisadores Descendentes

Eliminando a Recursivadade à Esquerda


Exemplo

EE+T
 A1A1+A3
 O
Laço
interno



ET
 A1A3
 não
é
executado

TT*F
 A3A3*A2
 para
i=1.

TF
 A3A2
 Eliminando
a

F(E)
 A2(A1)
 recursividade

Fid
 A2id
 direta
à
esquerda

de
A1


A1A3
Z
 para
i=2,
não
há

Z+A3
Z|ε
 Aj
tal
que
j<I.

A3A3*A2
 Para
i=3,
temos
a

A3A2
 produção
A3A2

A2(A1)
 que
deve
ser

A2id
 subsQtuída.



Figura: Exemplo de eliminação Análise


Thierson Couto Rosa
de recursividade à esquerda
Sintática Descendente (Top-Down)
Tipos de Analisadores Descendentes

Eliminando a Recursivadade à Esquerda


Exemplo

EE+T
 A1A1+A3
 O
Laço
interno



ET
 A1A3
 não
é
executado

TT*F
 A3A3*A2
 para
i=1.

TF
 A3A2
 Eliminando
a

F(E)
 A2(A1)
 recursividade

Fid
 A2id
 direta
à
esquerda

de
A1


A1A3
Z
 para
i=2,
não
há
 A1A3
Z

Z+A3
Z|ε
 Aj
tal
que
j<I.
 Z+A3
Z|ε

A3A3*A2
 Para
i=3,
temos
a
 A3A3*A2

A3A2
 produção
A3A2
 A3(A1)

A2(A1)
 que
deve
ser
 A3id

A2id
 subsQtuída.

 A2(A1)|id


Figura: Exemplo de eliminação Análise


Thierson Couto Rosa
de recursividade à esquerda
Sintática Descendente (Top-Down)
Tipos de Analisadores Descendentes

Eliminando a Recursivadade à Esquerda


Exemplo

EE+T
 A1A1+A3
 O
Laço
interno



ET
 A1A3
 não
é
executado

TT*F
 A3A3*A2
 para
i=1.

TF
 A3A2
 Eliminando
a

F(E)
 A2(A1)
 recursividade

Fid
 A2id
 direta
à
esquerda

de
A1


A1A3
Z
 para
i=2,
não
há
 A1A3
Z

Z+A3
Z|ε
 Aj
tal
que
j<I.
 Z+A3
Z|ε

A3A3*A2
 Para
i=3,
temos
a
 A3A3*A2

A3A2
 produção
A3A2
 A3(A1)

A2(A1)
 que
deve
ser
 A3id

A2id
 subsQtuída.

 A2(A1)|id



Eliminando
a

recursividade


direta
de
A3



Figura: Exemplo de eliminação Análise


Thierson Couto Rosa
de recursividade à esquerda
Sintática Descendente (Top-Down)
Tipos de Analisadores Descendentes

Eliminando a Recursivadade à Esquerda


Exemplo

EE+T
 A1A1+A3
 O
Laço
interno



ET
 A1A3
 não
é
executado

TT*F
 A3A3*A2
 para
i=1.

TF
 A3A2
 Eliminando
a

F(E)
 A2(A1)
 recursividade

Fid
 A2id
 direta
à
esquerda

de
A1


A1A3
Z
 para
i=2,
não
há
 A1A3
Z

Z+A3
Z|ε
 Aj
tal
que
j<I.
 Z+A3
Z|ε

A3A3*A2
 Para
i=3,
temos
a
 A3A3*A2

A3A2
 produção
A3A2
 A3(A1)

A2(A1)
 que
deve
ser
 A3id

A2id
 subsQtuída.

 A2(A1)|id



Eliminando
a
 A1A3
Z

recursividade

 Z+A3
Z|ε

direta
de
A3

 A3idY|(A1)Y

Y*A2|ε

A2(A1)

A2id


Figura: Exemplo de eliminação Análise


Thierson Couto Rosa
de recursividade à esquerda
Sintática Descendente (Top-Down)
Tipos de Analisadores Descendentes

Análise descendente

Fatoração à Esquerda
Gramáticas que possuem não-terminais A que levam a lados
direitos distintos mas com o mesmo prefixo: A → αγ|αβ, não
são apropriadas para analisadores preditivos porque o
analisador tem que decidir entre quais produções escolher.
Produções do tipo acima podem ser substituidas por produções
do tipo: A → αZ e Z → γ|β (fatoração à esquerda).

Thierson Couto Rosa Análise Sintática Descendente (Top-Down)

Você também pode gostar