Академический Документы
Профессиональный Документы
Культура Документы
Tema 3
Juan A. Bota Blaya
juanbot@um.es
http://ants.dif.um.es/staff/juanbot/traductores/traductores.html
y las Comunicaciones
Departamento de Ingeniera de la Informacion
Universidad de Murcia
Analisis
Sintactico
p.1/64
ndice
Introduccin al Anlisis Sintctico.
1. Objetivo del analizador sintctico
2. Gramticas libres de contexto y autmatas con pila
3. Anlisis sintctico ascendente y descendente
4. El problema de la ambigedad en el anlisis sintctico
5. Mtodos Universales de anlisis sintctico
(a) El mtodo de Cocke-Younger-Kasami
(b) El mtodo de Early
6. Transformaciones de gramticas
Analisis
Sintactico
p.2/64
Analisis
Sintactico
p.3/64
Analisis
Sintactico
p.4/64
Analisis
Sintactico
p.5/64
Analisis
Sintactico
p.6/64
.
.
.
(q,a+a*a,A)
(q,a+a*a,S+A)
(q,a+a*a,A+A)
(q,a+a*a,B+A)
.
.
.
(q,a+a*a,(S)+A)
.
.
.
(q,a+a*a,A*B+A)
.
.
.
(q,a+a*a,S+A+A)
(q,a+a*a,a+A)
(q,+a*a,+A)
(q,a*a,A)
.
.
.
(q,a*a,B)
(q,a*a,A*B)
(q,a*a,B*B)
(q,a*a,(S)*B)
(q,a*a,a*B)
.
.
.
(q,*a,*B)
(q,a,B)
(q,a,a)
(q,\,\)
Analisis
Sintactico
p.7/64
Analisis
Sintactico
p.8/64
D(G) = { / S = y (VN VT ) }
Definicin 9 El lenguaje definido por una gramtica G, denotado L(G) es el conjunto de
cadenas de smbolos terminales, que se pueden derivar partiendo del axioma de la
gramtica, y empleando para las derivaciones las reglas de P . E.d.:
L(G) = {x/S = x, y x T }
Definicin 10 Sea una gramtica G = (VN , VT , P, S). Sea una forma sentencial en
donde VT , VN y (VT VN ) . Una derivacin izquierda se obtiene
sustituyendo por alguna de las partes derechas que la definen.
Definicin 11 Sea una gramtica G = (VN , VT , P, S). Sea una forma sentencial en
donde (VT VN ) , VN y VT . Una derivacin derecha se obtiene sustituyendo
por alguna de las partes derechas que la definen.
Analisis
Sintactico
p.9/64
BF
BF
EC
puede verse
Bc
aCF
EbF
ECc
ECc
D
I
aCc
abF
Ebc
aCc
Ebc
aCc
Ebc
D
en el rbol
D Derivacin derecha
I Derivacin izquierda
ECF
abF
abc
abc
abc
abc
abc
abc
abc
abc
Analisis
Sintactico
p.10/64
Analisis
Sintactico
p.11/64
Analisis
Sintactico
p.12/64
Analisis
Sintactico
p.13/64
if
if
otra
if
expr
E1
then
prop
else
prop
S1
if
expr
E2
then
prop
S2
else
prop
S3
Analisis
Sintactico
p.14/64
prop
if
expr
E1
if
expr
E2
then
prop
if
expr
then
prop
else
prop
E1
then
prop
S1
else
prop
S2
S1
if
expr
E2
then
prop
S2
Analisis
Sintactico
p.15/64
Analisis
Sintactico
p.16/64
if
if
otra
entonces, para escribir una sentencia como la del ejemplo, y en la que se asocie el else al
segundo if quedara
if
Analisis
Sintactico
p.17/64
prop_emparejada
prop_no_emparejada
prop_emparejada
if expr then
otra
prop_no_emparejada
if
if
Analisis
Sintactico
p.18/64
Analisis
Sintactico
p.19/64
Algoritmo Cocke-Younger-Kasami
Basado en programacin dinmica
Poca aplicabilidad
Complejidad espacial proporcional a n2 (n longitud de
w)
Complejidad temporal proporcional a n3
Algoritmo de Early consigue complejidades lineales
para muchas gramticas LC
Necesita gramticas en CNF y libres
Analisis
Sintactico
p.20/64
CYK-Funcionamiento bsico
Sea w = a1 a2 . . . an con ai VT i = 1, . . . , n
El algoritmo construye una tabla T triangular, con elementos
tij VN , 1 i n y 1 j n i + 1,
j
t11
t12
t21
t22
t31
t13
t14
t23
t32
t41
Analisis
Sintactico
p.21/64
Analisis
Sintactico
p.22/64
CYK-Observaciones
Se trata de encontrar A, B, C tales que
C
z
}|
{
A
B
z }| {z }| {
a1 a2 . . . ai . . .. . . ai+j1 . . . an
hasta que al final tengamos
S
z
}|
{
D
E
z }| {z }| {
a1 a2 . . .. . . an
y por lo tanto podamos asegurar que
S DE + a1 a2 . . . E + a1 a2 . . . an
Analisis
Sintactico
p.23/64
Analisis
Sintactico
p.24/64
Analisis
Sintactico
p.25/64
1
2
3
4
5
1
2
3 4 5
{A} {S, A}
{S}
{A}
{A}
{S}
{A} {A, S}
{S}
Analisis
Sintactico
p.26/64
Analisis
Sintactico
p.27/64
1
2
3
4
5
1
2
3
4 5
{A} {S, A} {A, S}
{S}
{A}
{S}
{A}
{S}
{A, S}
{A} {A, S}
{S}
Analisis
Sintactico
p.28/64
Analisis
Sintactico
p.29/64
1
2
3
4
5
1 {A} {S, A} {A, S} {A,S}
2 {S}
{A}
{S}
{A, S}
3 {A}
{S}
{A, S}
4 {A} {A, S}
5 {S}
Hacer el paso 2, con j = 5 en clase, y completar la tabla T
con t1,5 .
Analisis
Sintactico
p.30/64
Especifiacin algortmica
Algoritmo 2 Derivacin ms a la izquierda a partir de la tabla T de parsing.
Entrada: una gramtica G = (VN , VT , P, S) en formato CNF, y en la que las
producciones de P estn numeradas de 1 a p, una cadena de entrada
w = a1 a2 an , y la tabla T generada por el algoritmo CYK.
Salida: una derivacin izquierda de w o un error.
Mtodo: se va a basar en el uso de una rutina recursiva gen(i, j, A) que va a generar
+
Analisis
Sintactico
p.31/64
Analisis
Sintactico
p.32/64
k=1
gen(2,4,A) m=4
k=1
gen(2,1,S) m=3
k=1
gen(3,3,A) m=5
k=1
gen(3,1,A) m=6
k=1
gen(4,2,5)m=2
k=1
gen(4,1,A) m=6
k=1
gen(5,1,S)m=3
Analisis
Sintactico
p.33/64
El algoritmo de Early
Complejidad proporcional a n2 si gramtica no es ambigua
Para lenguajes ms usados, complejidades espacial y temporal son
lineales
Partimos de
La gramtica G = (VN , VT , P, S), de tipo CFG.
Una cadena w = a1 a2 an , en donde w VT .
Un elemento [A X1 X2 Xk Xk+1 Xm , i] es lo que vamos a
denominar un item para la cadena w, si A X1 Xm P y
0 i n.
El punto es un smbolo adicional, y el entero k es tal que
0 k m.
Si la produccin es A entonces el item es [A , i]
Analisis
Sintactico
p.34/64
S A
a1 a i
ai+1 aj
Los ndices i y j delimitan el segmento de cadena en w que se produce por la cadena
que est a la izquierda del smbolo , si se observa la tercera derivacin.
Las dos derivaciones primeras aseguran que el prefijo izquierdo de la cadena, desde
a1 hasta ai se ha producido a partir del smbolo inicial de la gramtica.
La secuencia de listas de items generada, I 0 , I1 , . . . , In se denomina listas del parser,
para la cadena de entrada w.
w L(G) sii existe algn item en la forma [S , 0] In .
Analisis
Sintactico
p.35/64
Analisis
Sintactico
p.36/64
z
}|
{
a1 a2 . . . ai+1 ai+2 . . . aj1 aj . . . an
entonces, si a = aj podemos decir que
aaj
z
}|
{
a1 a2 . . . ai+1 ai+2 . . . aj1 aj . . . an
por lo tanto incluimos [B a , i] Ij
Analisis
Sintactico
p.37/64
z
}|
{
. . . ai+1 ai+2 . . . aj . . .
y como A entonces decimos tambin que
A
}|
z
}|
{
ai+1 ai+2 . . . aj
entonces, si tenemos que [B A, k] Ii significa que tenemos
A
}|
z
}|
{z
}|
{
ak+1 . . . ai ai+1 ai+2 . . . aj
por lo que hacemos [B A , k] Ij
Paso 6: anlogo al 3
Analisis
Sintactico
p.38/64
Ejemplo
Vemos la aplicacin del algoritmo con un ejemplo: sea G = (V N , VT , P, E) en donde P
viene dado por
1. E T + E
2. E T
3. T F T
4. T F
5. F (E)
6. F a
Y sea w = (a + a) a la cadena de entrada.
Segn el paso (1) aadimos a I0 los items [E T + E, 0] y [E T, 0].
Dado que la gramtica es libre, el paso (2) no incorpora ningn item adicional.
Si en el paso (3) hacemos = tenemos que incluir [T F T, 0] y [T F, 0].
En otra iteracin ms del paso (3) incluimos adems [F (E), 0], y [F a, 0].
Analisis
Sintactico
p.39/64
Ejemplo
No podemos incluir ms. El contenido de I0 queda:
[E T + E, 0]
[E T, 0]
[T F T, 0]
[T F, 0]
[F (E), 0]
[F a, 0]
As que pasamos a construir ahora I1 . Por el paso (4)
observamos que [F (E), 0] cumple que (= a1 , y por lo
tanto aadimos [F (E), 0] a I1 .
Analisis
Sintactico
p.40/64
Ejemplo
Por el paso (6), intentamos desplazar el metasmbolo a la derecha
del no-terminal E, y para ello aadimos [E T + E, 1] y
[E T, 1] a I1 . A su vez, estos generan la adicin de
[T F T, 1] y [T F, 1]. Estos generan tambin la
incorporacin de [F (E), 1], y [F a, 1]. I1 queda entonces con
el siguiente contenido:
[F (E), 0]
[E T + E, 1]
[E T, 1]
[T F T, 1]
[T F, 1]
[F (E), 1]
[F a, 1]
Construmos ahora I2 . Ahora a2 = a. Por el paso (4), aadimos
[F a, 1].
Analisis
Sintactico
p.41/64
Ejemplo
Ahora, por el paso (5) intentamos aprovechar el hecho de que se ha
reconocido parcialmente a para reducir el no-terminal que la
produce, y por ello introducimos [T F T, 1] y [T F , 1].
Dado que acabamos de aadir [T F , 1], nuevamente, por el paso
(5) aadimos [E T +E, 1] y [E T , 1]. Este ltimo causa la
introduccin de [F (E), 0]. Ahora, I2 est completo.
El contenido de I2 queda:
[F a, 1]
[T F T, 1]
[T F , 1]
[E T +E, 1]
[E T , 1]
[F (E), 0]
Analisis
Sintactico
p.42/64
Ejemplo
La coleccin de cjtos. de items queda:
I1
[F
[E
[E
[T
[T
[F
[F
(E), 0]
T + E, 1]
T, 1]
F T, 1]
F, 1]
(E), 1]
a, 1]
I2
[F
[T
[T
[E
[E
[F
(E), 0]
F T, 0]
F , 0]
T +E, 0]
T , 0]
[E
[E
[E
[T
[T
[F
[F
a, 1]
F T, 1]
F , 1]
T +E, 1]
T , 1]
(E), 0]
I5
[F
[T
[T
[E
[E
I3
T + E, 1]
T + E, 3]
T, 3]
F T, 3]
F, 3]
(E), 3]
a, 3]
I6
[T
[T
[T
[F
[F
F T, 0]
F T, 6]
F , 6]
(E), 6]
a, 6]
[F
[T
[T
[T
[E
[E
[F
[T
[T
[E
[E
[E
[F
I4
a, 3]
F T, 3]
F , 3]
T +E, 3]
T , 3]
T + E, 1]
(E), 0]
I7
a, 6]
F T, 6]
F , 6]
F T , 0]
T +E, 0]
T , 0]
Analisis
Sintactico
p.43/64
Analisis
Sintactico
p.44/64
Ejemplo
Vamos a obtener un rbol de derivacin, que defina una derivacin ms a la derecha
para
1.
2.
3.
4.
5.
6.
E T +E
ET
T F T
T F
F (E)
F a
Analisis
Sintactico
p.45/64
Ejemplo
Llamamos a R([T F T , 0], 7):
Paso 2: = F T , k = 3 y l = 7.
Paso 3b: Se ha de encontrar un [T , r] I7 tal que [T F T, 0] Ir .
Una opcin no vlida es [T F T , 0] porque [T F T.0]
/ I0 .
La opcin correcta es [T F , 6] ya que [T F T, 0] I 6 .
Llamamos a R([T F , 6], 7).
Paso 2: = F , k = 1 y l = 7.
Paso 3b: Se ha de encontrar un [F , r] I7 tal que [T F, 6] Ir . La
nica opcin es [F a, 6] porque [T F, 6] I6 .
Al llamar a R([F a, 6], 7) termina la ejecucin de esta rama.
Paso 3bcont: k = k 1. Termina.
Analisis
Sintactico
p.46/64
Ejemplo
Seguimos:
Seguimos con R([T F T , 0], 7)
Paso 3bcont: k = k 1, l = l 1.
Paso 3a: k = k 1, k = 1, l = l 1, l = 5.
Paso 3b: Se ha de encontrar un [F , r] I5 tal que [T F T, 0] Ir .
La nica opcin es [F (E), 0] y [T F T, 0] I0 .
Llamamos a R([F (E), 0], 5).
Paso 2: = (E), k = 3 y l = 5.
Paso 3a: k = k 1, k = 2, l = l 1, l = 4.
Analisis
Sintactico
p.47/64
Ejemplo
Paso 3b: Se ha de encontrar un [E , r] I4 tal que [F (E), 0] Ir .
Tenemos las opciones:
[E T +E, 3] y [E T , 3], no vlidas.
[E T + E, 1] vlida ya que [F (E), 0] I1 .
Llamamos a R([E T + E, 1], 4):
Paso 2: = T + E, k = 3 y l = 4
Paso 3b: Se debe encontrar un [E , r] I4 tal que [E T + E, 1] Ir .
1. [E T + E, 1] no es vlida
2. [E , 3] si ya que, [E T + E, 1] I3 .
Llamamos a R([E T , 3], 4)
Analisis
Sintactico
p.48/64
T
R([F (E), 0], 5)
R([T F , 6], 7)
R([F a, 6], 7)
)
E
R([T F , 1], 2)
R([T F T , 0], 7)
R([E T , 0], 7)
R([E T + E, 1], 4)
R([E T , 3], 4)
R([T F , 3], 4)
+
R([F a, 1], 2)
R([F a, 3], 4)
Analisis
Sintactico
p.49/64
Transformaciones de gramticas
1. Eliminacin de smbolos intiles
2. Gramtica -libre
3. Eliminacin de producciones unitarias
4. Eliminacin de la recursividad por la izquierda
5. Factorizacin
6. Forma normal de Chomsky
Analisis
Sintactico
p.50/64
Analisis
Sintactico
p.51/64
Analisis
Sintactico
p.52/64
Analisis
Sintactico
p.53/64
Analisis
Sintactico
p.54/64
Grmatica -libre
Definicin 17 Decimos que una gramtica l.c.
G = (VN , VT , S, P ) es -libre si cumple que en sus reglas de
produccin no aparece ninguna de la forma A , excepto a
los sumo S , con la condicin de que S no aparezca en la
parte derecha de ninguna otra regla de produccin.
Analisis
Sintactico
p.55/64
Grmatica -libre
Algoritmo 7
1. Obtenemos V = {A VN |A }: Conjunto de variables anulables
Inicialmente V contiene A si A . Luego, si tenemos B x1 x2 . . . xn y xi V
i, aadir B.
2. Obtenemos P 0 del siguiente modo:
Por cada produccin A x1 x2 . . . xk (k > 0) aadimos:
A Y1 Y2 . . . Yn , dnde cada Yi es:
(a) Si xi no es anulable entonces Yi = xi
(b) Si x V , entonces se toma Yi como xi y como
(c) No aadir ninguna produccin A
3. Si 6 L(G) entonces VN0 = VN y S 0 = S.
En otro caso,
(a) si S no aparece en la parte derecha
i. Aadir la produccin S
ii. VN0 = VN y S 0 = S
(b) en otro caso
S
i. VN0 = VN {S 0 }, siendo S 0 el nuevo smbolo inicial
ii. Aadir a P 0 S 0 S|
Analisis
Sintactico
p.56/64
Analisis
Sintactico
p.57/64
Analisis
Sintactico
p.58/64
Analisis
Sintactico
p.59/64
j:= 1 to i 1 do
sustituir cada produccin de la forma Ai Aj
por las producciones Ai 1 |2 | |k , en
donde Aj 1 |2 | |k es el conjunto de
producciones actuales del no terminal Aj ;
Adems, eliminar la recursividad inmediata por la
izquierda de las producciones de Ai .
for
end
Analisis
Sintactico
p.60/64
Analisis
Sintactico
p.61/64
0
< Xk2 Xk > Xk2
< Xk1 Xk >
0
0
Xk
< Xk1 Xk > Xk1
en donde cada < Xi Xk > es un nuevo smbolo no-terminal.
5. Para cada produccin de la forma A X1 X2 en donde bien X1 o X2 los dos estn en VT , aadir
A X10 X20 a P 0
0 igual a V
6. Para cada a0 introducido en los pasos 4 y 5, aadir a0 a. Sea VN
N ms todos los nuevos
no-terminales introducidos en los pasos anteriores.
0 , V , P 0 , S) es la deseada.
La nueva gramtica G = (VN
T
Analisis
Sintactico
p.62/64
Analisis
Sintactico
p.63/64
Analisis
Sintactico
p.64/64