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