TEMA 3. AN´ALISIS ASCENDENTE Gramáticas de Precedencia

Anuncio
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
Descargar