Escolar Documentos
Profissional Documentos
Cultura Documentos
Repeat {
Compiladores
Anlise sinttica (3)
Anlise LL(1) com tabela preditiva.
X1 X2 X3 Xn
// seja
if X1 T
then // caso simples onde X1 um terminal
First() := {X1}
else { // X1 um no-terminal
First() = First{X1} \ {};
for (i=1 ; i<=n ; i++) {
if is in First(X1) and in First(X2) and in First(Xi-1)
First() := First() First(Xi) \ {}
}
}
if ( =>* )
then First() := First() {}
} until no change in any First()
proc Follow(B N)
Follow(S) := {$};
Repeat
foreach p P do {
// Varre as produes
case p == A B {
Follow(B) := Follow(B) First()\{};
if First() then
Follow(B) := Follow(B) Follow(A);
end
}
case p == A B
Follow(B) := Follow(B) Follow(A);
}
until no change in any Follow(N)
Exemplo First/Follow
S XYZ
X aXb |
Y cYZcX | d
Z eZYe | f
First(X) = {a, }
First(Y) = {c, d}
First(Z) = {e, f}
Follow(Y) = {e, f}
Follow(Z) = {$, c, d}
Gramtica LL(1)
Observaes First/Follow
S terminais entram em First e Follow.
O algoritmo de clculo de First():
Follow(X) = {c, d, b, e, f}
Condies necessrias:
sem ambigidade
sem recurso a esquerda
1. First() First() =
2. * implies !( * )
3. * implies First() Follow(A) =
Funcionamento do parser
Buffer de entrada
Sada
Tabela
Tabela Bi-dimensional:
Dimenso 1: No-terminal X
Dimenso 2: Caractere da entrada (terminal) t
A entrada (X,t) contm a regra de produo a aplicar
Dimenso 1: No-terminal X
Dimenso 2: Caractere da entrada (terminal) t
A entrada (X,t) contm a regra de produo a aplicar
S
A
B
S
A
B
S cAa
A cB | B
B bcB |
First(A) = {b, c, }
First(B) = {b, }
First(S) = {c}
Follow(S) = {$}
Follow(A) = {a}
Follow(B) = {a}
S cAa
A cB | B
B bcB |
c
S cAa
First(A) = {b, c, }
First(B) = {b, }
First(S) = {c}
Follow(S) = {$}
Follow(A) = {a}
Follow(B) = {a}
Tabela Bi-dimensional:
Tabela Bi-dimensional:
Dimenso 1: No-terminal X
Dimenso 2: Caractere da entrada (terminal) t
A entrada (X,t) contm a regra de produo a aplicar
a
S
A
B
S
A
B
AB
cAa
cB | B
bcB |
c
S cAa
S
A
B
AB
First(A) = {b, c, }
First(B) = {b, }
First(S) = {c}
Follow(S) = {$}
Follow(A) = {a}
Follow(B) = {a}
AB
B
AB
c
S cAa
A cB
First(A) = {b, c, }
First(B) = {b, }
First(S) = {c}
S
A
B
cAa
cB | B
bcB |
First(A) = {b, c, }
First(B) = {b, }
First(S) = {c}
Follow(S) = {$}
Follow(A) = {a}
Follow(B) = {a}
Follow(S) = {$}
Follow(A) = {a}
Follow(B) = {a}
b
c
ERRO S cAa
A B A cB
B bcB ERRO
First(A) = {b, c, }
First(S) = {c}
AB
B
AB
B bcB
S cAa
A cB | B
B bcB |
c
S cAa
A cB
First(A) = {b, c, }
First(B) = {b, }
First(S) = {c}
Follow(S) = {$}
Follow(A) = {a}
Follow(B) = {a}
Usando a tabela
String: cbca
Dimenso 1: No-terminal X
Dimenso 2: Caractere da entrada (terminal) t
A entrada (X,t) contm a regra de produo a aplicar
First(B) = {b, }
Dimenso 1: No-terminal X
Dimenso 2: Caractere da entrada (terminal) t
A entrada (X,t) contm a regra de produo a aplicar
S
A
B
Tabela Bi-dimensional:
S cAa
A cB | B
B bcB |
AB
a
ERRO
AB
B
AB
c
S cAa
A cB
Tabela Bi-dimensional:
Dimenso 1: No-terminal X
Dimenso 2: Caractere da entrada (terminal) t
A entrada (X,t) contm a regra de produo a aplicar
S
A
B
Tabela Bi-dimensional:
S cAa
A cB | B
B bcB |
S
A
B
Dimenso 1: No-terminal X
Dimenso 2: Caractere da entrada (terminal) t
A entrada (X,t) contm a regra de produo a aplicar
$
ERRO
ERRO
ERRO
Follow(S) = {$}
Follow(A) = {a}
Follow(B) = {a}
Pilha
S$
cAa$
Aa$
Ba$
bcBa$
cBa$
Ba$
a$
$
Entrada
Ao
cbca$
cbca$
bca$
bca$
bca$
ca$
a$
a$
$
S->cAa
casar c
A->B
B->bcB
casar b
casar c
B->
casar a
casar $, sucesso
Mais um exemplo...
TE
+TE|
T FT
T *FT |
F (E)| Id
E
Smbolo
First
Follow
E
E
T
T
F
{(, id}
{+, }
{(, id}
{*, }
{(, id}
{$, )}
{$, )}
{+, $, )}
{+, $, )}
{*, +, $, )}
Exemplo LL(1)
S XYZ
X aXb |
Y cYZcX | d
Z eZYe | f
First(X) = {a, }
First(Y) = {c, d}
First(Z) = {e, f}
Construir Tabela
Analisar abcdfcf
Follow(X) = {c, d, b, e, f}
Follow(Y) = {e, f}
Follow(Z) = {$, c, d}
Solues?
Tornar a gramtica LL(1)
Eliminar ambiguidade, recursividade... Ver os slides
seguintes.
Transformaes de GLCs
Eliminao de produes vazias
Eliminao de recursividade esquerda:
recurso direta
recurso indireta
Fatorao de uma gramtica
N = {A | A };
Repita
N = N {X | X X1...Xn P tq X1,...,Xn
N}
At que o cardinal de N no aumente.
Exemplo
A Aa | b
Com a palavra vazia
A bX
X aX |
Exemplo
E -> E+T | T
T -> T*F | F
F -> (E)| Id
A regra E -> E+T | T se torna:
E -> TE
E -> +TE|
X Xb | Xc | AB | C
Introduzir Y
X ABY | CY
Y bY | cY |
A 1 | 2
Se torna:
A X
X 1 |2
Fatorando a esquerda:
Gerenciamento de Erros
Relatar erros & recuperar
First(A)
Epsilon produo
Pop/Insert um terminal no topo da pilha.
Sumrio
Anlise top-down possibilita o reconhecimento
eficiente e simples de gramticas LL(1):
Implementao preditiva com tabela.
Baseada nos clculos dos conjuntos First/Follow
Obs: tm casos que no foram tratados (e.g. o +)
Limitao:
Quando a gramtica no LL(1) !