Você está na página 1de 12

Compiladores - Análise Ascendente

Fabio Mascarenhas – 2015.2

http://www.dcc.ufrj.br/~fabiom/comp
Análise Descendente vs. Ascendente

• As técnicas de análise que vimos até agora (recursiva com retrocesso,


recursiva preditiva, LL(1) de tabela) usam a mesma estratégia de análise: a
análise descendente, ou top-down

• Vamos ver agora uma outra estratégia de análise, a ascendente, ou bottom-up,


e as técnicas que a utilizam

• A diferença mais visível entre as duas é a forma de construção da árvore: na


análise descendente construímos a árvore de cima para baixo, começando
pela raiz, e na ascendente de baixo para cima, começando pelas folhas
Análise Ascendente

• A análise ascendente é mais complicada de implementar, tanto para um


analisador escrito à mão (o que é muito raro) quanto para geradores

• Mas é mais geral, o que quer dizer que impõe menos restrições à gramática

• Por exemplo, recursão à esquerda e prefixos em comum não são problemas


para as técnicas de análise ascendente

• Vamos usar um exemplo que deixa essas vantagens bem claras


Gramática de Expressões

• Vamos usar como exemplo uma gramática de expressões simplificada:

E -> E + T
E -> E – T
E -> T
T -> T * F
T -> F
F -> - F
F -> num
F -> ( E )

• Vamos analisar a cadeia num * num + num


Reduções

• A análise ascendente analisa uma cadeia através de reduções, aplicando as


regras da gramática ao contrário:
num * num + num
F * num + num
T * num + num
T * F + num
T + num
E + num
E + F
E + T
E
• Vamos ler a sequência de reduções de trás para a frente: E -> E + T -> E +
F -> E + num -> T + num -> T * F + num -> T * num + num -> F *
num + num -> num * num + num
Reduções vs derivações

• A sequência de reduções da análise ascendente equivale a uma derivação


mais à direita, lida de trás pra frente

• Lembre-se que, para uma gramática não ambígua, cada entrada só pode ter
uma única derivação mais à direita

• Isso quer dizer que a sequência de reduções também é única! O trabalho do


analisador é então achar qual a próxima redução que tem que ser feita a cada
passo
Exercício

• Qual a sequência de reduções para a cadeia - ( num + num ) - num

E -> E + T
E -> E – T
E -> T
T -> T * F
T -> F
F -> - F
F -> num
F -> ( E )
Análise shift-reduce

• As reduções da análise ascendente formam uma derivação mais à direita de


trás para frente

• Tomemos o passo da análise ascendente que leva a string uvw para uXw pela
redução usando uma regra X → v

• O pedaço w da string só tem terminais, pois essa redução corresponde ao


passo uXw → uvw de uma derivação mais à direita

• Isso implica que a cada passo da análise temos um sufixo que corresponde ao
resto da entrada que ainda não foi reduzido
Análise shift-reduce

• Vamos marcar o foco atual da análise com uma |

• À direita desse foco temos apenas terminais ainda não reduzidos

• À esquerda temos uma mistura de terminais e não-terminais

• Imediatamente à esquerda do foco temos um potencial candidato à redução

• O foco começa no início da entrada

• A análise shift-reduce funciona tomando uma de duas ações a cada passo:


shift, que desloca o foco para à direita, e reduce, que faz uma redução
Shift e reduce

• Shift: move o foco uma posição à direita

• A B C | x y z  A B C x | y z é uma ação shift

• Reduce: reduz o que está imediatamente à esquerda do foco usando uma


produção

• Se A  x y é uma produção, então C b x y | i j k  C b A | i j k é uma ação


reduce A  x y

• Acontece um erro sintático quando não se pode tomar nenhuma das duas
ações, e reconhecemos a entrada quando o chegamos a S |, onde S é o
símbolo inicial
Exercício

• Qual a sequência de ações para a cadeia - ( num + num ) - num

E -> E + T
E -> E – T
E -> T
T -> T * F
T -> F
F -> - F
F -> num
F -> ( E )
Implementação

• O que está à esquerda do foco pode ser implementado usando uma pilha

• O foco é o topo da pilha mais uma posição na entrada

• A ação de shift empilha o próximo token e incrementa a posição

• A ação de reduce A → w:

• Desempilha |w| símbolos (que devem formar w, ou a redução estaria errada)

• Empilha A

Você também pode gostar