Bottom-up Parsing
Objetivo
® Redução da cadeia ao símbolo inicial da GramáticaPasso: reduzir uma sub-cadeia a um não-terminal - aquele que a tem como lado direito de uma regra
Þ
constróem uma derivação mais à direita (ordem reversa) - dmd
EX1:
S ® aAcBe
A ® Ab/b
B ® d
sent: abbcde
Reduções:
Derivação mais à direita:
S ® aAcBe ® aAcde ® aAbcde ® abbcde
Handle - (a) lado direito de uma regra, (b) cuja redução representa um passo em direção à construção de uma dmd (no Ex1, passo 2, 'b' não é handle)
Definição: Um handle de uma forma sentencial à direita, g , consiste de:
Isto é, se S ® a Aw ® a b w, então
A ® b , na posição que segue a , é um handle de a b w [w Î VT*]
OBS: Se G é ambígua, uma forma sentencial pode Ter mais de um handle.
No Ex1:
abbcde tem como handle A ® b - (posição 2)
aAbcde tem como handle A ® Ab - (posição 2)
aAcde tem como handle B ® d - (posição 4)
aAcBe tem como handle S ® aAcBe - (posição 1)
Ex2: E ® E + E |E * E| (E) | id Ambígua
2 handles para E + E * id: id * E + E
IMPLEMENTAÇÃO DO SHIFT-REDUCE
Dois problemas:
Uso de uma Pilha:
Repetir o ciclo até (a) uma situação de erro ou (b) terminar entrada e pilha = S.
No Ex2:
OBS:
dmd Þ handle sempre no topo.
4 operações:
Como decidir sobre SHIFT ou REDUCE?
Þ
2 Técnicas: Precedência de Operadores e L.R.- conflito shift/reduce: o que fazer com o símbolo do topo da pilha?
- conflito reduce/reduce: qual regra aplicar?
Þ
Gramáticas "não-LR"
Exemplo de conflito shif/reduce:
Cmd
® if Expr then Cmd |If Expr then Cmd else Cmd |
Outros - Cmd
Gramáticas Ambíguas não são LR
Exemplo de conflito reduce/reduce:
Hipótese: Análise Léxica retorna "id" para todo identificador.
Reduzir id2 via 5 ou 7?
Informações T.S.
Alternativa: Outra classe, procid, em 1, e A.L. decide se id ou procid.
Þ
Necessário olhar aquem do handle (id) para saber qual redução fazer: verifica 3o símbolo da pilha (id ou procid).