Generación de analizador sintáctico ascendente Yacc (bison, . . . ) c Generación de analizador sintáctico ascendente v1.1 2005 José Fortes Gálvez– p.1 Reconocedor de avance-reducción Planteamiento clásico, originado por limitaciones de memoria y velocidad, hoy en parte superadas: Lectura del texto fuente de izquierda a derecha Ascendente [bottom-up]: construcción del árbol sintáctico de “abajo arriba” (hacia la raíz, correspondiente al símbolo principal) Avance-reducción [shift-reduce]: • La decisión de reducir (y la regla a aplicar) se toma en cuanto se acaba de reconocer la parte derecha (pivote [handle]) • Limitado tamaño de la ventana [lookahead] de contexto derecho usada en la decisión c Generación de analizador sintáctico ascendente v1.1 2005 José Fortes Gálvez– p.2 Ejemplo de avance-reducción S B A b a c E d F D Entrada = abcdef Pila vacía C e f c Generación de analizador sintáctico ascendente v1.1 2005 José Fortes Gálvez– p.3 Ejemplo de avance-reducción S B A b a c E d F D Avanza Pila = a C e f c Generación de analizador sintáctico ascendente v1.1 2005 José Fortes Gálvez– p.3 Ejemplo de avance-reducción S B A b a c E d F D Reduce A→a Pila = A C e f c Generación de analizador sintáctico ascendente v1.1 2005 José Fortes Gálvez– p.3 Ejemplo de avance-reducción S B A b a c E d F D Avanza Pila = Ab C e f c Generación de analizador sintáctico ascendente v1.1 2005 José Fortes Gálvez– p.3 Ejemplo de avance-reducción S B A b a c E d F D Reduce B→Ab Pila = B C e f c Generación de analizador sintáctico ascendente v1.1 2005 José Fortes Gálvez– p.3 Ejemplo de avance-reducción S B A b a c E d F D Avanza Pila = Bc C e f c Generación de analizador sintáctico ascendente v1.1 2005 José Fortes Gálvez– p.3 Ejemplo de avance-reducción S B A b a c E d F D Avanza Pila = Bcd C e f c Generación de analizador sintáctico ascendente v1.1 2005 José Fortes Gálvez– p.3 Ejemplo de avance-reducción S B A b a c E d F D C Avanza. Pila = Bcde (Secuencia de prefijos de partes derechas) e f c Generación de analizador sintáctico ascendente v1.1 2005 José Fortes Gálvez– p.3 Ejemplo de avance-reducción S B A b a c E d F D Avanza Pila = Bcdef C e f c Generación de analizador sintáctico ascendente v1.1 2005 José Fortes Gálvez– p.3 Ejemplo de avance-reducción S B A b a c E d F D Reduce C→ef Pila = BcdC C e f c Generación de analizador sintáctico ascendente v1.1 2005 José Fortes Gálvez– p.3 Ejemplo de avance-reducción S B A b a c E d F D Reduce D→C Pila = BcdD C e f c Generación de analizador sintáctico ascendente v1.1 2005 José Fortes Gálvez– p.3 Ejemplo de avance-reducción S B A b a c E d F D Reduce E→dD Pila = BcE C e f c Generación de analizador sintáctico ascendente v1.1 2005 José Fortes Gálvez– p.3 Ejemplo de avance-reducción S B A b a c E d F D C Reduce F→ε Pila = BcEF (Pila crece sin consumir entrada) e f c Generación de analizador sintáctico ascendente v1.1 2005 José Fortes Gálvez– p.3 Ejemplo de avance-reducción S B A b a c E d F D Reduce S→BcEF Pila = S (Fin del reconocimiento) C e f c Generación de analizador sintáctico ascendente v1.1 2005 José Fortes Gálvez– p.3 Implicaciones del avance-reducción Reducciones en orden inverso de derivación derecha [rightmost] Las secuencias de símbolos ya cubiertos (pero no reducidos): son el “frente de avance” en la construcción (virtual) del árbol, son prefijos de forma sentencial derecha (prefijos viables) evolucionan como pila LIFO (todo prefijo de p.v. es p.v.), y componen globalmente un lenguaje regular por tanto, podemos construir un AFD, llamado autómata LR c Generación de analizador sintáctico ascendente v1.1 2005 José Fortes Gálvez– p.4 Subárbol restante Normalmente existirán múltiples subárboles restantes compatibles con pila+ventana. Conforme se avanza se contruye el único correcto. α1 α2 Pila = α1 · · · αm α Resto entrada = y Ventana = k : y αm α ? top k : y c Generación de analizador sintáctico ascendente v1.1 2005 José Fortes Gálvez– p.5 Subárbol restante Normalmente existirán múltiples subárboles restantes compatibles con pila+ventana. Conforme se avanza se contruye el único correcto. S α1 A 1 β 1 α2 A 2 β 2 Pila = α1 · · · αm α Resto entrada = y = xxm · · · x1 Ventana = k : y Am−1 αm A m β m α top β x xm x2 x1 c Generación de analizador sintáctico ascendente v1.1 2005 José Fortes Gálvez– p.5 Subárbol restante Los posibles árboles restantes sólo dependen de la pila, no de la sección de la entrada que ésta deriva. S α1 A 1 β 1 α2 A 2 β 2 Pila = α1 · · · αm α Resto entrada = y Ventana = k : y Am−1 αm A m β m α top β x xm x2 x1 c Generación de analizador sintáctico ascendente v1.1 2005 José Fortes Gálvez– p.5 Ejemplo de AFD LR con k = 1 $-) 3 r2 T ( ac: T S’→S S 4 r1: S→S-T r2: S→T r3: T→(S) ) 9 $-) r3 ( ( a 1 - a a 5 r4: 7 T→a S 6 T 8 $-) r1 $-) - r4 2 $ ac c Generación de analizador sintáctico ascendente v1.1 2005 José Fortes Gálvez– p.6 Reconocimiento con autómata LR Gramática LR(k): si, usando ventana de k simbolos, siempre es posible decidir El autómata LR “lee” la pila y llega a un estado “actual” La acción de avance-reducción se decide en base al estado actual y k terminales siguientes Por construcción, a cada estado le corresponde un único símbolo entrante c Generación de analizador sintáctico ascendente v1.1 2005 José Fortes Gálvez– p.7 Ejemplo de tabla LR $ - 1 2 3 ) 4 ac r2 r2 r4 6 T 5 2 3 5 5 6 9 8 r1 r1 r1 9 r3 r3 r3 AFD y gramática long. sı́mb. r1 3 S 7 r2 1 S r3 3 T r4 1 T 3 r4 4 7 S r2 4 r4 a 6 4 5 ( 8 c Generación de analizador sintáctico ascendente v1.1 2005 José Fortes Gálvez– p.8 Utilización de la tabla LR Para evitar repetir ineficientemente la lectura de la pila, en lugar de pila de símbolos se utiliza pila de estados Toda transición implica empilar el nuevo estado Terminales: se lee nuevo símbolo (avance) Reducción: 1. Se desempilan tantos estados como símbolos tiene la parte derecha de la regla 2. Se realiza transición desde el estado que resulta en la cima con el símbolo no terminal de la parte izquierda de la regla c Generación de analizador sintáctico ascendente v1.1 2005 José Fortes Gálvez– p.9 Ejemplo de reconocimiento LR $ - 1 S 2 ( 4 ac a S T 5 2 3 6 T 3 (1,S) (1,S) ( 4 (1,S) 4 a 5 (1,T) (1,T) - 6 S 7 ) 5 7 3 (1,T) 4 6 5 8 9 T 8 (3,S) (3,S) (3,S) ) 9 (3,T) (3,T) (3,T) AFD y gramática c Generación de analizador sintáctico ascendente v1.1 2005 José Fortes Gálvez– p.10 Ejemplo de reconocimiento LR $ - 1 S 2 ( 4 ac a S T Pila 1 Resto entrada Decisión a-(a-a)$ 5 2 3 6 T 3 (1,S) (1,S) ( 4 (1,S) 4 a 5 (1,T) (1,T) - 6 S 7 ) 5 7 3 (1,T) 4 6 5 8 9 T 8 (3,S) (3,S) (3,S) ) 9 (3,T) (3,T) (3,T) AFD y gramática c Generación de analizador sintáctico ascendente v1.1 2005 José Fortes Gálvez– p.10 Ejemplo de reconocimiento LR $ - 1 S 2 ( 4 ac a S T Pila 1 5 2 3 15 Resto entrada Decisión a-(a-a)$ Avanzar -(a-a)$ 6 T 3 (1,S) (1,S) ( 4 (1,S) 4 a 5 (1,T) (1,T) - 6 S 7 ) 5 7 3 (1,T) 4 6 5 8 9 T 8 (3,S) (3,S) (3,S) ) 9 (3,T) (3,T) (3,T) AFD y gramática c Generación de analizador sintáctico ascendente v1.1 2005 José Fortes Gálvez– p.10 Ejemplo de reconocimiento LR $ - 1 S 2 ( 4 ac a S T Pila 1 5 2 3 15 13 Resto entrada Decisión a-(a-a)$ Avanzar -(a-a)$ Red. T→a -(a-a)$ 6 T 3 (1,S) (1,S) ( 4 (1,S) 4 a 5 (1,T) (1,T) - 6 S 7 ) 5 7 3 (1,T) 4 6 5 8 9 T 8 (3,S) (3,S) (3,S) ) 9 (3,T) (3,T) (3,T) AFD y gramática c Generación de analizador sintáctico ascendente v1.1 2005 José Fortes Gálvez– p.10 Ejemplo de reconocimiento LR $ - 1 S 2 ( 4 ac 6 T 3 (1,S) (1,S) ( 4 4 - 6 1 5 2 3 15 13 12 Resto entrada a-(a-a)$ -(a-a)$ -(a-a)$ -(a-a)$ Decisión Avanzar Red. T→a Red. S→T 5 7 3 (1,T) 4 6 a S T Pila (1,S) a 5 (1,T) (1,T) S 7 ) 5 8 9 T 8 (3,S) (3,S) (3,S) ) 9 (3,T) (3,T) (3,T) AFD y gramática c Generación de analizador sintáctico ascendente v1.1 2005 José Fortes Gálvez– p.10 Ejemplo de reconocimiento LR $ - 1 S 2 ( 4 ac 6 T 3 (1,S) (1,S) ( 4 (1,S) 4 a 5 (1,T) (1,T) - 6 S 7 ) 1 5 2 3 15 13 12 126 Resto entrada a-(a-a)$ -(a-a)$ -(a-a)$ -(a-a)$ (a-a)$ Decisión Avanzar Red. T→a Red. S→T Avanzar 5 7 3 (1,T) 4 6 a S T Pila 5 8 9 T 8 (3,S) (3,S) (3,S) ) 9 (3,T) (3,T) (3,T) AFD y gramática c Generación de analizador sintáctico ascendente v1.1 2005 José Fortes Gálvez– p.10 Ejemplo de reconocimiento LR $ - ( ) a S T Pila 1 1 4 5 2 3 15 13 S 2 ac 6 12 126 T 3 (1,S) (1,S) (1,S) 1264 ( 4 4 a 5 (1,T) (1,T) - 6 S 7 Decisión Avanzar Red. T→a Red. S→T Avanzar Avanzar 5 7 3 (1,T) 4 6 Resto entrada a-(a-a)$ -(a-a)$ -(a-a)$ -(a-a)$ (a-a)$ a-a)$ 5 8 9 T 8 (3,S) (3,S) (3,S) ) 9 (3,T) (3,T) (3,T) AFD y gramática c Generación de analizador sintáctico ascendente v1.1 2005 José Fortes Gálvez– p.10 Ejemplo de reconocimiento LR $ - ( ) a S T Pila 1 1 4 5 2 3 15 13 S 2 ac 6 12 126 T 3 (1,S) (1,S) (1,S) 1264 ( 4 4 5 7 3 12645 a 5 (1,T) (1,T) - 6 S 7 Decisión Avanzar Red. T→a Red. S→T Avanzar Avanzar Avanzar (1,T) 4 6 Resto entrada a-(a-a)$ -(a-a)$ -(a-a)$ -(a-a)$ (a-a)$ a-a)$ -a)$ 5 8 9 T 8 (3,S) (3,S) (3,S) ) 9 (3,T) (3,T) (3,T) AFD y gramática c Generación de analizador sintáctico ascendente v1.1 2005 José Fortes Gálvez– p.10 Ejemplo de reconocimiento LR $ - ( ) a S T Pila 1 1 4 5 2 3 15 13 S 2 ac 6 12 126 T 3 (1,S) (1,S) (1,S) 1264 ( 4 4 5 7 3 12645 12643 a 5 (1,T) (1,T) - 6 S 7 Decisión Avanzar Red. T→a Red. S→T Avanzar Avanzar Avanzar Red. T→a (1,T) 4 6 Resto entrada a-(a-a)$ -(a-a)$ -(a-a)$ -(a-a)$ (a-a)$ a-a)$ -a)$ -a)$ 5 8 9 T 8 (3,S) (3,S) (3,S) ) 9 (3,T) (3,T) (3,T) AFD y gramática c Generación de analizador sintáctico ascendente v1.1 2005 José Fortes Gálvez– p.10 Ejemplo de reconocimiento LR $ - ( ) a S T Pila 1 1 4 5 2 3 15 13 S 2 ac 6 12 126 T 3 (1,S) (1,S) (1,S) 1264 ( 4 4 5 7 3 12645 12643 12647 a 5 (1,T) (1,T) (1,T) - 6 S 7 4 6 5 Resto entrada a-(a-a)$ -(a-a)$ -(a-a)$ -(a-a)$ (a-a)$ a-a)$ -a)$ -a)$ -a)$ Decisión Avanzar Red. T→a Red. S→T Avanzar Avanzar Avanzar Red. T→a Red. S→T 8 9 T 8 (3,S) (3,S) (3,S) ) 9 (3,T) (3,T) (3,T) AFD y gramática c Generación de analizador sintáctico ascendente v1.1 2005 José Fortes Gálvez– p.10 Ejemplo de reconocimiento LR Resto entrada 1 a-(a-a)$ -(a-a)$ 1 4 5 2 3 15 13 -(a-a)$ S 2 ac 6 12 -(a-a)$ 126 (a-a)$ T 3 (1,S) (1,S) (1,S) 1264 a-a)$ -a)$ ( 4 4 5 7 3 12645 12643 -a)$ 12647 -a)$ a 5 (1,T) (1,T) (1,T) 126476 a)$ $ - - 6 S 7 ( ) 4 6 a S T Pila 5 Decisión Avanzar Red. T→a Red. S→T Avanzar Avanzar Avanzar Red. T→a Red. S→T Avanzar 8 9 T 8 (3,S) (3,S) (3,S) ) 9 (3,T) (3,T) (3,T) AFD y gramática c Generación de analizador sintáctico ascendente v1.1 2005 José Fortes Gálvez– p.10 Ejemplo de reconocimiento LR Resto entrada 1 a-(a-a)$ -(a-a)$ 1 4 5 2 3 15 13 -(a-a)$ S 2 ac 6 12 -(a-a)$ 126 (a-a)$ T 3 (1,S) (1,S) (1,S) 1264 a-a)$ -a)$ ( 4 4 5 7 3 12645 12643 -a)$ 12647 -a)$ a 5 (1,T) (1,T) (1,T) 126476 a)$ - 6 4 5 8 1264765 )$ $ S 7 - 6 ( ) a S T Pila Decisión Avanzar Red. T→a Red. S→T Avanzar Avanzar Avanzar Red. T→a Red. S→T Avanzar Avanzar 9 T 8 (3,S) (3,S) (3,S) ) 9 (3,T) (3,T) (3,T) AFD y gramática c Generación de analizador sintáctico ascendente v1.1 2005 José Fortes Gálvez– p.10 Ejemplo de reconocimiento LR Resto entrada 1 a-(a-a)$ -(a-a)$ 1 4 5 2 3 15 13 -(a-a)$ S 2 ac 6 12 -(a-a)$ 126 (a-a)$ T 3 (1,S) (1,S) (1,S) 1264 a-a)$ -a)$ ( 4 4 5 7 3 12645 12643 -a)$ 12647 -a)$ a 5 (1,T) (1,T) (1,T) 126476 a)$ - 6 4 5 8 1264765 )$ 1264768 )$ $ S 7 - 6 ( ) a S T Pila Decisión Avanzar Red. T→a Red. S→T Avanzar Avanzar Avanzar Red. T→a Red. S→T Avanzar Avanzar Red. T→a 9 T 8 (3,S) (3,S) (3,S) ) 9 (3,T) (3,T) (3,T) AFD y gramática c Generación de analizador sintáctico ascendente v1.1 2005 José Fortes Gálvez– p.10 Ejemplo de reconocimiento LR Resto entrada 1 a-(a-a)$ -(a-a)$ 1 4 5 2 3 15 13 -(a-a)$ S 2 ac 6 12 -(a-a)$ 126 (a-a)$ T 3 (1,S) (1,S) (1,S) 1264 a-a)$ -a)$ ( 4 4 5 7 3 12645 12643 -a)$ 12647 -a)$ a 5 (1,T) (1,T) (1,T) 126476 a)$ - 6 4 5 8 1264765 )$ 1264768 )$ S 7 6 9 12647 )$ $ - ( ) T 8 (3,S) (3,S) (3,S) ) 9 (3,T) (3,T) (3,T) a S T Pila Decisión Avanzar Red. T→a Red. S→T Avanzar Avanzar Avanzar Red. T→a Red. S→T Avanzar Avanzar Red. T→a Red. S→S AFD y gramática c Generación de analizador sintáctico ascendente v1.1 2005 José Fortes Gálvez– p.10 Ejemplo de reconocimiento LR Resto entrada 1 a-(a-a)$ -(a-a)$ 1 4 5 2 3 15 13 -(a-a)$ S 2 ac 6 12 -(a-a)$ 126 (a-a)$ T 3 (1,S) (1,S) (1,S) 1264 a-a)$ -a)$ ( 4 4 5 7 3 12645 12643 -a)$ 12647 -a)$ a 5 (1,T) (1,T) (1,T) 126476 a)$ - 6 4 5 8 1264765 )$ 1264768 )$ S 7 6 9 12647 )$ 126479 $ T 8 (3,S) (3,S) (3,S) $ - ) 9 (3,T) (3,T) ( ) a S T Pila Decisión Avanzar Red. T→a Red. S→T Avanzar Avanzar Avanzar Red. T→a Red. S→T Avanzar Avanzar Red. T→a Red. S→S Avanzar (3,T) AFD y gramática c Generación de analizador sintáctico ascendente v1.1 2005 José Fortes Gálvez– p.10 Ejemplo de reconocimiento LR Resto entrada 1 a-(a-a)$ -(a-a)$ 1 4 5 2 3 15 13 -(a-a)$ S 2 ac 6 12 -(a-a)$ 126 (a-a)$ T 3 (1,S) (1,S) (1,S) 1264 a-a)$ -a)$ ( 4 4 5 7 3 12645 12643 -a)$ 12647 -a)$ a 5 (1,T) (1,T) (1,T) 126476 a)$ - 6 4 5 8 1264765 )$ 1264768 )$ S 7 6 9 12647 )$ 126479 $ T 8 (3,S) (3,S) (3,S) 1268 $ $ - ) 9 (3,T) (3,T) ( ) a S T Pila Decisión Avanzar Red. T→a Red. S→T Avanzar Avanzar Avanzar Red. T→a Red. S→T Avanzar Avanzar Red. T→a Red. S→S Avanzar Red. T→( (3,T) AFD y gramática c Generación de analizador sintáctico ascendente v1.1 2005 José Fortes Gálvez– p.10 Ejemplo de reconocimiento LR Resto entrada 1 a-(a-a)$ -(a-a)$ 1 4 5 2 3 15 13 -(a-a)$ S 2 ac 6 12 -(a-a)$ 126 (a-a)$ T 3 (1,S) (1,S) (1,S) 1264 a-a)$ -a)$ ( 4 4 5 7 3 12645 12643 -a)$ 12647 -a)$ a 5 (1,T) (1,T) (1,T) 126476 a)$ - 6 4 5 8 1264765 )$ 1264768 )$ S 7 6 9 12647 )$ 126479 $ T 8 (3,S) (3,S) (3,S) 1268 $ 12 $ ) 9 (3,T) (3,T) (3,T) $ - ( ) a S T Pila Decisión Avanzar Red. T→a Red. S→T Avanzar Avanzar Avanzar Red. T→a Red. S→T Avanzar Avanzar Red. T→a Red. S→S Avanzar Red. T→( Red. S→S AFD y gramática c Generación de analizador sintáctico ascendente v1.1 2005 José Fortes Gálvez– p.10 Ejemplo de reconocimiento LR Resto entrada 1 a-(a-a)$ -(a-a)$ 1 4 5 2 3 15 13 -(a-a)$ S 2 ac 6 12 -(a-a)$ 126 (a-a)$ T 3 (1,S) (1,S) (1,S) 1264 a-a)$ -a)$ ( 4 4 5 7 3 12645 12643 -a)$ 12647 -a)$ a 5 (1,T) (1,T) (1,T) 126476 a)$ - 6 4 5 8 1264765 )$ 1264768 )$ S 7 6 9 12647 )$ 126479 $ T 8 (3,S) (3,S) (3,S) 1268 $ 12 $ ) 9 (3,T) (3,T) (3,T) $ - ( ) a S T Pila Decisión Avanzar Red. T→a Red. S→T Avanzar Avanzar Avanzar Red. T→a Red. S→T Avanzar Avanzar Red. T→a Red. S→S Avanzar Red. T→( Red. S→S Aceptar Fin del reconocimiento. AFD y gramática c Generación de analizador sintáctico ascendente v1.1 2005 José Fortes Gálvez– p.10 Items LR(0). Significado El punto en la parte derecha corresponde con la posición de la cima de la pila (por tanto α es un sufijo de pila). S α1 A 1 β 1 Am →α•β α2 A 2 β 2 Am−1 αm A m β m α top β x xm x2 x1 c Generación de analizador sintáctico ascendente v1.1 2005 José Fortes Gálvez– p.11 Items LR(0). Significado Dada la multiplicidad de árboles restantes compatibles con la pila, en cada momento tendremos un conjunto de items, parte de los cuales se “desecharán” al progresar la lectura (distintos β y distintos A). α1 Am →α•β A0m →α0 •β 0 A00m →α00 •β 00 . . . α2 αm α ? top k : y c Generación de analizador sintáctico ascendente v1.1 2005 José Fortes Gálvez– p.11 Conjuntos de items LR(0) Cierre: Equivalente a transición-ε (sin avanzar en la lectura) Items de la forma A→α•Bβ : se añaden al conjunto los items B→•γi para cada una de las reglas B→γi Transición con un símbolo X : 1. Se mueve el punto en los items con X : Se pasa de A→α•Xβ a A→αX •β (núcleo [kernel], que identifica al estado) 2. Se calcula el cierre del núcleo Estado inicial: Cierre de S 0 →•S c Generación de analizador sintáctico ascendente v1.1 2005 José Fortes Gálvez– p.12 Acciones del autómata LR(0) A cada conjunto de items le asociamos un estado del AFD. Acciones en cada estado: A→α•aβ indican avanzar B→γ • indican reducir B→γ (Tras reducción aplicamos transición con B ) S’→S• indica aceptar Si más de una acción, tenemos un conflicto: la gramática no es LR(0) c Generación de analizador sintáctico ascendente v1.1 2005 José Fortes Gálvez– p.13 Ejemplo de items y acciones S B A b a c E d F D C e f S’→•S S→•BcEF B→•Ab A→•a (Avanzar) . . . c Generación de analizador sintáctico ascendente v1.1 2005 José Fortes Gálvez– p.14 Ejemplo de items y acciones S B A b a c E d F D C A→a• (Reducir) . . . e f c Generación de analizador sintáctico ascendente v1.1 2005 José Fortes Gálvez– p.14 Ejemplo de items y acciones S B A b a c E d F D C B→A•b (Avanzar) . . . e f c Generación de analizador sintáctico ascendente v1.1 2005 José Fortes Gálvez– p.14 Ejemplo de items y acciones S B A b a c E d F D C B→Ab• (Reducir) . . . e f c Generación de analizador sintáctico ascendente v1.1 2005 José Fortes Gálvez– p.14 Ejemplo de items y acciones S B A b a c E d F D C S→B•cEF (Avanzar) . . . e f c Generación de analizador sintáctico ascendente v1.1 2005 José Fortes Gálvez– p.14 Ejemplo de items y acciones S B A b a c E d F D C S→Bc•EF E→•dD (Avanzar) . . . e f c Generación de analizador sintáctico ascendente v1.1 2005 José Fortes Gálvez– p.14 Ejemplo de items y acciones S B A b a c E d F D C e f E→d•D D→•C C→•ef (Avanzar) . . . c Generación de analizador sintáctico ascendente v1.1 2005 José Fortes Gálvez– p.14 Ejemplo de items y acciones S B A b a c E d F D C C→e•f (Avanzar) . . . e f c Generación de analizador sintáctico ascendente v1.1 2005 José Fortes Gálvez– p.14 Ejemplo de items y acciones S B A b a c E d F D C C→ef• (Reducir) . . . e f c Generación de analizador sintáctico ascendente v1.1 2005 José Fortes Gálvez– p.14 Ejemplo de items y acciones S B A b a c E d F D C D→C• (Reducir) . . . e f c Generación de analizador sintáctico ascendente v1.1 2005 José Fortes Gálvez– p.14 Ejemplo de items y acciones S B A b a c E d F D C E→dD• (Reducir) . . . e f c Generación de analizador sintáctico ascendente v1.1 2005 José Fortes Gálvez– p.14 Ejemplo de items y acciones S B A b a c E d F D C S→BcE•F F→• (Reducir) . . . e f c Generación de analizador sintáctico ascendente v1.1 2005 José Fortes Gálvez– p.14 Ejemplo de items y acciones S B A b a c E d F D C S→BcEF• (Reducir) . . . e f c Generación de analizador sintáctico ascendente v1.1 2005 José Fortes Gálvez– p.14 Ejemplo de items y acciones S B A b a c E d F D C S’→S• (Aceptar) . . . e f c Generación de analizador sintáctico ascendente v1.1 2005 José Fortes Gálvez– p.14 Autómata LR(0) con conflictos E→E+T|T T→T*F|F F→(E)|a Estado Items 1 S’→•E E→•T T→•F F→•(E) F→•a 2 S’→E• E→E•+T 3 E→T• T→T•*F 4 T→F• 5 F→(•E) E→•T T→•F F→•(E) F→•a 6 F→a• 7 E→E+•T T→•F F→•(E) F→•a 8 T→T*•F F→•(E) F→•a 9 F→(E•) E→E•+T 10 E→E+T• T→T•*F 11 T→T*F• 12 F→(E)• Transic. Acciones E→•E+T E:2 Avanzar T→•T*F T:3 F:4 (:5 a:6 Aceptar +:7 Avanzar Reducir E→T *:8 Avanzar Reducir T→F E→•E+T E:9 Avanzar T→•T*F T:3 F:4 (:5 a:6 Reducir F→a T→•T*F T:10 Avanzar F:4 (:5 a:6 F:11 Avanzar (:5 a:6 ):12 Avanzar +:7 Reducir E→E+T *:8 Avanzar Reducir T→T*F Reducir F→(E) c Generación de analizador sintáctico ascendente v1.1 2005 José Fortes Gálvez– p.15 Autómata SLR(1) sin conflictos E→E+T|T T→T*F|F F→(E)|a Sı́mb. Siguientes S’ E T F $ $,+,) $,+,*,) $,+,*,) Estado Items 1 S’→•E E→•T T→•F F→•(E) F→•a 2 S’→E• E→E•+T 3 E→T• T→T•*F 4 T→F• 5 F→(•E) E→•T T→•F F→•(E) F→•a 6 F→a• 7 E→E+•T T→•F F→•(E) F→•a 8 T→T*•F F→•(E) F→•a 9 F→(E•) E→E•+T 10 E→E+T• T→T•*F 11 T→T*F• 12 F→(E)• Transic. Sı́mbolos:Acciones E→•E+T E:2 (,a:Avanzar T→•T*F T:3 F:4 (:5 a:6 $:Aceptar +:7 +:Avanzar $,+,):Reducir E→T *:8 *:Avanzar $,+,*,):Reducir T→F E→•E+T E:9 (,a:Avanzar T→•T*F T:3 F:4 (:5 a:6 $,+,*,):Reducir F→a T→•T*F T:10 (,a:Avanzar F:4 (:5 a:6 F:11 (,a:Avanzar (:5 a:6 ):12 ),+:Avanzar +:7 $,+,):Reducir E→E+T *:8 *:Avanzar $,+,*,):Reducir T→T*F $,+,*,):Reducir F→(E) c Generación de analizador sintáctico ascendente v1.1 2005 José Fortes Gálvez– p.16 Tabla SLR(1) de GET F $ ac: r1: r2: r3: r4: r5: r6: S’→E E→E+T E→T T→T*F T→F F→(E) F→a 1 2 3 4 5 6 7 8 9 10 11 12 + * ( ) a E T 5 6 2 3 ac 7 r2 r2 8 r4 r4 r4 r2 r4 5 r6 r6 r6 6 9 3 4 r6 5 5 7 r1 r1 8 r3 r3 r3 r5 r5 r5 F 4 6 6 10 4 11 12 r1 r3 r5 Autómata y acciones c Generación de analizador sintáctico ascendente v1.1 2005 José Fortes Gálvez– p.17 Autómata SLR(1) con conflicto ac: r1: r2: r3: r4: r5: r6: S’→S S→E=E S→f E→T E→E+T T→f T→T*f Sı́mb. Siguientes S’ S E T $ $ $,=,+ $,=,+,* Estado Items 1 S’→•S S→•E=E S→•f E→•T 2 S’→S• 3 S→E•=E E→E•+T 4 S→f• T→f• 5 E→T• T→T•*f 6 S→E=•E E→•T T→•f 7 E→E+•T T→•f 8 T→T*•f 9 S→E=E• E→E•+T 10 T→f• 11 E→E+T• T→T•*f 12 T→T*f• Transic. Sı́mbolos:Acciones S:2 f:Avanzar E→•E+T E:3 T→•f f:4 T→•T*f T:5 $:Aceptar =:6 =+:Avanzar +:7 $:Reducir S→f $=+*:Reducir T→f $=+:Reducir E→T *:8 *:Avanzar E→•E+T E:9 f:Avanzar T→•T*f T:5 f:10 T→•T*f T:11 f:Avanzar f:10 f:12 f:Avanzar $:Reducir S→E=E +:7 +:Avanzar $=+*:Reducir T→f $=+:Reducir E→E+T *:8 *:Avanzar $=*+:Reducir T→T*f c Generación de analizador sintáctico ascendente v1.1 2005 José Fortes Gálvez– p.18 Tabla SLR(1) con conflicto ac: r1: r2: r3: r4: r5: r6: S’→S S→E=E S→f E→T E→E+T T→f T→T*f Sı́mb. Siguientes S’ S E T $ $ $,=,+ $,=,+,* $ = f 4 + * S E T 2 3 5 1 2 ac 3 6 7 4 r2,r5 r5 r5 r5 5 r3 r3 r3 8 6 10 7 10 8 12 9 r1 7 10 r5 r5 r5 r5 11 r4 r4 r4 8 12 r6 r6 r6 r6 9 5 11 c Generación de analizador sintáctico ascendente v1.1 2005 José Fortes Gálvez– p.19 Autómata LR(0) de GSET 12 4 ac: r1: r2: r3: r4: r5: r6: S’→S S→E=E S→f E→T E→E+T T→f T→T*f f f 2 8 * 11 + 9 f 10 S 1 Sı́mb. Siguientes S’ S E T $ $ $,=,+ $,=,+,* T * T 5 7 f E T + 3 = E 6 c Generación de analizador sintáctico ascendente v1.1 2005 José Fortes Gálvez– p.20 Análisis del conflicto SLR(1) Orígen (espúreo) del conflicto: Según la gramática, sólo con las pilas E=f ó E=E+f es apropiado r2: T→f ante $ Ello sólo ocurre en el estado 10, no en el 4 Por tanto, no tiene sentido r2 en el estado 4 Conclusión: El conjunto de siguientes engloba todos los contextos: no es suficientemente discriminatorio para las gramáticas no-SLR(1) Entonces, es necesario un método que calcule las ventanas en conexión con el contexto izquierdo c Generación de analizador sintáctico ascendente v1.1 2005 José Fortes Gálvez– p.21 Items LR(k). Significado Existe un sufijo zm compatible con la pila (y adyacente a una frase x derivada de β) tal que w = k : zm $ S α1 A 1 β 1 α2 A 2 β 2 Am →α•β, w Am−1 αm A m β m α β cima x zm c Generación de analizador sintáctico ascendente v1.1 2005 José Fortes Gálvez– p.22 Items LR(k). Cierre Dado un ítem A→α•Bβ, w, donde w = k : z$ S A→α•Bβ, w α1 A 1 β 1 αm A βm α β B cima x y z c Generación de analizador sintáctico ascendente v1.1 2005 José Fortes Gálvez– p.23 Items LR(k). Cierre Dado un ítem A→α•Bβ, w, las nuevas ventanas vj ∈ {k : yw | β ⇒∗ y} se hallan igualmente a continuación de las frases de B S A→α•Bβ, w α1 A 1 β 1 B→•γ, v1 αm A βm α β B cima γ x y z c Generación de analizador sintáctico ascendente v1.1 2005 José Fortes Gálvez– p.23 Items LR(k). Cierre Dado un ítem A→α•Bβ, w, las nuevas ventanas vj ∈ {k : yw | β ⇒∗ y} se hallan igualmente a continuación de las frases de B S A→α•Bβ, w α1 A 1 β 1 B→•γ, v1 B→•γ, vn αm A βm α β B cima γ x y z c Generación de analizador sintáctico ascendente v1.1 2005 José Fortes Gálvez– p.23 Conjuntos de items LR(1) Cierre: Items de la forma A→α•Bβ, a: se añaden al conjunto los items B→•γi , bj para cada regla B→γi y cada bj ∈ Pr(βa) Transición con un símbolo X : 1. Se mueve el punto en los items con X : Se pasa de A→α•Xβ, b a A→αX •β, b (núcleo) 2. Se calcula el cierre del núcleo Estado inicial: Cierre de S 0 →•S, $ c Generación de analizador sintáctico ascendente v1.1 2005 José Fortes Gálvez– p.24 Acciones del autómata LR(1) A cada conjunto de items le asociamos un estado del AFD. Acciones en cada estado: A→α•aβ, b indican avanzar ante a B→γ •, b indican reducir B→γ ante b (Tras reducción aplicamos transición con B ) S 0 →S •, $ indica aceptar ante $ Si más de una acción ante un mismo terminal, tenemos un conflicto: la gramática no es LR(1) c Generación de analizador sintáctico ascendente v1.1 2005 José Fortes Gálvez– p.25 Ejemplo de items LR(1) y acciones S B A b a c E d F D C e f S’→•S,$ S→•BcEF,$ B→•Ab,c A→•a,b (Avanzar ante a) . . . c Generación de analizador sintáctico ascendente v1.1 2005 José Fortes Gálvez– p.26 Ejemplo de items LR(1) y acciones S B A b a c E d F D C A→a•,b (Reducir ante b) . . . e f c Generación de analizador sintáctico ascendente v1.1 2005 José Fortes Gálvez– p.26 Ejemplo de items LR(1) y acciones S B A b a c E d F D C B→A•b,c (Avanzar ante b) . . . e f c Generación de analizador sintáctico ascendente v1.1 2005 José Fortes Gálvez– p.26 Ejemplo de items LR(1) y acciones S B A b a c E d F D C B→Ab•,c (Reducir ante c) . . . e f c Generación de analizador sintáctico ascendente v1.1 2005 José Fortes Gálvez– p.26 Ejemplo de items LR(1) y acciones S B A b a c E d F D C S→B•cEF,$ (Avanzar ante c) . . . e f c Generación de analizador sintáctico ascendente v1.1 2005 José Fortes Gálvez– p.26 Ejemplo de items LR(1) y acciones S B A b a c E d F D C S→Bc•EF,$ E→•dD,$ (Avanzar ante d) . . . e f c Generación de analizador sintáctico ascendente v1.1 2005 José Fortes Gálvez– p.26 Ejemplo de items LR(1) y acciones S B A b a c E d F D C e f E→d•D,$ D→•C,$ C→•ef,$ (Avanzar ante e) . . . c Generación de analizador sintáctico ascendente v1.1 2005 José Fortes Gálvez– p.26 Ejemplo de items LR(1) y acciones S B A b a c E d F D C C→e•f,$ (Avanzar ante f) . . . e f c Generación de analizador sintáctico ascendente v1.1 2005 José Fortes Gálvez– p.26 Ejemplo de items LR(1) y acciones S B A b a c E d F D C C→ef•,$ (Reducir ante $) . . . e f c Generación de analizador sintáctico ascendente v1.1 2005 José Fortes Gálvez– p.26 Ejemplo de items LR(1) y acciones S B A b a c E d F D C D→C•,$ (Reducir ante $) . . . e f c Generación de analizador sintáctico ascendente v1.1 2005 José Fortes Gálvez– p.26 Ejemplo de items LR(1) y acciones S B A b a c E d F D C E→dD•,$ (Reducir ante $) . . . e f c Generación de analizador sintáctico ascendente v1.1 2005 José Fortes Gálvez– p.26 Ejemplo de items LR(1) y acciones S B A b a c E d F D C S→BcE•F,$ F→•,$ (Reducir ante $) . . . e f c Generación de analizador sintáctico ascendente v1.1 2005 José Fortes Gálvez– p.26 Ejemplo de items LR(1) y acciones S B A b a c E d F D C S→BcEF•,$ (Reducir ante $) . . . e f c Generación de analizador sintáctico ascendente v1.1 2005 José Fortes Gálvez– p.26 Ejemplo de items LR(1) y acciones S B A b a c E d F D C S’→S•,$ (Aceptar ante $) . . . e f c Generación de analizador sintáctico ascendente v1.1 2005 José Fortes Gálvez– p.26 Autómata LR(1) ac: r1: r2: r3: r4: r5: r6: S’→S S→E=E S→f E→T E→E+T T→f T→T*f SLR(1) Estado Items Transic. Sı́mbolos:Acciones 1 S’→•S,$ S:2 f:Avanzar S→•E=E,$ E→•E+T,=+ E:3 S→•f,$ T→•f,=*+ f:4 E→•T,=+ T→•T*f,=*+ T:5a 2 S’→S•,$ $:Aceptar 3 S→E•=E,$ =:6 =+:Avanzar E→E•+T,=+ +:7a 4 S→f•,$ $:Reducir S→f T→f•,=*+ =*+:Reducir T→f 5a E→T•,=+ =+:Reducir E→T T→T•*f,=*+ *:8a *:Avanzar 5b E→T•,$+ $+:Reducir E→T T→T•*f,$*+ *:8b *:Avanzar 6 S→E=•E,$ E→•E+T,$+ E:9 f:Avanzar E→•T,$+ T→•T*f,$*+ T:5b T→•f,$*+ f:10b 7a E→E+•T,=+ T→•T*f,=+* T:11a f:Avanzar T→•f,=+* f:10a 7b E→E+•T,$+ T→•T*f,$+* T:11b f:Avanzar T→•f,$+* f:10b 8a T→T*•f,=*+ f:12a f:Avanzar 8b T→T*•f,$*+ f:12b f:Avanzar 9 S→E=E•,$ $:Reducir S→E=E E→E•+T,$+ +:7b +:Avanzar 10a T→f•,=+* =+*:Reducir T→f 10b T→f•,$*+ $*+:Reducir T→f 11a E→E+T•,=+ =+:Reducir E→E+T T→T•*f,=+* *:8a *:Avanzar 11b E→E+T•,$+ c Generación de analizador sintáctico ascendente v1.1$+:Reducir 2005 José FortesE→E+T Gálvez– p.27 T→T•*f,$+* *:8b *:Avanzar 12a T→T*f•,=*+ =*+:Reducir T→T* Autómata LR(1) ac: r1: r2: r3: r4: r5: r6: S’→S S→E=E S→f E→T E→E+T T→f T→T*f SLR(1) Estado Items 1 S’→•S,$ S→•E=E,$ E→•E+T,=+ S→•f,$ T→•f,=*+ E→•T,=+ T→•T*f,=*+ 2 S’→S•,$ 3 S→E•=E,$ E→E•+T,=+ 4 S→f•,$ T→f•,=*+ 5a E→T•,=+ T→T•*f,=*+ 5b E→T•,$+ T→T•*f,$*+ 6 S→E=•E,$ E→•E+T,$+ E→•T,$+ T→•T*f,$*+ T→•f,$*+ 7a E→E+•T,=+ T→•T*f,=+* T→•f,=+* 7b E→E+•T,$+ T→•T*f,$+* T→•f,$+* 8a T→T*•f,=*+ 8b T→T*•f,$*+ 9 S→E=E•,$ E→E•+T,$+ 10a T→f•,=+* 10b T→f•,$*+ 11a E→E+T•,=+ T→T•*f,=+* 11b E→E+T•,$+ T→T•*f,$+* 12a T→T*f•,=*+ 12b T→T*f•,$*+ Transic. Sı́mbolos:Acciones S:2 f:Avanzar E:3 f:4 T:5a $:Aceptar =:6 =+:Avanzar +:7a $:Reducir S→f =*+:Reducir T→f =+:Reducir E→T *:8a *:Avanzar $+:Reducir E→T *:8b *:Avanzar E:9 f:Avanzar T:5b f:10b T:11a f:Avanzar f:10a T:11b f:Avanzar f:10b f:12a f:Avanzar f:12b f:Avanzar $:Reducir S→E=E +:7b +:Avanzar =+*:Reducir T→f $*+:Reducir T→f =+:Reducir E→E+T *:8a *:Avanzar $+:Reducir E→E+T *:8b *:Avanzar =*+:Reducir T→T* $*+:Reducir T→T* c Generación de analizador sintáctico ascendente v1.1 2005 José Fortes Gálvez– p.27 Cierre LR(1) del estado 1 S’→•S,$ ac: r1: r2: r3: r4: r5: r6: S’→S S→E=E S→f E→T E→E+T T→f T→T*f c Generación de analizador sintáctico ascendente v1.1 2005 José Fortes Gálvez– p.28 Cierre LR(1) del estado 1 ac: r1: r2: r3: r4: r5: r6: S’→S S→E=E S→f E→T E→E+T T→f T→T*f S’→•S,$ S→•E=E,$ S→•f,$ c Generación de analizador sintáctico ascendente v1.1 2005 José Fortes Gálvez– p.28 Cierre LR(1) del estado 1 ac: r1: r2: r3: r4: r5: r6: S’→S S→E=E S→f E→T E→E+T T→f T→T*f S’→•S,$ S→•E=E,$ S→•f,$ E→•T,= E→•E+T,= c Generación de analizador sintáctico ascendente v1.1 2005 José Fortes Gálvez– p.28 Cierre LR(1) del estado 1 ac: r1: r2: r3: r4: r5: r6: S’→S S→E=E S→f E→T E→E+T T→f T→T*f S’→•S,$ S→•E=E,$ S→•f,$ E→•T,= E→•E+T,= T→•f,= T→•T*F,= c Generación de analizador sintáctico ascendente v1.1 2005 José Fortes Gálvez– p.28 Cierre LR(1) del estado 1 ac: r1: r2: r3: r4: r5: r6: S’→S S→E=E S→f E→T E→E+T T→f T→T*f S’→•S,$ S→•E=E,$ S→•f,$ E→•T,= E→•E+T,= T→•f,= T→•T*F,= E→•T,+ E→•E+T,+ c Generación de analizador sintáctico ascendente v1.1 2005 José Fortes Gálvez– p.28 Cierre LR(1) del estado 1 ac: r1: r2: r3: r4: r5: r6: S’→S S→E=E S→f E→T E→E+T T→f T→T*f S’→•S,$ S→•E=E,$ S→•f,$ E→•T,= E→•E+T,= T→•f,= T→•T*F,= E→•T,+ E→•E+T,+ T→•f,* T→•T*F,* c Generación de analizador sintáctico ascendente v1.1 2005 José Fortes Gálvez– p.28 Cierre LR(1) del estado 1 ac: r1: r2: r3: r4: r5: r6: S’→S S→E=E S→f E→T E→E+T T→f T→T*f S’→•S,$ S→•E=E,$ S→•f,$ E→•T,= E→•E+T,= T→•f,= T→•T*F,= E→•T,+ E→•E+T,+ T→•f,* T→•T*F,* T→•f,+ T→•T*F,+ c Generación de analizador sintáctico ascendente v1.1 2005 José Fortes Gálvez– p.28 Cierre LR(1) del estado 1 ac: r1: r2: r3: r4: r5: r6: S’→S S→E=E S→f E→T E→E+T T→f T→T*f S’→•S,$ S→•E=E,$ S→•f,$ E→•T,= E→•E+T,= T→•f,= T→•T*F,= E→•T,+ E→•E+T,+ T→•f,* T→•T*F,* T→•f,+ T→•T*F,+ c Generación de analizador sintáctico ascendente v1.1 2005 José Fortes Gálvez– p.28 Cierre LR(1) del estado 1 ac: r1: r2: r3: r4: r5: r6: S’→S S→E=E S→f E→T E→E+T T→f T→T*f S’→•S,$ S→•E=E,$ S→•f,$ E→•T,= E→•E+T,= T→•f,= T→•T*F,= E→•T,+ E→•E+T,+ T→•f,* T→•T*F,* T→•f,+ T→•T*F,+ c Generación de analizador sintáctico ascendente v1.1 2005 José Fortes Gálvez– p.28 Cierre LR(1) del estado 1 ac: r1: r2: r3: r4: r5: r6: S’→S S→E=E S→f E→T E→E+T T→f T→T*f S’→•S,$ S→•E=E,$ S→•f,$ E→•T,= E→•E+T,= T→•f,= T→•T*F,= E→•T,+ E→•E+T,+ T→•f,* T→•T*F,* T→•f,+ T→•T*F,+ c Generación de analizador sintáctico ascendente v1.1 2005 José Fortes Gálvez– p.28 Cierre LR(1) del estado 1 ac: r1: r2: r3: r4: r5: r6: S’→S S→E=E S→f E→T E→E+T T→f T→T*f S’→•S,$ S→•E=E,$ S→•f,$ E→•T,= E→•E+T,= T→•f,= T→•T*F,= E→•T,+ E→•E+T,+ T→•f,* T→•T*F,* T→•f,+ T→•T*F,+ c Generación de analizador sintáctico ascendente v1.1 2005 José Fortes Gálvez– p.28 Tabla LR(1) de GSET $ ac: r1: r2: r3: r4: r5: r6: S’→S S→E=E S→f E→T E→E+T T→f T→T*f Tabla SLR(1) Autómata LR(0) Autómata LR(1) 1 2 3 4 5a 5b 6 7a 7b 8a 8b 9 10a 10b 11a 11b 12a 12b = f 4 + * S E T 2 3 5a ac 6 r2 r5 r3 r3 7a r5 r5 r3 8a r3 8b 10b 10a 10b 12a 12b r1 r5 r5 r4 r4 r6 r6 9 5b 11a 11b 7b r5 r5 r4 r4 r6 r6 r5 r5 8a 8b r6 r6 c Generación de analizador sintáctico ascendente v1.1 2005 José Fortes Gálvez– p.29 El problema del tamaño de LR(k) Es el método más potente posible de avance-reducción con k símbolos de ventana Calcula exactamente qué siguientes corresponden a cada ítem de cada estado Ello provoca una “explosión” de estados conforme k crece Tradicionalmente considerado inviable para k ≥ 1 Solución tradicional: LALR(1) c Generación de analizador sintáctico ascendente v1.1 2005 José Fortes Gálvez– p.30 De LR(1) a LALR(1) LR(1) replica los estados LR(0) Añadiendo distintas ventanas Igual parte LR(0) (corazón [core]) Si fusionamos estados LR(1) de igual corazón Recuperamos autómata LR(0) Conservamos parte de la información de contexto en las ventanas LR(1) Conclusión: LALR(1) de potencia intermedia entre LR(0) y LR(1) Tradicionalmente considerado suficiente en la práctica c Generación de analizador sintáctico ascendente v1.1 2005 José Fortes Gálvez– p.31 Generación de LALR(1) en yacc Demasiado costoso construir primero LR(1) Se parte de una construcción de núcleos LR(0) y se aplica un proceso iterativo: El cálculo del cierre nos proporciona (inicialmente sólo algunos) valores para las ventanas de los ítems Se propagan estos valores a través de transiciones y cierres Se compacta la tabla con valores por defecto: Filas en zona de acción: reducción o error más frecuente (da lugar a reducciones adicionales en caso de error) Columnas en zona de saltos: más frecuente c Generación de analizador sintáctico ascendente v1.1 2005 José Fortes Gálvez– p.32 Autómata LALR(1) ac: r1: r2: r3: r4: r5: r6: S’→S S→E=E S→f E→T E→E+T T→f T→T*f LR(1) SLR(1) Estado Items 1 S’→•S,$ S→•E=E,$ E→•E+T,=+ S→•f,$ T→•f,=*+ E→•T,=+ T→•T*f,=*+ 2 S’→S•,$ 3 S→E•=E,$ E→E•+T,=+ 4 S→f•,$ T→f•,=*+ 5 E→T•,=+$ T→T•*f,=*+$ 6 S→E=•E,$ E→•E+T,$+ E→•T,$+ T→•T*f,$*+ T→•f,$*+ 7 E→E+•T,=+$ T→•T*f,=+*$ T→•f,=+* 8 T→T*•f,=*+$ 9 S→E=E•,$ E→E•+T,$+ 10 T→f•,=+*$ 11 E→E+T•,=+$ T→T•*f,=+*$ 12 T→T*f•,=*+$ Transic. Sı́mbolos:Acciones S:2 f:Avanzar E:3 f:4 T:5 $:Aceptar =:6 =+:Avanzar +:7 $:Reducir S→f =*+:Reducir T→f =+$:Reducir E→T *:8 *:Avanzar E:9 f:Avanzar T:5b f:10b T:11 f:Avanzar f:10 f:12 f:Avanzar $:Reducir S→E=E +:7b +:Avanzar =+*$:Reducir T→f =+$:Reducir E→E+T *:8 *:Avanzar =*+$:Reducir T→T* c Generación de analizador sintáctico ascendente v1.1 2005 José Fortes Gálvez– p.33 Tabla LALR(1) de GSET ac: r1: r2: r3: r4: r5: r6: S’→S S→E=E S→f E→T E→E+T T→f T→T*f Tabla LR(1) Tabla SLR(1) Aut. LR(0) $ 1 2 3 4 5 6 7 8 9 10 11 12 = f 4 + * S E T 2 3 5 ac 6 r2 r5 r3 r3 7 r5 r5 r3 8 10 10 12 r1 r5 r5 r4 r4 r6 r6 9 5 11 7 r5 r5 r4 8 r6 r6 c Generación de analizador sintáctico ascendente v1.1 2005 José Fortes Gálvez– p.34 Familias de gramáticas LR, LALR y LL LR(0) LALR(1) LALR(2) LALR LL(1) LR(1) LL(2) LR(2) LR LL Además, las SLR(k) están incluídas en LALR(k), y guardan la misma relación con las demás c Generación de analizador sintáctico ascendente v1.1 2005 José Fortes Gálvez– p.35 Familias de lenguajes LR y LL LR(0) LL(1) LL(2) SLR(1)=· · · =LR LL (Un lenguaje L es de una familia F si y sólo si existe un gramática del tipo F para L) Toda gramática LR(k) puede transformarse en LR(1), LALR(1) y SLR(1) c Generación de analizador sintáctico ascendente v1.1 2005 José Fortes Gálvez– p.36 Ambigüedad y LALR Todas las gramáticas LR son no-ambiguas (¡pero no al revés!) Aunque el lenguaje a compilar sea no-ambiguo, a veces puede ser interesante usar una gramática más simple pero ambigua Ejemplo: if-then-else es típicamente LALR pero más natural y simple expresarlo de forma ambigua instr→if cond then instr instr→if cond then instr else instr instr→· · · Ello provoca conflictos en la tabla LALR que el usuario puede intentar “resolver” manualmente c Generación de analizador sintáctico ascendente v1.1 2005 José Fortes Gálvez– p.37 Tabla LALR(1) para gramática ambigu ac: r1: r2: r3: r4: S’→E E→E-E E→E*E E→(E) E→a 1 2 3 4 5 6 7 8 9 10 $ - * ac 5 6 ( 3 ) 3 r4 r4 r4 r1 r2 r3 6 r1,6 r2,6 r3 E 2 4 7 4 4 8 9 r4 3 3 5 r1,5 r2,5 r3 a 4 10 r1 r2 r3 c Generación de analizador sintáctico ascendente v1.1 2005 José Fortes Gálvez– p.38 Autómata LALR(1) para gramática ambigua E→E-E|E*E|(E)|a Estado Items 1 S’→•E,$ E→•E-E,$-* E→•E*E,$-* E→•(E),$-* E→•a,$-* 2 S’→E•,$ E→E•-E,$-* E→E•*E,$-* 3 E→(•E),$-*) E→•E-E,)-* E→•E*E,)-* E→•(E),)-* E→•a,)-* 4 E→a•,$-*) 5 E→E-•E,$-*) E→•E-E,$-*) E→•E*E,$-*) E→•(E),$-*) E→•a,$-*) 6 E→E*•E,$-*) E→•E-E,$-*) E→•E*E,$-*) E→•(E),$-*) E→•a,$-*) 7 E→(E•),$-*) E→E•-E,)-* E→E•*E,)-* 8 E→E-E•,$-*) E→E•-E,$-*) E→E•*E,$-*) 9 E→E*E•,$-*) E→E•-E,$-*) E→E•*E,$-*) 10 E→(E)•,$-*) Transic. Sı́mbolos:Acciones E:2 (a:Avanzar (:3 a:4 $:Aceptar -:5 -*:Avanzar *:6 E:7 (a:Avanzar (:3 a:4 $:Reducir E→a E:8 (a:Avanzar (:3 a:4 E:9 (a:Avanzar (:3 a:4 ):10 )-*:Avanzar -:5 *:6 $-*):Reducir E→E-E -:5 -*:Avanzar *:6 $-*):Reducir E→E*E -:5 -*:Avanzar *:6 $-*):Reducir E→(E) c Generación de analizador sintáctico ascendente v1.1 2005 José Fortes Gálvez– p.39 Estudio de casos conflictivos Estado 8, ventana - E E E - E - E Reducir E E E - E - E Avanzar Items c Generación de analizador sintáctico ascendente v1.1 2005 José Fortes Gálvez– p.40 Estudio de casos conflictivos Estado 8, ventana * E E E - E * E Reducir E E E - E * E Avanzar Items c Generación de analizador sintáctico ascendente v1.1 2005 José Fortes Gálvez– p.40 Estudio de casos conflictivos Estado 9, ventana - E E E * E - E Reducir E E E * E - E Avanzar Items c Generación de analizador sintáctico ascendente v1.1 2005 José Fortes Gálvez– p.40 Estudio de casos conflictivos Estado 9, ventana * E E E * E * E Reducir E E E * E * E Avanzar Items c Generación de analizador sintáctico ascendente v1.1 2005 José Fortes Gálvez– p.40 Tabla LALR(1) con ambigüedad resuelt ac: r1: r2: r3: r4: S’→E E→E-E E→E*E E→(E) E→a Tabla original 1 2 3 4 5 6 7 8 9 10 $ - * ac 5 6 ( 3 ) 3 r4 r4 r4 r1 r2 r3 6 6 r2 r3 E 2 4 7 4 4 8 9 r4 3 3 5 r1 r2 r3 a 4 10 r1 r2 r3 c Generación de analizador sintáctico ascendente v1.1 2005 José Fortes Gálvez– p.41 Resolución de ambigüedad en yacc (1/2 En conflictos reducción-reducción se reduce la regla más arriba en el texto Para conflictos avance-reducción genera un avance por defecto, pero podemos asociar a los símbolos terminales (y a las reglas): Precedencia: cuál de dos terminales próximos de distinta precedencia se reduce antes Asociatividad: en caso de igual precedencia, si se reduce primero (a) el de la izquierda, (b) el de la derecha ó (c) no es posible Si no se especifica, la regla recibe mismos valores que su terminal más a la derecha c Generación de analizador sintáctico ascendente v1.1 2005 José Fortes Gálvez– p.42 Resolución de ambigüedad en yacc (2/2 El generador no informa sobre si lo que hacemos es correcto o no. Es un recurso manual de cierto riesgo, incompletamente documentado (conflictos múltiples). A usar sólo en casos típicos de ambigüedad. c Generación de analizador sintáctico ascendente v1.1 2005 José Fortes Gálvez– p.43 Formato de un fichero bison Declaraciones en C entre %{ y %} Declaraciones especiales comenzadas por % %% Secuencia de reglas BNF, con acciones en C entre llaves que se ejecutarán al alcanzar ese punto el análisis: Normalmente al final de la regla (al reducir, pues) En otro punto de la parte derecha: bison inserta allí un nuevo símbolo ad-hoc Ih y añade una regla Ih →ε (tras cuya reducción se ejecutan las acciones), lo que puede introducir conflictos %% Rutinas auxiliares —al menos yyerror(char*)— y/o main si programa independiente c Generación de analizador sintáctico ascendente v1.1 2005 José Fortes Gálvez– p.44 Generación micomp.y bison micomp.tab.c gcc -d -v micomp.output micomp micomp.tab.h milex.l flex lex.yy.c 1. 2. Editamos un fichero de especificación micomp.y Normalmente junto con un analizador léxico flex (con #include “micomp.tab.h”): 2.1 bison -d micomp.y 2.2 flex milex.l 3. Si usamos main() que llame a yyparse(): gcc -o micomp micomp.tab.c lex.yy.c -lfl c Generación de analizador sintáctico ascendente v1.1 2005 José Fortes Gálvez– p.45 Contenido de micomp.tab.c 1. 2. 3. Declaraciones C iniciales copiadas Función yyparse() que analiza entrada según tabla LALR(1): Invoca yylex() automáticamente (códigos de símbolos en micomp.tab.h) En caso de error invoca yyerror(char*) e intenta recuperación (resincronización) Va ejecutando los bloques de código C en el orden de avance-reducción Rutinas auxiliares copiadas c Generación de analizador sintáctico ascendente v1.1 2005 José Fortes Gálvez– p.46 Símbolos y declaraciones Los símbolos terminales pueden aparecer como: Caracter entre apóstrofos Nombre (al que bison asocia un código), que hay que declarar p.e.: %token NOMBRE Posibilidad de declarar operadores en orden de menor a mayor precedencia, indicando asociatividad: %left, %right ó %nonassoc NOMBRE Para asociar precedencia/asociatividad a una regla se le añade %prec NOMBRE (es posible definir token auxiliar) %start nombre S permite declarar el símbolo inicial c Generación de analizador sintáctico ascendente v1.1 2005 José Fortes Gálvez– p.47 Reglas y valores (atributos) de símbolos Formato reglas BNF: A : X1 · · · Xn |...|...; En las acciones, $i son atributos en la pila de análisis asociados a Xi , y si i =0,-1,..., corresponden a posiciones de la pila hacia el fondo. Normalmente $$ (correspondiente a A) se calcula a partir de $i En flex ponemos el valor (¡no el código!) del token en yylval de tipo YYSTYPE Podemos hacer YYSTYPE distinto de int, declarando %union {....} y asociamos: %token <campo¿nomb term (o %left, etc.) %type <campo¿nomb noterm1,nomb noterm2,... Podemos usar asimismo $<campo¿i para $i (ídem $$) c Generación de analizador sintáctico ascendente v1.1 2005 José Fortes Gálvez– p.48 Algunas acciones especiales la ponemos a 6= 0 para que se visualice el análisis (precisa #define YYDEBUG 1 u opción -t) YYABORT,YYACCEPT: terminan el analizador con indicación de fracaso o éxito (0) YYERROR: fuerza iniciar recuperación de error Se puede llamar antes a yyerror(“...”) yyerrok: fuerza retorno a modo no-error yyclearin: borra antigua ventana errónea tras recuperación YYRECOVERING(): devuelve 6= 0 si está en modo error yydebug: c Generación de analizador sintáctico ascendente v1.1 2005 José Fortes Gálvez– p.49 Detección de errores en LR y bison LR detecta error en cuanto (tras un avance) la secuencia pila más ventana deja de ser legal (detección inmediata de errores) Debido a la fusión de estados, LALR sólo garantiza que la pila es legal. Se permiten reducciones adicionales, pero no se avanza en la entrada más allá de lo que lo haría LR (prefijo correcto). Las compactaciones de tabla de bison permiten algunas reducciones más, pero conservan la propiedad de prefijo correcto. c Generación de analizador sintáctico ascendente v1.1 2005 José Fortes Gálvez– p.50 Tratamiento de errores en bison El token especial error en partes derechas posibilita cierta recuperación ante errores. Mecanismo ante error (vía YYERROR entra por 2): 1. Invoca yyerror(“parse error”) 2. Mientras no pueda avanzar un token error, elimina el estado en la cima de la pila. Avanza el token error. 3. Mientras no pueda reanudar el análisis, elimina el terminal de la ventana y lee el siguiente. Reanuda el análisis. 4. Si consigue avanzar 3 terminales seguidos sin nuevo error: fin de la recuperación. Si no, vuelve al punto 2. 5. Si se acaba la pila, aborta análisis c Generación de analizador sintáctico ascendente v1.1 2005 José Fortes Gálvez– p.51 Ejemplo bison (1/3) /* miint.y: evaluador de lista de expresiones */ %{ #include <stdio.h> extern FILE *yyin; /* declarado en léxico */ extern int numlin; /* léxico le da valores */ int yydebug=1; /* modo debug si -t */ %} %union { float real; int entero; } %token <real> REAL %token <entero> ENTERO %type <real> exp %left ’-’ %left ’*’ c Generación de analizador sintáctico ascendente v1.1 2005 José Fortes Gálvez– p.52 Ejemplo bison (2/3) %% lista : exp {printf("%f\n", $1);} ’;’ lista | /* admite 0 expresiones */ | error ’;’ {printf(" en expresion\n");} lista ; exp : | | | | ; exp ’-’ exp exp ’*’ exp ’(’ exp ’)’ REAL ENTERO {$$ {$$ {$$ {$$ {$$ = = = = = $1 - $3;} $1 * $3;} $2;} $1;} $1;} c Generación de analizador sintáctico ascendente v1.1 2005 José Fortes Gálvez– p.53 Ejemplo bison (3/3) %% int main(int argc, char** argv) { if (argc>1) yyin=fopen(argv[1],"r"); yyparse(); } void yyerror(char* mens) { printf("Error en linea %i: %s ",numlin,mens); } c Generación de analizador sintáctico ascendente v1.1 2005 José Fortes Gálvez– p.54 Ejemplo bison: fichero flex asociado %{ #include "miint.tab.h" int numlin=1; %} dig [0-9] %% {dig}+ {yylval.entero=atoi(yytext); return ENTER {dig}+\.{dig}+ {yylval.real=atof(yytext); return REAL;} \n numlin++; [ \t] | ˆ#.* [*-;()] return yytext[0]; . yyerror("error lexico"); %% c Generación de analizador sintáctico ascendente v1.1 2005 José Fortes Gálvez– p.55 Conclusión LR(1) y LALR(1) permiten considerable flexibilidad para definir una gramática Es necesario usar un generador automático, dada la complejidad del cálculo Restricciones al orden en que se ejecutan las acciones semánticas y flujo de valores de atributos Más información en info bison y en libro “lex & yacc”, de Levine et al. (681.3.06) c Generación de analizador sintáctico ascendente v1.1 2005 José Fortes Gálvez– p.56