Bottom-up Parsing

Objetivo® Redução da cadeia ao símbolo inicial da Gramática

Passo: 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:

  1. b por A ou d por B?
  2. Ab por A ou b por A?
  3. D por B ® aAcBe
  4. aAcBe por S ® S

 

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:

  1. Determinar o handle
  2. Se mais de uma regra com mesmo lado direito, decidir à qual reduzir

 

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.

  1. cmd ® id (param_list)
  2. cmd ® Expr:= Expr
  3. param_list ® param_list, param
  4. param_list ® param
  5. param ® id
  6. Expr ® id (expr_list)
  7. Expr ® id
  8. expr_list ® expr_list, expr
  9. expr_list ® expr

 

 

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).