Escolar Documentos
Profissional Documentos
Cultura Documentos
de análise LL(1)
• Como fazer ?
– Re-escrever gramática para satisfazer condições de LL(1)
– Calcular conjuntos First e Follow
Compiladores – Para cada produção A → α
1. Para cada a ∈First(α)
– incluir A → α em M[A,a]
Análise sintática (4) 2. Se ε ∈ First(α)
Análise ascendente – incluir A → α em M[A,b] para cada b em Follow(A)
Autômatos Empilhar/Reduzir 3. Se ε ∈ First(α) e $ ∈ Follow(A)
– incluir A → α to M[A,$]
– Todas entradas não definidas são erros
1
Redução – exemplo 1 Redução – exemplo 1
S → aABe abbcde S → aABe abbcde
A → Abc | b aAbcde A → Abc | b aAbcde
B→d B→d aAde
2
Redução – exemplo 2 Redução – exemplo 2
E→E+E E→E+E
E→E*E id + id * id E→E*E id + id * id
E → (E) | id E + id * id E → (E) | id E + id * id
E + E * id
3
Ações bottom-up: 3 problemas Ações bottom-up: 3 problemas
• Problema 1: Como decidir qual lado • Problema 1: Como decidir qual lado
direito de produção trocar pelo lado direito de produção trocar pelo lado
esquerdo (redução) ? esquerdo (redução) ?
– Ler entrada da esquerda para direita
– Em algumas situações uma escolha
aparece:
1. ler mais um caractere da entrada
ou Análise Entrada Ação
2. aplicar redução $ abc$ Ler
a$ bc$ Ler
ab$ c$ Ler
4
Parsing LR Tabela Ação/Transição (LR)
• Parser baseado em tabelas • Ação: A partir de um estado s e de um terminal t,
Estruturas de dados:
– Lê a entrada de esquerda para direita
(L) Pilha de estados {s} e símbolos Ação[s, t] indica:
– Cria derivações mais a direita (R) Tabela de ações: Action[s,t]; t ∈T – Se se faz um shift S (empilha) ou um Reduce R (reduz) ao ler o
Tabela de transições: Goto[s,X]; X ∈N símbolo ‘a’ na entrada.
• Usa um autômato finito com pilha – Caso S: indica também o estado a empilhar;
– Cada estado representa produções da • Fazer:
gramática – empilhar o estado e avançar na leitura.
– Transições são feitas a cada
terminal/não terminal – Caso R: indica também a regra a reduzir e, a seguir, aplica uma
0 * 1 0 $ Buffer de entrada Transição.
• Fazer:
t – depilhar tantos estados como símboloS reduzidoS;
– empilhar o estado alvo do Goto(topo Pilha, Símbolo reduzido).
Pilha s Parser LR Saída
$ • Transição (goto): a partir de um estado s e de um não-
terminal X, Goto[s, X] indica o próximo estado a
empilhar.
Tabela
Ação Goto
* ( ) id $ E T F * ( ) id $ E T F
0 S5 S8 2 1 0 S5 S8 2 1
Estados 1 R1 R1 R1 R1 R1 Estados 1 R1 R1 R1 R1 R1
2 S3 Ok! 2 S3 Ok!
3 S5 S8 4 3 S5 S8 4
4 R2 R2 R2 R2 R2 4 R2 R2 R2 R2 R2 Shift e empilha 8
5 S5 S8 6 1 5 S5 S8 6 1
6 S3 S7 6 S3 S7
7 R4 R4 R4 R4 R4 7 R4 R4 R4 R4 R4
8 R3 R3 R3 R3 R3 8 R3 R3 R3 R3 R3
5
Tabela Ações/Transições Análise de “(id)*id” (1/2)
Ações Terminais Goto Não-Terminais
Stack Input Action
* ( ) id $ E T F 0 ( id ) * id $ Shift S5
0 S5 S8 2 1 05 id ) * id $ Shift S8
Estados 1 R1 R1 R1 R1 R1 058 ) * id $ Reduz 3 F→→id,
pop 8, goto [5,F]=1
2 S3 Ok! Productions
051 ) * id $ Reduz 1 T→→ F,
3 S5 S8 4 1 T→F pop 1, goto [5,T]=6
4 R2 R2 R2 R2 R2 Shift e empilha 8 2 T → T*F 056 ) * id $ Shift S7
5 S5 S8 6 1 0567 * id $ Reduz 4 F→→ (T),
3 F → id
pop 7 6 5, goto [0,F]=1
6 S3 S7
4 F → (T) 01 * id $ Reduz 1 T → F
7 R4 R4 R4 R4 R4 Reduce a 4a regra pop 1, goto [0,T]=2
8 R3 R3 R3 R3 R3
01 * id $ Reduz 1 T→→F,
• Os estados devem capturar o andamento na análise de
pop 1, goto [0,T]=2 quais símbolos podem ser reduzidos.
02 * id $ Shift S3 – Vai-se dever calcular quais conjuntos de símbolos podem ser
023 id $ Shift S8 considerados como handles.
– Noção de ponto / fechamento.
0238 $ Reduz 3 F→→id,
pop 8, goto [3,F]=4
• Os gotos e as açoes vão ser definidos graças ao cálculo
0234 $ Reduz 2 T→→T * F das transições entre os estados.
pop 4 3 2, goto [0,T]=2 – Tendo analisado que tenho um handle, quais símbolos podem
02 $ Aceitar aparecer depois?
– Sucessor(.)
6
Exemplo: fechamento(S’ → • T) Sucessor(C,X)
S’ → T • É o segundo procedimento útil para montar a tabela
T→F|T*F S’ → • T –
LR
Pega em argumento um conjunto de ítens C e um símbolo X
F → id | ( T ) T→• F – Retorna um conjunto de ítens
T→• T*F – Informalmente: “mover o ponto pelo símbolo X”
* ( ) id $ T F
Productions
Reduz 1 F 0 S5 S8 Reduz
2 11
F
1 T→F
F 1: T → F • 1 R1 R1 F R1
R1 1:R1T → F •
2 T → T*F 2 S3 A
3 F → id $ Aceitar Reduz 2 3 S5 S8 4 $ Aceitar Reduz 2
4 F → (T) 2: S’ → T • 4: T → T * F • 4 R2 R2 R2 R2 R2 2: S’ → T • 4: T → T * F •
T→T• *F 5 S5 S8 6T →1 T • * F
0: S’ → • T T Reduz 3 → • T S7
6 S3
0: S’ T Reduz 3
id * F id * F
T→• F 8: F → id • T7 → • F
R4 R4 R4 R4 R4
8: F → id •
8 R3 R3 R3 R3 R3
T→• T*F 3: T → T * • F T→• T*F 3: T → T * • F
id id
F → • id F → • id id F → • *id ( ) id $ FT →F • id id
F→• (T) F→• (T) ( 5: F → ( • T ) F →0 • ( TS5) S8
F2 →1 • ( T ) ( 5: F → ( • T )
1 R1 R1 R1 R1 R1
T→• F T→• F
7: F → ( T ) • 7: F → ( T ) •
2 S3 A
) * T→• T*F ) * T→• T*F
3 S5 S8 4
( F → • id ( F → • id
Reduz 4 4 Reduce 4
R2 R2 R2 R2 R2
6: F → ( T • ) T 6: F → ( T • ) T
F→• (T) 5 S5 S8 6 1 F→• (T)
T→T• *F 6 S3 S7
T→T• *F
( 7 R4 R4 R4 R4 R4
(
8 R3 R3 R3 R3 R3
7
Construção Tabela LR(0) Observações
1. Construir F = {I0, I1, …In}
• I0 é o estado inicial
• LR(0) sempre reduz se
2. a) Se {S’ → S••} ∈Ii {A → α••} ∈Ii, sem lookahead
então ação[i,$] = aceitar • Ítens Shift e Reduce podem estar no
b) Se {A → α••} ∈Ii e A != S’ mesmo conjunto de configurações
então ação[i,_] = reduzir A → α • Pode haver mais de um ítem reduce por
c) Se {A → α••aβ} ∈Ii e Sucessor(Ii,a)=Ij conjunto
então ação[i,a] = shift j
• Problema com A → Є
3. Se Sucessor(Ii,A) == Ij então goto[i,A] = j
4. Todas as entradas não definidas são erros