TEMA 3. ANÁLISIS ASCENDENTE Gramáticas de Precedencia PROCESADORES DE LENGUAJES 4o Informática http://ccia.ei.uvigo.es/docencia/PL 14 de enero de 2008 – FJRP 2007 ccia PL – 3.1 Analizadores sintácticos de Desplazamiento-Reducción Definición (Algoritmo salto-reducción) Sea G = (N, Σ, P, S) una GIC con P = {P1, P2, . . . , Pn}. Un algoritmo de salto-reducción a(f, g) para G , está definido por un par de funciones : f : función de salto-reducción ∗ ∗ f : Γ ×(Σ∪{$}) → {salto, reduccion, error, aceptar} g : función de reducción ∗ ∗ g : Γ × (Σ ∪ {$}) → {1, 2, · · · , n} con: $: sı́mbolo de fin de cadena y fin de pila Γ: alfabeto de la pila (Γ = N ∪ Σ ∪ {$}) Funcionamiento (análisis ascendente) Recorrido de la entrada de IZQ. a DER. Uso de una pila de sı́mbolos función f : decide la acción a realizar a partir del contenido de la pila y del texto que queda por analizar • Si acción=salto: se añade a la pila el sı́mbolo actual de entrada y se avanza una posición en la entrada • Si acción=reducir: la función g determina la regla a reducir (regla Pi) ◦ Se elimina de pila los sı́mbolos del lado derecho de la regla Pi ◦ Se añade a pila el sı́mbolos del lado izquierdo de la regla Pi – FJRP 2007 ccia PL – 1 Definición (Configuración) Una configuración de un analizador salto-reducción es un triple: ($X1X2 · · · Xm, a1a2 · · · an$, P1P2Pr ) Xm en la cima Xi ∈ N ∪ Σ a1a2 · · · an$: es lo que queda por analizar de la entrada donde: ai ∈ Σ, a1: sı́mbolo actual y $: fin de entrada P1P2Pr : cadena de reglas usadas para reducir el texto original w a X1X2 · · · Xma1a2 · · · an. Configuración incial: ($, w$, ε) $X1X2 · · · Xm: representa la pila con Definición (Acción) Una acción para un analizador salto-reducción a(f, g) está determinado por las funciones f y g que relacionan pares de r s configuraciones (`: reducción, `: salto). s f (α, aw0) = salto ⇒ (α, aw0, Π) ` (αa, w0, Π) f (αβ, w) = reduccion ff ri g(αβ, w) = i ⇒ (αβ, w, Π) ` (αA, w, Πi) Pi = A → β f (α, w) = aceptar ⇒ (α, w, Π) ` aceptar f (α, w) ` error, en otro caso Π representará el conjunto de reglas empleadas en un análisis sintáctico por la derecha de la cadena w Nota: Normalmente f y g no dependerán de la totalidad de la pila, sino únicamente de algunos sı́mbolos de su cima. Se puede resumir la notación: f (γα, xw0 ) ≡ f (α, x) g(γα, xw0 ) ≡ g(α, x) En la práctica no será necesario definir las funciones f y g explicitamente. Se consultará directamente la tabla de relaciones de precedencia. – FJRP 2007 ccia PL – 2 Ejemplo: Para G definida por: » (1) (2) S → SaSb S→ε – Función f : f (αS, cx) = salto si c ∈ {a, b} f (αc, dx) = reducc si c ∈ {a, b} y d ∈ {a, b} f ($, ax) = reducc f (αb, $) = reducc f (αX, $) = error si X ∈ {S, a} f ($, bx) = error f ($S, $) = aceptar f ($, $) = error Función g : g($, ax) = 2 g(αa, cx) = 2, si c ∈ {a, b} g($SaSb, cx) = 1, si c ∈ {a, $} g(αaSaSb, cx) = 1, si c ∈ {a, b} g(α, x) = error, en otro caso Análisis de w = aabb ($, aabb$, ε) ` . . . – FJRP 2007 ccia PL – 3 3.2 Gramáticas de precedencia simple Tipo más simple de gramáticas que admiten analizadores salto-reducción Definición (Relaciones de precedencia de Wirth-Weber) Sea G = (N, Σ, P, S) una GIC, se definen las relaciones de precedencia de Wirth-Weber sobre N ∪ Σ de la forma: + 1. X l Y ⇔ ∃A → αXBβ ∈ P tal que B ⇒ Yγ . 2. X = Y ⇔ ∃A → αXYβ ∈ P 8 + < B⇒ γX 3. X m a ⇔ ∃A → αB Yβ ∈ P tal que ∗ : Y ⇒ aδ donde X, Y ∈ (N ∪ Σ ∪ {$}) y a ∈ Σ. 0 (Observar que tenemos Y = a, δ = ε si Y ⇒ aδ ) Nota: Mayor precedencia si ”está más abajo” (se reduce antes) En un árbol de derivación: 1. X l Y si X está en un nivel superior a Y . 2. X = Y si X está en el mismo nivel que Y 3. X m a si X está en un nivel superior o igual a a y, además, X va inmediatamente antes de a. Graficamente: Para el sı́mbolo $: – FJRP 2007 ccia PL – 8 ∗ < $ l Z, ∀Z tal que S ⇒ Zα ∗ : Z m $, ∀Z tal que S ⇒ αZ 4 Definición (Gramática propia y gramática inversible) + Una GIC G = (N, Σ, P, S) sin reglas nulas (A ⇒ A), sin sı́mbolos inútiles y sin reglas-ε se dice que es una gramática propia Una GIC G = (N, Σ, P, S) se dice inversible si y sólo si: ∀ A→α ∈P B→α ∈P ff „ ⇒A=B no hay 2 reglas con « igual parte derecha Definición (Gramática de precedencia y precedencia simple) Sea G = (N, Σ, P, S) una GIC propia, tal que como mucho existe una única relación Wirth-Weber entre cualquier par de sı́mbolos de N ∪Σ. Entonces G es una gramática de precedencia. Una gramática de precedencia, que además sea inversible, se dice que es una gramática de precedencia simple Ejemplo: Tabla de relaciones de precendecia para G definida por – FJRP 2007 ccia PL – » S → aSSb S→c – 5 Lema: (Propagación de relaciones precedencia) Sea G = (N, Σ, P, S) una GIC propia, tenemos: ff . X l A ó X = A 1. ⇒XlY A → Yα ∈ P ff . A l a ó A = a ó A m a 2. ⇒Xma A → αX ∈ P Teorema: (Base del funcionamiento de los analizadores de precedencia) Sea G = (N, Σ, P, S) una GIC propia. Para cualquier derivación de la forma: n $S$ ⇒ Xp Xp−1 · · ·Xk+1 Aa1 · · ·aq ⇒ Xp Xp−1 · · ·Xk+1 Xk · · ·X1 a1 · · ·aq (se aplicó la regla A → Xk · · ·X1 ) se verifica: . 1. Xi+1 l Xi ó Xi+1 = Xi , ∀p < i < k 2. Xk+1 l Xk . 3. Xi+1 = Xi , ∀k > i ≥ 1 4. X1 m a1 Si además G es una gramática propia, no habrá otras relaciones entre esos sı́mbolos. – FJRP 2007 ccia PL – 6 Corolario: Toda gramática de precedencia simple es no ambı́gua Demostración: Para cualquier secuencia de sı́mbolos β debe existir un único α tal que α ⇒ β . (Es decir, queremos demostrar que la regla aplicada en cualquier derivación α ⇒ β debe ser única) En el teorema anterior, tomamos α = XpXp−1· · ·Xk+1Aa1· · ·aq Suponiendo que se usa una regla A → Xk · · ·X1, tenemos: α ⇒ XpXp−1· · ·Xk+1Xk· · ·X1a1· · ·aq = β En este caso: 1. La secuencia a reducir puede identificarse está entre el l más a la derecha y el siguiente m 2. La gramática es de precedencia simple y por lo tanto inversible no hay dos reglas con igual parte derecha Por (1) y (2), en cualquier derivación α ⇒ β , la regla aplicar siempre será única. Nota: Esta forma de identificar las secuencias a reducir nos indica como se definirán las funciones f y g que controlan al analizador salto-reducción. – FJRP 2007 ccia PL – 7 Generación de analizadores de precedencia simple Entrada: Una GIC G = (N, Σ, P, S) de precedencia simple con P = {P1 , . . . , Pn } Salida: El algoritmo de precedencia simple (f, g) para G el TOP de la pila La función de acciones f dependerá sólo de el siguiente sı́mbolo de entrada Se define f :(N ∪ Σ ∪ {$}) × (Σ ∪ {$}) → {salto, reducc., aceptar, error } como: . f (X, a) = salto si X l a ó X = a a f (X, a) = reducción si X m a f ($S, $) = aceptar f (X, a) = error en otro caso 8 < 1: recorrer entrada de Izq. a Der., consultando la cima de la pila . 2: salto (meter en pila) mientras tengamos ”=” ó ”l” Resumen: : 3: reducir al encontrar un ”m” La función de reducción g depende sólo de la pila Se define g : (N ∪ Σ ∪ {$}) → {1, 2, . . . , n} como: 8 < Xk+1 l Xk . Xj+1 = Xj , ∀k > j ≥ 1 g(Xk+1 Xk Xk−1 · · · X1 , ε) = i si : Pi = A → Xk Xk−1 · · · X1 g(α, ε) = error en otro caso Resumen: 1: buscar cadena a reducir recorriendo pila hasta encontrar primer ”l” 2: sólo puede haber una regla con ese lado derecho Ejemplo: Analizador de precedencia simple para G definida por » S → aSSb S→c – Análisis de w = accb – FJRP 2007 ccia PL – 8 Conflictos de análisis Si la gramática no es de predecencia simple, aparecerá más de una relación en alguna casilla de la tabla de precedencia Conflictos salto-reducción . • Hay casillas con ”=” y ”m” o con ”l” y ”m” . • Se puede seguir metiendo en la pila (salto)[=, l] o bien reducir la regla que corresponda [m]. • Condición necesaria (pero no suficiente): el lado derecho de una regla es prefijo del lado derecho de otra distinta. Conflictos reducción-reducción . • Hay casillas con ”=” y ”l” • Se puede reducir la secuencia actualmente seleccionada en la cima . de la pila [l] o seguir buscando [=] en la pila otra secuencia mayor para reducir una regla distinta. • Condición necesaria (pero no suficiente): el lado derecho de una regla es sufijo del lado derecho de otra distinta. También hay conflicto reducción-reducción si la gramática no es inversible (hay 2 reglas con igual lado derecho, A → β y B → β ) – FJRP 2007 ccia PL – 9 3.3 Gramáticas de precedencia extendida Idea básica: Extender las relaciones de precedencia para considerar parejas de cadenas de sı́mbolos Definición (Relaciones de precedencia extendida (m, n)) Sea G = (N, Σ, P, S) una GIC propia, se definen las relaciones de precedencia (m, n) sobre (N ∪ Σ ∪ {$})m × (N ∪ Σ ∪ {$})n como sigue: Dada una derivación m n ∗ $ S$ ⇒ Xp Xp−1 · · ·Xk+1 Aa1 · · ·aq ⇒ Xp Xp−1 · · ·Xk+1 Xk · · ·X1 a1 · · ·aq entonces: 8 α sufijo de longitud m de Xp Xp−1 · · · Xk+1 > > < 8 < β prefijo de longitud n de Xk · · · X1 a1 · · · aq 1. α l β ⇔ ó > > : : β ∈ firstn (Xk · · · X1 a1 · · · aq ) si Xk ∈ Σ . 2. α = β ∀j, 8 1≤j <k α sufijo de longitud m de Xp Xp−1 · · · Xj+1 > > < 8 < β prefijo de longitud n de Xj Xj−1 · · · X1 a1 · · · aq verificando ó > > : : β ∈ firstn (Xj Xj−1 · · · X1 a1 · · · aq ) si Xj ∈ Σ 3. XmXm−1 · · · X1 m a1 · · · an Nota: . Las relaciones l = y m se establecen entre pares de cadenas Esas relaciones se calculan sobre derivaciones (no directamente sobre las reglas) Definición (Gramática de precedencia (m, n)) Sea G = (N, Σ, P, S) una GIC propia, decimos que es una gramática de precedencia (m, n) si y sólo si las relaciones de precedencia (m, n) que se pueden establecer en ella son disjuntas dos a dos. Nota: Siendo G una GIC, entonces G es una gramática de precendencia simple ⇔ G es una gramática de precendencia (1, 1) – FJRP 2007 ccia PL – 10 Nota: Como en precedencia simple la cadena de sı́mbolos a reducir estará delimitada por las relaciones ”l” y ”m”. . Antes de la cadena a reducir: tenemos l o = entre pares de subcadenas de longitud m y n (estarán en la pila del analizador) . En la subcadena a reducir: sólo habrá = entre pares de subcadenas de longitud m y n. Entre los m últimos sı́mbolos de la cadena a reducir y los siguientes n terminales hay una relación m Generación de analizadores de precedencia (m, n) Entrada: Una GIC G = (N, Σ, P, S) de precedencia (m, n) con P = {P1 , . . . , Pn } Salida: El algoritmo de precedencia (m, n) (f, g) para G los primeros m elemtos. de la pila La función de acciones f dependerá de los siguientes n sı́mbolos de entrada m n Se define f :(N ∪Σ∪{$}) ×(Σ∪{$}) → {salto, reducc., aceptar, error }: 8 < Xm · · · X1 l a1 · · · an ó f (Xm · · · X1 , a1 · · · an ) = salto si : . Xm · · · X1 = a1 · · · an f (Xm · · · X1 , a1 · · · an ) = reducción si Xm · · · X1 m a1 · · · an a f ($m−1 S, $n ) = aceptar f (Xm · · · X1 , a1 · · · an ) = error en otro caso La función de reducción g depende sólo de la cadena de sı́mbolos presentes en la cima de la pila Se define de modo análogo al caso de precedencia simple Localizar cadena a reducir recorriendo pila hasta encontrar primer ”l” – FJRP 2007 ccia PL – 11 3.4 Gramáticas de precedencia débil . Idea básica: Relajar la relaciones de precedencia simple l, =, m . Se exige que ”m” sea disjunta de ”l” y ”=” . Se permite que ”l” y ”=” no sean disjuntos (Se permiten casillas con esas 2 relaciones [conflictos reducción-reducción]) Se complica la delimitación de la secuencia a reducir en la pila 1. Al detectar una relación m , se busca entre los sı́mbolos de la cima de la pila la regla o reglas cuya parte derecha encaje con esos sı́mbolos 2. Si hay más de una regla, se escoge aquella cuya parte derecha tenga mayor longitud Para evitar conflictos sólo una regla debe verificar (2) Definición (Gramática de precedencia débil) Sea G = (N, Σ, P, S) una GIC propia. Decimos que G es una gramática de precedecnia débil si y sólo si: . 1. La relación de precedencia m es disjunta del conjunto { l , =} ff A → αXβ . 2. ⇒Xl \B y X =\B B→β La condición (2) garantiza que ante dos reducciones posibles sólo se llegará a aplicar la reducción más larga. Como Xl \B . X = \B ff , no habrá ambiguedad en la pila a la hora de decidir si reducir ”β ” o ”seguir buscando” para reducir ”αXβ ” Siempre que la cima de la pila sea ”αXβ ” se reducirá la regla A → αXβ (regla más larga) y no B → β – FJRP 2007 ccia PL – 12 Ejemplo: La gramática G1 es de precedencia débil. E G1 : →E+T | +T |T →T ∗F |F T F → (E) | constante . Cumple la primera condición (sólo hay conflictos l, =) Para la segunda condición → estudiar los pares de reglas conflictivas ff ff ff E →E+T E → +T T →T ∗F E → +T E→T T →F Generación de analizadores de precedencia débil Entrada: Una GIC G = (N, Σ, P, S) de precedencia débil con P = {P1 , . . . , Pn } Salida: El algoritmo de precedencia débil (f, g) para G a Función de acciones f : (IDEM que precedencia simple) . f (X, a) = salto si X l a ó X = a f (X, a) = reducción si X m a f ($S, $) = aceptar f (X, a) = error en otro caso Función de reducción g : Pi ≡ B → β ∈ P g(Xβ, ε) = i si @A → αXβ ∈ P g(α, ε) = error en otro caso Se busca en la pila la reducción más larga que se corresponda con el lado derecho de alguna regla. – FJRP 2007 ccia PL – 13 3.5 Gramáticas de precedencia de operador Definición (Gramática de operador) Sea G = (N, Σ, P, S) una GIC, decimos que es una gramática de operador si y sólo si verifica las siguientes condiciones: 1. No tiene reglas-ε 2. Las partes derechas de las reglas no poseen 2 no terminales adyacentes (Se exige que siempre haya un terminal intercalado entre no terminales) Ejemplo: 2 E 6 6 G2 definida por 6 6 4 → EAE | (E) | −E | constante A →+ |− |∗ |/ |∧ 3 7 7 7 7 5 No es una gramática de operador (la regla E → EAE no cumple (2)). Sustituyendo A por sus partes derechas sı́ lo es. 2 0 6 G2 : 6 4 E →E+E |E−E |E∗E | E/E E 3 →E∧E 7 | (E) 7 5 | −E | constante Definición (Relaciones de precedencia de operador) Sea G = (N, Σ, P, S) una GIC, definimos las relaciones de . precedencia de operador l, =, m entre pares de sı́mbolos de Σ como sigue, siendo a y b terminales: a l b si ”a” cede la precedencia a ”b” (la precedencia de b es mayor) . a = b si ”a” tiene la misma precedencia que ”b” a m b si ”a” tiene mayor precedencia que ”b” Nota: Estas relaciones de precedencia se definen sólo entre pares de sı́mbolos terminales (≈ operadores) – FJRP 2007 ccia PL – 14 El funcionamiento de los analizadores de precedencia de operador es similar a los alnalizadores anteriores, se siguen usando las relaciones . l, =, m para delimitar la regla a reducir. La diferencia es que esas relaciones se establecen exclusivamente entre terminales. Suelen ser aplicables a gramáticas muy concretas, como las que definen expresiones aritméticas, expresiones lógicas y similares. Construcción de analizadores de precedencia de operador Entrada: Matriz de precedencias de operador para la GIC G = (N, Σ, P, S) Salida: El algoritmo de precedencia de operador (f, g) para G a La función de acciones f dependerá de: el terminal más cercano a la cima de la pila el siguiente sı́mbolo de entrada Se define f :(N ∪ Σ ∪ {$}) × (Σ ∪ {$}) → {salto, reducc., aceptar, error }: . f (αaZ, b) = salto si a l b ó a = b f (αaZ, b) = reducción si a m b f ($S, $) = aceptar f (α, b) = error en otro caso siendo Z ∈ N ∪ {ε}. La función de reducción g depende sólo de un conjunto de terminales presentes en la cima de la pila g(ak+1 ak ak−1 · · · a1 , ε) = i 8 < ak+1 l ak . aj+1 = aj ∀k < j ≤ 1 : Pi ≡ A → ak · · · ak−1 a1 Nota: representa la presencia opcional de un no terminal Localizar cadena a reducir recorriendo pila hasta encontrar primer ”l” – FJRP 2007 ccia PL – si 15 Construcción de las matrices de precedencia de operador Método intuitivo: Las relaciones de precedencia se establecen en base a las nociones clásicas de asociatividad y precedencia de operadores. Método formal: Parte de la construcción de una gramática esqueleto no ambigua para el lenguaje a analizar, donde se reflejará la asociatividad y la precedencia entre terminales. . Sobre esa gramática esqueleto se aplican las definiciones de l, =, m MATRIZ DE PRECEDENCIA DE OPERADORES. Método Intuitivo . Cálculo de l, =, m a partir de la asociatividad y precedencia de los operadores/terminales de la gramática Se usarán las siguientes reglas: 1. Si el operador Op1 tiene mayor precedencia que el operador Op1 m Op2 Op2 l Op1 Se garantiza que se reducirá antes la expresión asociada a Op1 2. Si Op 1 y Op2 sonffoperadores de igual precedencia (o son el mismo) Op1 m Op2 a) si Op1 y Op2 son asociativos por la izquierda Op2 m Op1 Se ff reducciones comenzarán por la IZQ.[ l a + bm + c] garantiza que las Op1 l Op2 si Op1 y Op2 son asociativos por la derecha b) Op2 l Op1 Se garantiza que las reducciones comenzarán por la DER.[a ∧l b ∧ cm ] Op2, entonces 3. Se definen las siguientes relaciones fijas • Op l operando Op m $ Op l ( operando m Op $ l Op (lOp Se reducen primero los operandos . • (=) $ l ( $ l operando (l( ) m $ operando m $ )m) Relaciones clásicas para los paréntesis ) m Op Opm) (loperando operandom) Nota: Operadores unarios (tienen preferencia sobre los demás) Siendo U un operador unario: • Op l U, ∀ Op operador (unario o binario) • U m Op, si U tiene mayor precedencia que Op • U l Op, si U tiene menor precedencia que Op – FJRP 2007 ccia PL – 16 2 Ejemplo: (1)E 0 6 (2) G2 : 6 4 (3) (4) →E+E |E−E |E∗E | E/E 3 →E∧E 7 | (E) 7 5 | −E | constante (5)E (6) (7) (8) Usando las prioridades habituales: ∧: asociativo por la DER. ∗, /: asociativo por la IZQ. con igual precedencia +, −: asociativo por la IZQ. con igual precedencia Precedencia de mayor a menor: ∧, [∗, /], [+, −], −(unario) Tabla de precedencia de operador + m m m m m m l m l + − ∗ / ∧ constante ( ) $ − m m m m m m l m l ∗ l l m m m m l m l / l l m m m m l m l ∧ l l l l l m l m l l l l l l ( l l l l l l l constante l ) m m m m m m . = m $ m m m m m m m l Análisis de w = 1 + 2 ∗ 3 + 4 s ($, 1 + 2 ∗ 3 + 4$, ε) ` $l1 r8 s 1m+ s $l+ r8 ($1, +2 ∗ 3 + 4$, ε) ` ($E, +2 ∗ 3 + 4$, 8) ` ($E+, 2 ∗ 3 + 4$, 8) ` ($E + 2, ∗3 + 4$, 8) ` 2m∗ +l2 s s ($E + E, ∗3 + 4$, 88) ` ($E + E∗, 3 + 4$, 88) ` +l∗ r8 ∗l3 r3 ($E + E ∗ 3, +4$, 88) ` ($E + E ∗ E, +4$, 888) ` ($E + E, +4$, 8883) 3m+ r1 ` +m+ s ∗m+ s ($E, +4$, 88831) ` r8 $l+ ($E+, 4$, 88831) ` ($E + 4, $, 88831) ` +l4 r1 4m$ ($E + E, $, 888318) ` ($E, $, 8883181) ` aceptar +m$ – FJRP 2007 ccia PL – 17 – FJRP 2007 ccia PL – 18