LR(1) - LALR - Resolución de Conflictos

Anuncio
LR(1) - LALR - Resolución de Conflictos
Juan Manuel Pérez
12 de noviembre de 2013
Juan Manuel Pérez ()
LR(1) - LALR - Resolución de Conflictos
12 de noviembre de 2013
1 / 19
Parsing Top-Down
Primer tipo de parser que vimos
Gramáticas LL(1) (Left-to-right leftmost derivation)
Genera un árbol de derivación desde la raíz hacia las hojas
Aprendimos a hacer parsers recursivos e iterativos
Problemas:
No reconoce todos los lenguajes “posibles”
Las gramáticas suelen quedar feas
Juan Manuel Pérez ()
LR(1) - LALR - Resolución de Conflictos
12 de noviembre de 2013
2 / 19
Parsing Bottom-Up
Varios tipos de gramáticas (LR(0), SLR(1), LALR, LR(1))
LR = Left-to-right Rightmost derivation
Genera un árbol de derivación desde las hojas, hacia la raíz
Ventajas:
LR(1) puede reconocer todos los lenguajes “posibles” (i.e. lenguajes
libres de contexto determinísticos)
Las gramáticas suelen ser menos restrictivas
Juan Manuel Pérez ()
LR(1) - LALR - Resolución de Conflictos
12 de noviembre de 2013
3 / 19
Esquema general Bottom-Up
Para construir el parser
Armamos el autómata (LR(0), LR(1) o LALR)
Construímos dos tablas: action y goTo
Para construir el autómata LR(0), usamos dos funciones
closure : Items → Items
goTo : Items × VN
S
VT → Items
Vamos a recordarlas brevemente
Juan Manuel Pérez ()
LR(1) - LALR - Resolución de Conflictos
12 de noviembre de 2013
4 / 19
Ítem LR(0)
Recordemos que un ítem LR(0) es un elemento de la forma
A → α.β
donde A → αβ ∈ P.
Representa un posible estado del parser.
Nuestros estados del autómata consisten de un conjunto de estos
posibles estados
Juan Manuel Pérez ()
LR(1) - LALR - Resolución de Conflictos
12 de noviembre de 2013
5 / 19
Clausura de ítems LR(0)
Clausura de un conjunto de ítems I
J ← I;
repeat
for ítem A → α · Bβ ∈ J y cada producción B → γ do
agregar B → ·γ a J;
end
until No cambia J;
Devolver J;
Expande un conjunto de ítems a todos los posibles nuevos estados del
parser
Juan Manuel Pérez ()
LR(1) - LALR - Resolución de Conflictos
12 de noviembre de 2013
6 / 19
Función goTo
goTo(I, X )
J → ∅;
for cada ítem A → α · X β ∈ I do
agregar A → αX · β}) a J;
end
Devolver closure(J);
Juan Manuel Pérez ()
LR(1) - LALR - Resolución de Conflictos
12 de noviembre de 2013
7 / 19
Armado de tabla LR(0)-SLR(0)
Construir conjunto de ítems LR(0) C = {I1 . . . In };
Construimos un estado j para cada Ij ∈ C ;
for estado j do
if [A → α · aβ] ∈ Ij , a terminal, y goTo(Ij , a) = Ik then
action[j, a] = shiftk
end
if [A → α·] ∈ Ij , A 6= S ′ then
for a ∈ VT (Follow (A) en SLR) do
action[j, a] = reduce(A → α)
end
end
if [S ′ → S · $] ∈ Ij then
action[j, $] = accept
end
end
for Ij ∈ C do
if goTo[Ij , A] = Ik con A no terminal then
goTo[j, A] = k
end
end
Juan Manuel Pérez ()
LR(1) - LALR - Resolución de Conflictos
12 de noviembre de 2013
8 / 19
Algoritmo de Parseo de una cadena
Apilamos 0, el estado inicial.;
while True do
Sea ai caracter actual de la cadena, sm estado tope del stack;
switch valor de action[sm ai ] do
case shift(j)
apilar sm en el stack;
consumir ai ;
case reduce(A −→ α)
imprimir A −→ α;
Sacamos |α| estados del stack;
Sea s nuevo estado actual. Apilamos goTo(s, A);
case accept
Aceptamos la cadena;
case error
Gritamos y corremos en círculos;
endsw
end
Juan Manuel Pérez ()
LR(1) - LALR - Resolución de Conflictos
12 de noviembre de 2013
9 / 19
Un ejemplo de una gramática que no es SLR
S′ → S
S→L=R
S→R
L → ∗R
L → id
R→L
¿Dónde falla?
Juan Manuel Pérez ()
LR(1) - LALR - Resolución de Conflictos
12 de noviembre de 2013
10 / 19
Un ejemplo de una gramática que no es SLR
S′ → S
S→L=R
S→R
L → ∗R
L → id
R→L
¿Dónde falla?
Necesitamos usar un subconjunto más preciso de Follow (R) en cada
caso
Juan Manuel Pérez ()
LR(1) - LALR - Resolución de Conflictos
12 de noviembre de 2013
10 / 19
Ítem LR(1)
Un ítem LR(1) es un elemento de la forma
[A → α.β, a]
donde A → αβ ∈ P, a ∈ VT
Representa un posible estado del parser.
Lleva información adicional para evitar reducciones erróneas
Nuestros estados del autómata consisten de un conjunto de estos
posibles estados
Juan Manuel Pérez ()
LR(1) - LALR - Resolución de Conflictos
12 de noviembre de 2013
11 / 19
Clausura de ítems LR(1)
J ← I;
repeat
for ítem [A → α · Bβ, a] ∈ J y cada producción B → γ do
agregar [B → ·γ, c] a J para cada c ∈ First(βa);
end
until No cambia J;
Devolver J;
Observemos que nos guardamos sólo aquellos posibles no terminales que
puedan aparecer, no todo Follow (B)
Juan Manuel Pérez ()
LR(1) - LALR - Resolución de Conflictos
12 de noviembre de 2013
12 / 19
Función goTo
goTo(I, X )
J → ∅;
for cada ítem [A → α · X β, a] ∈ I do
agregar [A → αX · β}, a]) a J;
end
Devolver closure(J);
Juan Manuel Pérez ()
LR(1) - LALR - Resolución de Conflictos
12 de noviembre de 2013
13 / 19
Armado de tabla LR(1)
Construir conjunto de ítems LR(0) C = {I1 . . . In };
Construimos un estado j para cada Ij ∈ C ;
for estado j do
if [A → α · aβ, b] ∈ Ij , a, b terminales, y goTo(Ij , a) = Ik then
action[j, a] = shiftk
end
if [A → α·, a] ∈ Ij , A 6= S ′ , a ∈ VT then
action[j, a] = reduce(A → α)
end
if [S ′ → S · $] ∈ Ij then
action[j, $] = accept
end
end
for Ij ∈ C do
if goTo[Ij , A] = Ik con A no terminal then
goTo[j, A] = k
end
end
Juan Manuel Pérez ()
LR(1) - LALR - Resolución de Conflictos
12 de noviembre de 2013
14 / 19
Ejercicio
Armar la tabla LR(1) para:
S′ → S
S→L=R
S→R
L → ∗R
L → id
R→L
Juan Manuel Pérez ()
LR(1) - LALR - Resolución de Conflictos
12 de noviembre de 2013
15 / 19
S ′ → .S$
S → .L = R
S → .R
L→.∗R
L → .id
R → .L
S
S ′ → S.$
S → L. = R
R → L.
,$
L
,$
,$
,$
,$, =
,$, =
,$
∗
R
,$
,$
S → R.
,$
L → ∗.R
R → .L
L→.∗R
L → .id
id
=
S → L = .R
R → .L
L→.∗R
L → .id
R
S → L = R.
$
R → L.
id
$
$
$
$
L → id.
L → ∗.R
R → .L
L→.∗R
L → .id
id
id
L → id.
Juan Manuel Pérez ()
L
R → L.
∗
R
=,$
L → ∗R.
=,$
∗
L
$
,=,$
,=,$
,=,$
,=,$
,=,$
$
$
$
$
$
∗
R
L → ∗R.
$
LR(1) - LALR - Resolución de Conflictos
12 de noviembre de 2013
16 / 19
Problema de LR(1)
Tablas MUY grandes
Juan Manuel Pérez ()
LR(1) - LALR - Resolución de Conflictos
12 de noviembre de 2013
17 / 19
Problema de LR(1)
Tablas MUY grandes
SLR(1) no reconoce gramáticas útiles (como la que vimos antes)
Juan Manuel Pérez ()
LR(1) - LALR - Resolución de Conflictos
12 de noviembre de 2013
17 / 19
Problema de LR(1)
Tablas MUY grandes
SLR(1) no reconoce gramáticas útiles (como la que vimos antes)
LALR vendría a ser un intermedio
Juan Manuel Pérez ()
LR(1) - LALR - Resolución de Conflictos
12 de noviembre de 2013
17 / 19
Idea de LALR(1)
Recordemos que dado un conjunto de items LR, su kernel es el subconjunto
de ítems cuyo “punto” no se encuentra al comienzo de la producción.
Vamos a unir los estados que tienen mismo kernel.
Juan Manuel Pérez ()
LR(1) - LALR - Resolución de Conflictos
12 de noviembre de 2013
18 / 19
Algoritmo de construcción de tabla LALR(1)
Construir C = {I0 . . . In } colección de conjuntos de ítems LR(1)
Juan Manuel Pérez ()
LR(1) - LALR - Resolución de Conflictos
12 de noviembre de 2013
19 / 19
Algoritmo de construcción de tabla LALR(1)
Construir C = {I0 . . . In } colección de conjuntos de ítems LR(1)
Construir C ′ = {J0 . . . Jm } el conjunto que consta de unir todos los
conjuntos de ítems de igual kernel
Juan Manuel Pérez ()
LR(1) - LALR - Resolución de Conflictos
12 de noviembre de 2013
19 / 19
Algoritmo de construcción de tabla LALR(1)
Construir C = {I0 . . . In } colección de conjuntos de ítems LR(1)
Construir C ′ = {J0 . . . Jm } el conjunto que consta de unir todos los
conjuntos de ítems de igual kernel
La tabla action la definimos de la misma manera que en el anterior
algoritmo
Juan Manuel Pérez ()
LR(1) - LALR - Resolución de Conflictos
12 de noviembre de 2013
19 / 19
Algoritmo de construcción de tabla LALR(1)
Construir C = {I0 . . . In } colección de conjuntos de ítems LR(1)
Construir C ′ = {J0 . . . Jm } el conjunto que consta de unir todos los
conjuntos de ítems de igual kernel
La tabla action la definimos de la misma manera que en el anterior
algoritmo
S
S
Si J = I1 · · · Ik entonces goTo(J, X ) es el nuevo ítem LALR(1)
que tiene el mismo kernel que goTo(I1 , X ) (o más fácil, el ítem que
contenga a goTo(I1 , X )
Juan Manuel Pérez ()
LR(1) - LALR - Resolución de Conflictos
12 de noviembre de 2013
19 / 19
Descargar