Analizadores sintácticos LR(0) y SLR Teorı́a de Lenguajes Facultad de Ciencias Exactas y Naturales Universidad de Buenos Aires Analizadores sintácticos LR(0) y SLR Clase de Hoy Anteriores: Parsing descendente (LL(1), ELL) Recursivos e iterativos Generan árbol de derivación desde la raı́z hasta las hojas Simulan derivación a izquierda Hoy: Parsing ascendente Construyen el árbol sintáctico desde las hojas hasta la raı́z Más expresivos que los descendentes Más difı́ciles de construir Analizadores sintácticos LR(0) y SLR Analizadores Sintácticos LR(k) L: left-to-right R: rightmost derivation k: número de sı́mbolos de lookahead Analizadores sintácticos LR(0) y SLR Tipos de Analizadores Sintácticos LR(k) LR(0) SLR(1): Simple LR(1) LALR(1): Lookahead LR(1) LR(1) Poder expresivo LR(0) ⊂ SLR(1) ⊂ LALR(1) ⊂ LR(1) Analizadores sintácticos LR(0) y SLR Algunas Definiciones Handle: (informalmente) Subcadena de una forma sentencial, que coincide con el lado derecho de una producción, y cuya reducción representa un paso en una derivación a derecha, en reversa. Prefijos Viables: Prefijos de una forma sentencial derecha que pueden aparecer en la pila de un parser shift-reduce, porque no sobrepasan el handle ubicado más a la derecha. El conjunto de todos los prefijos viables es un lenguaje regular. Analizadores sintácticos LR(0) y SLR Parsers LR(k) - Estructura General Analizadores sintácticos LR(0) y SLR Modelo de los analizadores sintácticos LR Pila: Contiene los estados del AFD por los que se va pasando. Tabla ir a: Función de transición de un AFD que reconoce los prefijos viables de la gramática. Tabla acción: desplazar i: desplazar y apilar el estado i. reducir A → β: reducir por la producción indicada. aceptar : aceptar la cadena de entrada. error : rechazar la cadena de entrada. Analizadores sintácticos LR(0) y SLR Parsers LR(k) - Algoritmo apilar s0 loop s ← tope de la pila a ← próximo sı́mbolo apuntado en w $ if accion[s, a] = desplazar s 0 then apilar s 0 avanzar al próximo sı́mbolo de entrada else if accion[s, a] = reducir A → β then sacar |β| sı́mbolos de la pila s 0 ← tope de la pila apilar ir a[s 0 , A] else if accion[s, a] = aceptar then return else error () end if end loop Analizadores sintácticos LR(0) y SLR Analizadores sintácticos LR(0) y SLR(1) Item LR(0) Producción con un pivote (•) en alguna posición del lado derecho. Representa hasta dónde se vio una producción en el proceso de análisis sintáctico, y cómo se espera que continúe la cadena de entrada. Por ejemplo, para la producción A → BC , existen estos ı́tems LR(0): A → •BC A→B •C A → BC • Para la producción A → λ el único ı́tem es: A → • Analizadores sintácticos LR(0) y SLR AFD para reconocer prefijos viables de una gramática Para armar las tablas ir a y acción es necesario construir un AFD que reconozca los prefijos viables de la gramática. El alfabeto es V = VN ∪ VT . Los estados son conjuntos de ı́tems. La función de transición determina la tabla ir a. Analizadores sintácticos LR(0) y SLR AFD para reconocer prefijos viables de una gramática Clausura de un Conjunto de Items J←I repeat for ı́tem A → α·Bβ ∈ J, y producción B → γ de G do agregar B → ·γ a J end for until no se puedan agregar ı́tems a J return J Analizadores sintácticos LR(0) y SLR AFD para reconocer prefijos viables de una gramática Construcción del Autómata 1 Aumentar la gramática G a G 0 agregando S 0 → S y cambiando el sı́mbolo distinguido a S 0 2 Construir los conjuntos de ı́tems LR(0) C = {I0 , ..., In } (estados del AFD) Analizadores sintácticos LR(0) y SLR AFD para reconocer prefijos viables de una gramática Construcción del Autómata 3 Construir la tabla accion: if A → α · aβ está en Ii , y δ(Ii , a) = Ij , a ∈ VT then asignar desplazar j a accion[i, a] end if if A → α· está en Ii , A 6= S 0 then asignar reducir A → α a accion[i,a] LR(0): para todos los terminales a SLR(1): para a en Siguientes(A) end if if S 0 → S· está en Ii then asignar aceptar a accion[i,$] end if Analizadores sintácticos LR(0) y SLR AFD para reconocer prefijos viables de una gramática Construcción del Autómata 4 Construir la tabla ir a: Para cada no terminal A, ir a[i,A] = j ⇔ δ(Ii , A) = Ij 5 Las entradas vacı́as de la tabla acción son consideradas error 6 El estado inicial es el que contiene el ı́tem S 0 → ·S Analizadores sintácticos LR(0) y SLR Gramáticas LR(0) – SLR(1) Conflictos Si la tabla acción tiene más de una entrada en algún casillero, entonces la gramática no es LR(0) / SLR(1). Posibles conflictos: shift-reduce reduce-reduce Analizadores sintácticos LR(0) y SLR Ejercicio (1) Sea G1 la siguiente gramática: S A → SA|A → (S)|() ¿Es LR(0)? ¿Es SLR? Analizar la siguiente cadena: (()) () Analizadores sintácticos LR(0) y SLR Tabla acción LR(0) para G1 estado 0 1 2 3 4 5 6 7 ( desplazar 3 desplazar 3 reducir S → A desplazar 3 reducir S → SA desplazar 3 reducir A → () reducir A → (S) ) reducir S → A desplazar 6 reducir S → SA desplazar 7 reducir A → () reducir A → (S) $ aceptar reducir S → A reducir S → SA reducir A → () reducir A → (S) Analizadores sintácticos LR(0) y SLR Tabla ir a LR(0) para G1 estado 0 1 2 3 4 5 6 7 S 1 A 2 4 5 2 4 Analizadores sintácticos LR(0) y SLR Análisis de una cadena del lenguaje generado por G1 pila 0 03 033 0336 032 035 0357 02 01 013 0136 014 01 entrada (())()$ ())()$ ))()$ )()$ )()$ )()$ ()$ ()$ ()$ )$ $ $ $ acción desplazar 3 desplazar 3 desplazar 6 reducir A → () reducir S → A desplazar 7 reducir A → (S) reducir S → A desplazar 3 desplazar 6 reducir A → () reducir S → SA aceptar Derivación: S ⇒ SA ⇒ S() ⇒ A() ⇒ (S)() ⇒ (A)() ⇒ (())() Analizadores sintácticos LR(0) y SLR Ejercicio (2) Sea G2 la siguiente gramática: E → id|id(E )|E + id ¿Es LR(0)? ¿Es SLR? Analizar la siguiente cadena: id(id + id) Analizadores sintácticos LR(0) y SLR Tabla acción SLR para G2 estado 0 1 2 3 4 5 6 7 id 2 ( ) + $ 4 E → id 3 E → id aceptar E → id E → E + id 7 E → id(E ) E → E + id 3 E → id(E ) E → E + id 5 2 E → id(E ) Siguientes(E) = {), +, $} Analizadores sintácticos LR(0) y SLR Tabla ir a SLR para G2 estado 0 1 2 3 4 5 6 7 E 1 6 Analizadores sintácticos LR(0) y SLR Análisis de una cadena del lenguaje generado por G2 pila 0 02 024 0242 0246 02463 024635 0246 02467 01 entrada id(id+id)$ (id+id)$ id+id)$ +id)$ +id)$ id)$ )$ )$ $ $ acción desplazar desplazar desplazar reducir E desplazar desplazar reducir E desplazar reducir E aceptar 2 4 2 → id 3 5 → E + id 7 → id(E ) Derivación: S ⇒ id(E ) ⇒ id(E + id) ⇒ id(id + id) Analizadores sintácticos LR(0) y SLR Bibliografı́a A. Aho, R. Sethi, J. Ullman. Compiladores: Principios, técnicas y herramientas. Addison Wesley, 1990. (El Libro del Dragón) Capı́tulo 4, secciones 4.5 y 4.7 Analizadores sintácticos LR(0) y SLR