Anda di halaman 1dari 20

Anlise Sinttica II:

Analisadores Descendentes Preditivos

A.S.D. Preditivos

Duas formas de implementao:


dirigido

por tabela uso de uma pilha P para armazenar a parte da forma sentencial esquerda ainda no analisada (fcil de automatizar). So eficientes, pois gerenciam a pilha de ativao explicitamente.

com

procedimentos recursivos (fcil de implementar manualmente; produz cdigo mais legvel que facilita a manuteno)

A.S.D. preditivo dirigido por Tabela eof


a + b $ entrada

X Y Z Pilha

Programa genrico

sada

terminais

no terminais Tabela de Anlise

Procedimento ASD_dirigido_por_tabela P[1]S; i1; terminofalse; simboloanalex(S); repita XP[i]; se X terminal ento se X=simbolo ento desempilha [simboloanalex(S); ii-1; pilha vazia se i=0 ento termino=true] seno ERRO seno se tabela[X,simbolo] ento [P[i]Xn; P[i+1]Xn-1; ... P[i+n-1]X1; ii+n-1] seno ERRO troca o topo pela produo, at termino empilha inversamente e se simbolo $ ento ERRO avana o topo seno ACEITAR

Construo da Tabela de Anlise


Para se fazer a anlise de forma determinstica e automtica, necessrio existir uma tabela que nos d exatamente a regra que dever ser aplicada quando se tem um no terminal e um terminal a ser reconhecido. Entrada: Gramtica G Sada: Tabela de Anlise M

Algoritmo para Construo da Tabela de Anlise M


Para cada produo A -> faa:
1. 2. 3.

Para cada terminal a First () coloque A -> na entrada M[A, ] Se First () coloque A -> para M[A,b] para cada b Follow (A) Se First () e $ Follow (A) coloque A -> para M[A,$]

Calculo das relaes First e Follow


FIRST
1.

FOLLOW
1. 2.

2.

3.

Se x terminal ento First(X) = {X} Se X -> produo ento coloque no First(x) Se X no terminal e X -> Y1Y2 ...Yn produo adicione First(Yi) para First(X) se os precedentes Yjs contm em seus First

3.

Follow(S) contm $ Para A -> B tudo em First() exceto vai para Follow(B) Para A -> B ou A -> B onde First() contm , Follow(B) contm tudo que est no Follow (A)

Exemplos de construo de Tabelas de Anlise


Gramticas simples: sem Gramticas ambguas e com

1. Construo da Tabela de Anlise (com regra 1) para uma gramtica sem S 1AS | 2 BA A 3 aB | 4 C B 5 bA | 6 d C7c

Seja a gramtica S AS | BA A aB | C B bA | d Cc 1 A 2 B 3 a 4 C 5 b 6 d 7 c S A B A

First S A B C a, c, b, d a, c b, d c

Tabela de Anlise T NT a b c S 1 2 1 A 3 4 B 5 C 7

d 2 6

Gerao da Tabela de Anlise JFLAP

Anlise de abcdad
i 1 2 3 2 3 2 2 2 1 2 2 1 2 1 1 P S SA SBa SB SAb SA SC Sc S AB Ad A Ba B d X S A a B b A C c S B d A a B d cadeia abcdad abcdad abcdad bcdad bcdad cdad cdad cdad dad dad dad ad ad d d $ Regra escolhida SAS AaB --BbA --AC Cc --SBA Bd --AaB --Bd ---

2. Exemplo de gramtica para a qual preciso calcular Follows (gera um )


Gramtica ambgua: S if E then S | if E then S else S | a Eb Cadeia if b then if b then C1 else C2 Duas derivaes possveis: S if E then S b if E then S else S b C1 C2 S if E then S else S b if E then S b C1 C2

Reescrevendo para tentar tirar ambigidade

S if E then S S | a S else S | Eb

S if E then S S | a S 3else S | 4 E 5b

Entretanto, mesmo com a reescrita a gramtica tem entradas multidefinidas

First(S)={if, a} First(S)={else, } First(E)={b}

Follow(S)={else, $} Follow(S)={else, $} Follow(E)={then}


programa sendo lido

Tabela de Anlise
NT T

if 1

then else

a 2

topo da pilha

S E

3/4 5

Problema na tabela: ambigidade na aplicao das regras para o else soluo: exclui-se uma das regras
e adota-se a regra informal de associar o else com o if mais prximo
Tabela de Anlise
NT T

if 1

then else

a 2

S S E

3 5

excluiu-se a regra 4

Gerao da Tabela de Anlise JFlap

Anlise da sentena

If b then if b then a else a Mostrem a Pilha, Entrada, Regra usada

Outro exemplo
S-> a | [L] L -> S ; L | S Reescrita S-> a | [L] L -> SX X -> ; L |

Gramtica LL(1), pois tabela de anlise no tem entradas multidefinidas

Anda mungkin juga menyukai