Beruflich Dokumente
Kultur Dokumente
Tema 3
Juan A. Bot a Blaya
juanbot@um.es http://ants.dif.um.es/staff/juanbot/traductores/traductores.html
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
(qf , , ), qf F,
La cadena ser aceptada por vaciado de pila si despues de leerse toda la cadena se llega a un estado con la pila vaca, independientemente del tipo de estado en el que se encuentre el AP.
Gramticas libres de contexto (CFG) y Autmatas de pila (PA) (IV) Ejemplo (y II) El rbol de alternativas posibles es
(q,a+a*a,S) (q,a+a*a,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
. . . . . .
BF EC a b c puede verse
BF
ECF I
Bc
Ebc
aCc
Ebc
aCc
Ebc D
en el rbol
abc
abc
abc
abc
abc
abc
abc
abc
otra
if
expr E1
then
prop S1
else
prop
if
expr E2
then
prop S2
else
prop S3
if
expr E1 if expr E2
then
prop
if else prop S2
expr E1
then
prop
else
prop S1
then
prop S1
if
expr E2
then
prop S2
El problema de la ambigedad en el anlisis sintctico (V) Hay dos enfoques distintos usados para solucionar este problema. 1. Transformar la denicin del lenguaje para que las construcciones if-then-else tengan delimitadores de bloque, y los else se asocien con los if explcitamente. 2. Transformar la gramtica en otra equivalente y que no sea ambigua.
expr then prop endif expr then prop else prop endif
otra
entonces, para escribir una sentencia como la del ejemplo, y en la que se asocie el else al segundo if quedara
if
Aplicables a cualquier GLC Mtodos tabulares Complejidad espacial O(n2 ) y temporal O(n3 ) No aplicables para lenguajes de programacin convencionales Aplicables si interesan todos los rboles de derivacin posibles (G. ambiguas)
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
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
t13
t14
t21
t22 t32
t23
t31
t41
CYK-Observaciones
Se trata de encontrar A, B, C tales que
C A B
1 2 3 4 5
1 2 3 4 5
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 .
Especiacin 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 la derivacin A = ai ai+1 ai+j 1 . Se dene como sigue: 1. Si j = 1 y la produccin m-sima es A ai , entonces la salida de gen(i, 1, A) es m. 2. Si j > 1, sea k el entero ms pequeo, 1 k < j , tal que para algn B t i,k y C ti+k,j k se tiene que A BC P . Si hay varias, elegimos la que tenga el ndice ms pequeo, digamos m. La salida de gen(i, j, A) es m, ms las salidas de gen(i, k, B ) y gen(i + k, j k, C ). Por lo tanto, para obtener la derivacin para w llamamos a gen(1, n, S )
+
En esa gura puede verse que la secuencia de derivaciones obtenida es la siguiente S 1 AA 6 aA 4 aSA 3 abA 5 abAS 6 abaS 2 abaAS 6 abaaS 3 abaab
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]
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].
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 .
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]
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] [F [T [T [E [E [F I2 a, 1] F T, 1] F , 1] T +E, 1] T , 1] (E ), 0] [E [E [E [T [T [F [F I3 T + E, 1] T + E, 3] T, 3] F T, 3] F, 3] (E ), 3] a, 3] [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]
I5 [F [T [T [E [E (E ), 0] F T, 0] F , 0] T +E, 0] T , 0] [T [T [T [F [F
I6 F T, 0] F T, 6] F , 6] (E ), 6] a, 6] [F [T [T [T [E [E
I7 a, 6] F T, 6] F , 6] F T , 0] T +E, 0] T , 0]
Ejemplo
Vamos a obtener un rbol de derivacin, que dena 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
Y w = (a + a) a la misma cadena de entrada que el ejemplo anterior. Usaremos tambin la lista I1 , . . . , I7 producida en el ejemplo anterior. Inicialmente ejecutamos R([E T , 0], 7). = {2}. Paso 2. Ahora, = T . Hacemos k = 1 y l = 7. Paso 3b. Como X1 = T VN , tenemos que encontrar un item [T , r] I7 tal que [E T, 0] est en Ir . El item [T F , 6] I7 no vale pues [E T, 0] / I6 . El item [T F T , 0] I7 si pues [E T, 0] I0 .
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.
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.
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) Se obtiene el rbol de derivacin derecho 64642156432.
T
R([F (E ), 0], 5)
R([T F T , 0], 7)
F )
R([T F , 6], 7)
( E
R([T F , 1], 2)
F
R([E T + E , 1], 4)
R([F a, 6], 7)
T +
R([E T , 3], 4)
R([F a, 1], 2)
R([T F , 3], 4)
F a
R([F a, 3], 4)
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
OLDV ) }
Grmatica -libre
Denicin 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.
Teorema 4 Dada una g.l.c. G = (VN , VT , S, P ), existe una g.l.c. equivalente G = (VN , VT , S , P ) que es -libre.
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 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 L(G) entonces VN = VN y S = S . En otro caso, (a) si S no aparece en la parte derecha i. Aadir la produccin S ii. VN = VN y S = S (b) en otro caso i. VN = VN {S }, siendo S el nuevo smbolo inicial ii. Aadir a P S S |
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
Forma normal de Chomsky Denicin 23 Sea una CFG G = (VN , VT , P, S ). Se dice que G est en Forma Normal de Chomsky (CNF), si toda produccin de P est en una de las formas siguientes: 1. A BC , en donde A, B y C estn en VN , 2. A a, en donde A VN y a VT , 3. Si L(G) entonces S est en P y adems S no aparece en la parte derecha de ninguna produccin de P .