Vous êtes sur la page 1sur 24

Profa. Valria D.

Feltrim
DIN UEM

Este material foi gentilmente cedido pelo Prof. Thiago A. S. Pardo, ICMC-USP/So Carlos

ASD preditiva
Sabe-se de antemo qual regra aplicar
Gramticas LL(1)

Dois mtodos:
ASD preditiva recursiva
ASD preditiva no recursiva

Um analisador sinttico recursivo um conjunto de


procedimentos possivelmente recursivos, um para
cada no terminal a ser derivado
Tambm chamado de analisador de descida recursiva

Se G LL(1), a construo dos procedimentos


automtica
Caso contrrio, ainda possvel a construir um analisador
de descida recursiva, mas o processo deixa de ser
automtico

Exemplo
<E>::=<T>+<E> | <T>
<T>::=<F>*<T> | <F>
<F>::=a | b | (<E>)

procedimento E
incio
T;
se (token='+) ento
prox_token();
E;
fim

procedimento T
incio
F;
se (token =*) ento
prox_token();
T;
fim

procedimento ASD
incio
prox_token();
E;
fim
procedimento F
incio
se (token ='() ento
prox_token();
E;
se (token =')) ento
prox_token()
seno ERRO;
seno se (token =a)
ou (token =b)
ento prox_token()
seno ERRO;
fim

Mtodo formal para gerar os procedimentos


Regras de transformao: mapeamento das regras de um no
terminal em grafos sintticos
Tambm podem ser usados diagramas de transio (Aho et al.,
1995, pg82)

Regras de traduo: mapeamento dos grafos em procedimentos

Exemplo
<S> ::= a<A>d
<A> ::= c<A> | e<B>
<B> ::= f | g

Grafo sinttico

S:
Smbolo
terminal

A
Smbolo no
terminal

<S> ::= a<A>d


S

procedimento S
incio
se (token =a) ento
prox_token();
A;
se (token =d)
ento prox_token()
seno ERRO;
seno ERRO;
fim

<A> ::= c<A> | e<B>


A

procedimento A
incio
se (token =c) ento
prox_token();
A;
seno se (token =e) ento
prox_token();
B;
seno ERRO;
fim

<B> ::= f | g
B

f
g

procedimento B
incio
se (token =f) ou (token =g)
ento prox_token()
seno ERRO;
fim

Programa principal
procedimento ASD
incio
prox_token();
S;
se (terminou_cadeia)
ento SUCESSO
seno ERRO
fim

Geralmente, concatenamos um
smbolo $ no fim da cadeia
antes do seu reconhecimento.
terminou_cadeia a verificao
da condio token = $

Regras de transformao
Regras gramaticais

grafos sintticos

1. Toda regra da gramtica mapeada em um grafo


2. Toda ocorrncia de um terminal x corresponde ao
seu reconhecimento na cadeia de entrada e a
leitura do prximo smbolo dessa cadeia
x

3. Toda ocorrncia de um no-terminal A


corresponde a anlise imediata de A
A

4. Alternativas so representadas como


A
B
C

5. Uma seqncia A B C mapeada em


A

6. A forma A* representada por

Exerccio

<A> ::= x | (<B>)


<B> ::= <A><C>
<C> ::= +<A><C> |

x
(
B

Os grafos sintticos podem ser simplificados


transformar chamadas recursivas em loops

Os grafos simplificados devem ser equivalentes


aos grafos originais
As simplificaes nos grafos vo se refletir no
cdigo gerado para cada grafo

Simplifique o grafo abaixo


C

Regras de traduo
Grafos sintticos

procedimentos

1.

Reduzir o nmero de grafos: unio de grafos para


maior simplicidade e eficincia

2.

Escrever um procedimento para cada grafo

Faa a unio dos grafos abaixo. Se possvel,


simplifique aps a unio.
E

T
E

A seqncia
A

origina o procedimento
incio
A;
B;
C;
fim

A alternativa
A
B
C

origina o procedimento
incio

fim

se (token est em Primeiro(A)) ento A

seno se (token est em Primeiro(B)) ento B


seno se (token est em Primeiro(C)) ento C

Uma repetio
A

origina o procedimento
incio
fim

enquanto (token est em Primeiro(A)) faa


A;

O terminal
x

origina
incio
se (token = x)
ento prox_token()
seno ERRO;
fim

O no terminal
A

origina
incio
A;
fim

Exerccio: fazer o(s) procedimento(s) para os grafos


sintticos
Se possvel, reduza o no de grafos
A

x
(

procedimento A
incio
se (token =x) ento prox_token()
seno se (token =() ento
faa
prox_token();
A;
at (token <>+);
se (token =))
ento prox_token()
seno ERRO;
seno ERRO;
fim

x
(

+
A

Vous aimerez peut-être aussi