Você está na página 1de 9

Anlise Sinttica: anlise ascendente (Bottom-Up)

Analisadores Bottom-Up
Introduziremos o estilo geral de anlise sinttica bottom-up, conhecido como anlise de empilhar e reduzir. Implementaes:
Anlise sinttica de precedncia de operadores Anlise LR (muito mais genrica)

A anlise gramatical de empilhar e reduzir tenta construir uma rvore gramatical para uma cadeia de entrada comeando pelas folhas e trabalhando rvore acima em direo raiz.
Ex: a sentena abbcde pode ser reduzida a S assim: S ::= aABe abbcde A ::= Abc | b aAbcde B ::= d aAde aABe S (raz)

Anlise LR
Analisadores LR podem ser construdos para reconhecer virtualmente todas as construes de ling. de programao sobre GLCs. O mtodo de decomposio LR o mais geral entre os mtodos sem retrocesso de empilhar e reduzir. A classe de gramticas que podem ser decompostas por mtodos LR um superconjunto das gramticas que podem ser decompostas por mtodos preditivos. Um analisador LR pode detectar um erro sinttico to cedo quanto possvel Desvantagem: muito trabalhoso construir um analisador LR manualmente, para uma gramtica tpica de ling. de prog.

Esquema de Analisador LR
Entrada a1 ... ai ... an $

Pilha

Sm Xm Sm-1 Xm-1 ... S0

Analisador LR

Sada

Ao

Desvio

Tabela Sinttica

Anlise SLR
Existem 3 mtodos:
LR Simples (SLR): usa itens do tipo LR(0) Cannico: usa itens do tipo LR(1) LALR (lookahead LR) : usa itens do tipo LR(1) (otimizado)

Um item LR(0) uma produo com um ponto em alguma posio no lado direito. Por exemplo, A ::= XYZ possui 4 itens LR(0):
A A A A -> -> -> -> .XYZ X.YZ XY.Z XYZ.

A idia construir, a partir da gramtica, um AFD que reconhea prefixos viveis. Agrupamentos de itens LR(0) formam os estados do AFD. Agrupamentos por operaes de fechamento (Drago pg. 97).

Construo da Tabela SLR


Algoritmo:
1.
a.

Construir AFD reconhecedor de prefixos viveis.


Cada estado uma coleo de itens LR(0)

2.
a. b.

Aes sintticas para o estado Ii so determinadas como segue


Se A ::= .a estiver em Ii e desvio(Ii,a) = Ij ao[Ii, a ] = EMPILHAR Ij Se [A ::= .] estiver em Ii REDUZIR por A ::= , para todo a em Follow(A), se A S Se [S ::= S.] estiver em Ii => ao[Ii, $ ] = ACEITAR Se houver conflito, a gramtica no SLR

c. d.

3.

Para A no-terminal, se desvio(Ii, A) = Ij (transio no AFD) ento desvio[Ii, A] = Ij (tabela) Todas as entradas no definidas por 2. e 3. so tornadas erro Estado inicial do analisador sinttico aquele que contm S ::= .S

4. 5.

Autmato SLR (exemplo)


G = ( {S, S}, {i, +, -}, P, S ) P = { 1. S ::= S 2. S ::= SS+ 3. S ::= SS4. S ::= i } First S = {i} S = {i} Follow S = {$} S = {i,+,-,$}

I1

S I0 S ::= .S -------------S ::= .SS+ S ::= .SSS ::= .i i

S ::= S. S ::= S.S+ S ::= S.S-------------S ::= .SS+ S ::= .SSS ::= .i S

S ::= SS+. +

I4

S ::= SS-. I3 S ::= SS.+ S ::= SS.S ::= S.S+ S ::= S.S-------------S ::= .SS+ S ::= .SSS ::= .i

I5

i i

S ::= i. I2

Tabela SLR (exemplo)


G = ( {S, S}, {i, +, -}, P, S ) P = { 1. S ::= S 2. S ::= SS+ 3. S ::= SS4. S ::= i } First S = {i} S = {i} Follow S = {$} S = {i,+,-,$}

Ao + I0 I1 I2 I3 I4 I5 REDZ 4 EMP I4 REDZ 2 REDZ 3 REDZ 4 EMP I5 REDZ 2 REDZ 3 i EMP I2 EMP I2 REDZ 4 EMP I2 REDZ 2 REDZ 3 $ ACEITA REDZ 4 REDZ 2 REDZ 3 S -

Desvio S I1 I3 I3 -

OBS: REDZ x reduzir pela regra x da gramtica EMP Ij - empilhar o smbolo de entrada e o estado Ij (ser prximo estado)

Exerccio:
1.

Construir a tabela sinttica SLR para a gramtica abaixo.


G = ( {S, E, T, F}, {i, +, *, (, )}, P, S ) P = { 1. S ::= E 2. E ::= E*T 3. E ::= T 4. T ::= T+F 5. F ::= (E) 6. F :: i 7. T ::= F}

2.

Realizar o processamento da entrada ii-i-i usando a gramtica do exemplo anterior (manter registro da pilha, dos smbolos consumidos da entrada e das aes executadas). Lembrando que:
EMP Ii : empilha o smbolo corrente seguido do prximo estado Ii REDZ [A ::= ]: desempilha 2| | smbolos, revelando o estado Ii. Empilha, em seguida, A seguido de Ij = desvio [Ii, A]