Está en la página 1de 64

Anlisis Sintctico

Tema 3
Juan A. Bot a Blaya
juanbot@um.es http://ants.dif.um.es/staff/juanbot/traductores/traductores.html

y las Comunicaciones Departamento de Ingenier a 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

Gramticas libres de contexto (CFG) y Autmatas de pila (PA)


Denicin 1 Una gramtica libre de contexto G = (V N , Vt , S, P ) es aquella cuyas producciones tienen la forma A , siendo A VN y (VN VT ) . Denicin 2 Un autmata de pila se dene como una 7-tupla AP = (Q, V, , , q 0 , z0 , F ) en donde: Q es un conjunto nito de estados. V es el alfabeto de entrada. es el alfabeto de la pila. q0 es el estado inicial. z0 es el smbolo inicial de la pila. F Q es el conjunto de estados nales. es la funcin de transicin: : Q (V {}) 2Q

Analisis Sintactico p.3/64

Gramticas libres de contexto (CFG) y Autmatas de pila (PA)


Denicin 3 Se entiende por conguracin de un atommata con pila a su situacin en un instante considerado expresada formalmente por medio de una tripla (q, w, ) (Q V ) en donde: q Q es el estado actual del autmata. w V es la subcadena de entrada que aun no se ha analizado. es el contenido actual de la pila. Si w = no queda nada por analizar. Si = se ha reconocido la cadena.

Analisis Sintactico p.4/64

Gramticas libres de contexto (CFG) y Autmatas de pila (PA) (II)


Denicin 4 Un movimiento de un AP es una transicin entre conguraciones. Una transicin no tiene porqu realizarse en un solo movimiento. Por ej. el movimiento (q, aw, Z) (q , w, ) es un movimiento vlido siempre y cuando (q , ) (q, a, Z ) con q Q, a (V ), w V , , . Se debe sealar que un AP no puede realizar ningn movimiento si la pila est vaca. Entonces, un autmata de pila reconocer una cadena de entrada sii partiendo de su conguracin inicial, (q0 , t, Z0 ), llega a una conguracin nal (qf , , ) empleando movimientos vlidos y lo expresamos: (q0 , t, Z0 )

(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.

Analisis Sintactico p.5/64

Gramticas libres de contexto (CFG) y Autmatas de pila (PA) (III)


Ejemplo. Sea G = (VN , VT , P, S ) con P S S+A SA AAB AB B (S ) Ba Sea AP = (Q, V, , , q, s, ) en donde Q = {q }, V = {a, +, , (, )} y : (q, , S ) = {(q, S + A), (q, A)} (q, , A) = {(q, A B ), (q, B )} (q, , B ) = {(q, (S )), (q, a)} (q, op, op) = {(q, )} siendo op V . Intentaremos reconocer la cadena w = a + a a.

Analisis Sintactico p.6/64

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+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

. . . . . .

Anlisis Sintctico Ascendente y Descendente


Denicin 5 Una sentencia w L(G), para alguna CFG (Context Free Grammar) ha sido reconocida cuando conocemos alguno de (o quiz todos) sus rboles de derivacin. Denicin 6 Sea una gramtica G = (VN , VT , P, S ). Se dice que la cadena deriva directamente a la cadena , denotndolo , si se puede escribir = A y = para alguna cadena y (VT VN ) , y adems existe A P . Denicin 7 Sea una gramtica G = (VN , VT , P, S ). Para cualquier A VN y (VN VT ) se dice que A = si se deriva de A, con una cadena de derivaciones de longitud cualqiera, incluso nula.

Analisis Sintactico p.8/64

Anlisis Sintctico Ascendente y Descendente


Denicin 8 Sea una gramtica G = (VN , VT , P, S ). Las formas sentenciales de G vienen dadas por el conjunto D(G) = { / S = y (VN VT ) } Denicin 9 El lenguaje denido 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 } Denicin 10 Sea una gramtica G = (VN , VT , P, S ). Sea una forma sentencial en , V donde VT N y (VT VN ) . Una derivacin izquierda se obtiene sustituyendo por alguna de las partes derechas que la denen. Denicin 11 Sea una gramtica G = (VN , VT , P, S ). Sea una forma sentencial en . Una derivacin derecha se obtiene sustituyendo donde (VT VN ) , VN y VT por alguna de las partes derechas que la denen.

Analisis Sintactico p.9/64

Anlisis Sintctico Ascendente y Descendente (II)

A B Un ejemplo de este tipo de derivaciones, para la gramtica E C F


A D Derivacin derecha I Derivacin izquierda D

BF EC a b c puede verse

BF

ECF I

Bc

D EbF ECc ECc D

aCF I abF I aCc abF

Ebc

aCc

Ebc

aCc

Ebc D

en el rbol

abc

abc

abc

abc

abc

abc

abc

abc

Analisis Sintactico p.10/64

Anlisis Sintctico Ascendente y Descendente (III)


Existen dos grandes grupos de mtodos de anlisis sintctico, dependiendo de la direccin en la que se recorre el rbol sintctico. en este tipo de anlisis, se va recorriendo el rbol sintctico desde la raz hasta las hojas, llegando a generar la sentencia que se est analizando. La raz representa al smbolo inicial de la gramtica. se parte de las hojas y se intenta construir el rbol hacia arriba, hasta llegar al smbolo inicial de la gramtica. En un anlisis top-down un parser hacer corresponder cadenas de entrada con sus correspondientes derivaciones izquierdas. En un anlisis bottom-up un parser hace corresponder cadenas de entrada con las inversas de las correspondientes derivaciones derechas. Entre los mtodos generales, los algoritmos de Cocke-Younger-Kasami (CYK) y el mtodo de Early son los ms conocidos son bastante inecientes desde un punto de vista computacional. Para la mayora de lenguajes de programacin es suciente con trabajar con subconjuntos de las CFG, como los de las LL y LR que permiten algoritmos de parsing ms ecientes.
Ascendente: Descendente:

Analisis Sintactico p.11/64

El problema de la ambigedad en el anlisis sintctico


Denicin 12 Un rbol ordenado y etiquetado D es un rbol de derivacin para una gramtica libre de contexto G(S ) = (VN , VT , P, S ) si: 1. La raz de D est etiquetada con S . 2. Si D1 , . . . , Dk son los subrboles de los descendientes directos de la raz, y la raz de cada Di est etiquetada con Xi , entonces S X1 Xk P . Adems Di debe ser un rbol de derivacin en G(Xi ) = (VN , VT , P, Xi ) si Xi VN , bien un nodo hoja con etiqueta Xi si Xi VT . 3. Alternativamente, si D1 es el nico subrbol de la raz de D, y la raz de D 1 tiene como etiqueta e, entonces S e P . Denicin 13 La frontera de un rbol de derivacin es la cadena que se obtiene concatenando, de izquierda a derecha, las etiquetas de las hojas. Denicin 14 Sea una CFG G = (VN , VT , P, S ). Decimos que G es ambigua si existe al menos una sentencia w L(G) para la cual hay un rbol de derivacin distinto, con frontera w.

Analisis Sintactico p.12/64

El problema de la ambigedad en el anlisis sintctico (II)


El hecho de que una gramtica sea ambigua es una situacin indeseable ya que cada rbol de derivacin representa una ejecucin distinta de la misma sentencia, y por lo tanto cada uno podra producir resultados distintos. sea la gramtica G = (VN , VT , P, S ) con P = {E E + E, E E E, E a} Caben dos interpretaciones para a + a a:
Ejemplo:
E E + E E E * E

Analisis Sintactico p.13/64

El problema de la ambigedad en el anlisis sintctico (III)


Otro ejemplo clsico de este tipo de problemas es el de las gramticas que incluyen sentencias del tipo if-then/if-then-else. Sea la gramtica prop | | De acuerdo con ella, la sentencia
if if if

expr then prop expr then prop else prop

otra

E1 then S1 else if E2 then S2 else S3


prop

no es ambigua, ya que el rbol de derivacin correspondiente sera

if

expr E1

then

prop S1

else

prop

if

expr E2

then

prop S2

else

prop S3

Analisis Sintactico p.14/64

El problema de la ambigedad en el anlisis sintctico (IV)


sin embargo, la sentencia
if

E1 then if E1 then S1 else S2

si lo sera, ya que dara lugar a la siguiente pareja de rboles de derivacin distintos.


prop prop

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

Analisis Sintactico p.15/64

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.

Analisis Sintactico p.16/64

El problema de la ambigedad en el anlisis sintctico (VI)


Ejemplo con el mtodo 1: prop | |
if if

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

E1 then if E1 then S1 else S2 endif endif

Una sentencia que ahora asociara el else con el primer if sera


if

E1 then if E1 then S1 endif else S2 endif

Analisis Sintactico p.17/64

El problema de la ambigedad en el anlisis sintctico (VII)


Ejemplo con el mtodo 2: Se debe elegir entre los dos rboles de la transparencia 10. Elegir el rbol de la izquierda implica emparejar el else con el then anterior y sin emparejar ms cercano. Elegir el rbol de la derecha implica emparejar el else con el then ms lejano y que aun est sin emparejar. Eligiendo el rbol de la izquierda, se dividen las proposiciones entre emparejadas y no emparejadas. Toda proposicin que aparezca entre un then y un else debe estar emparejada, e.d. no debe terminar con un then sin emparejar porque entonces el else estara obligado a concordar con ella. Una proposicin emparejada es una proposicin if-then-else que no contenga proposiciones sin emparejar o cualquier otra clase de proposicin no condicional. prop prop_emparejada prop_no_emparejada | | | prop_emparejada prop_no_emparejada
if expr then otra if if

prop_emparejada else prop_emparejada

expr then prop expr then prop_emparejada else prop_no_emparejada

Analisis Sintactico p.18/64

Mtodos universales de anlisis sintctico

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)

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

t13

t14

t21

t22 t32

t23

t31

t41

en donde A tij sii A + ai ai+1 ai+j 1 Entonces w L(G) si S t1n


Analisis Sintactico p.21/64

Mtodos Universales de anlisis sintctico. El algoritmo CYK


Algoritmo 1 Algoritmo de anlisis sintctico de Cocke-Younger-Kasami. Entrada: Una gramtica G = (VN , VT , P, S ) en CNF y sin -producciones, junto con una . cadena de entrada w = a1 a2 an VT Salida: La tabla T en la que cada ti,j contiene a A VN sii A = ai ai+1 ai+j 1 . Mtodo: 1. Hacer ti,1 = {A|A ai P } para todo i. 2. Supongamos que ti,j se ha calculado para todo i, 1 i n, y para todo j , 1 j < j . Hgase ti,j = {A| para algun k , 1 k < j, A BC P, B ti,k , y C ti+k,j k } Dado que i k < j , tanto k como j k son menores que j . Por lo tanto, t i,k y ti+k,j k han sido calculados antes de ti,j . Despus de este paso, si ti,j contiene a A, entonces A BC = ai ai+k1 C = ai ai+k1 ai+k ai+j 1 3. Realizar el paso anterior, hasta que ti,j haya quedado calculado para todo 1 i n y 1 j n i + 1.
+ + +

Analisis Sintactico p.22/64

CYK-Observaciones
Se trata de encontrar A, B, C tales que
C A B

a1 a2 . . . ai . . .. . . ai+j 1 . . . an hasta que al nal tengamos


S D E

a1 a2 . . .. . . an y por lo tanto podamos asegurar que S DE + a1 a2 . . . E + a1 a2 . . . an


Analisis Sintactico p.23/64

Mtodos Universales de anlisis sintctico. El algoritmo CYK (II)


Vemos la aplicacin del algoritmo con un ejemplo en el que el conjunto P de nuestra gramtica viene dado por el conjunto de producciones S AA|AS |b A SA|AS |a Sea w = abaab la cadena de entrada. Aplicando el algoritmo, la tabla resultante ser una triangular de 5 5. Aplicando el paso 1, tenemos t11 = {A}, ya que A a P . t21 = {S }, ya que S b P . t31 = {A}, ya que A a P . t41 = {A}, ya que S a P . t51 = {S }, ya que A b P .

Analisis Sintactico p.24/64

Mtodos Universales de anlisis sintctico. El algoritmo CYK (III)


Ahora, hacemos j = 2. Tenemos que ti,j se ha calculado para j = 1. Tenemos que encontrar no-terminales que produzcan subcadenas de w de longitud 2. t1,2 = {S, A}, ya que 1 k < 2, y la regla ha de ser tal que el primer no-terminal de la parte derecha est en t1,1 y el segundo no-terminal en t2,1 . Por lo tanto la parte derecha ha de ser AS . Tanto S como A tienen reglas con esa parte derecha. t22 = {A}, ya que 1 k < 2, y la regla ha de ser tal que el primer no-terminal de la parte derecha est en t2,1 y el segundo no-terminal en t3,1 . La parte derecha sera SA. nicamente A tiene partes derechas de ese tipo. t3,2 = {S }, ya que 1 k < 2, y la regla ha de ser tal que el primer no-terminal de la parte derecha est en t3,1 , y el segundo en t4,1 . Por lo tanto, la parte derecha sera AA. Slamente S tiene reglas de produccin con esa parte derecha. t4,2 = {A, S }, ya que 1 k < 2, y la regla ha de ser tal que el primer no-terminal de la parte derecha est en t4,1 , y el segundo en t5,1 . Por lo tanto, la parte derecha sera AS .

Analisis Sintactico p.25/64

Mtodos Universales de anlisis sintctico. El algoritmo CYK (IV)

Despus de hacer el paso 2, con j = 2 la tabla T queda as:

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

Mtodos Universales de anlisis sintctico. El algoritmo CYK (V)


Ahora, hacemos j = 3. Tenemos que ti,j se ha calculado para 1 j < 3. Tenemos que encontrar no-terminales que produzcan subcadenas de w, de longitud 3. t1,3 = {A, S }, ya que 1 k < 3, y la regla ha de ser tal que el primer no-terminal de la parte derecha est en t1,1 (o en t1,2 ) y el segundo no-terminal en t2,2 (o en t3,1 ). Por lo tanto la parte derecha ha de ser AA (o SA). t2,3 = {S }, ya que 1 k < 3, y la regla ha de ser tal que el primer no-terminal de la parte derecha est en t2,1 (o en t2,2 ) y el segundo no-terminal en t3,2 (o en t4,1 ). La parte derecha sera SS (o AA). nicamente S tiene una produccin S AA. t3,3 = {A, S }, ya que 1 k < 3, y la regla ha de ser tal que el primer no-terminal de la parte derecha est en t3,1 (o en t3,2 ), y el segundo en t4,2 (o en t5,1 ). Con t3,1 y t4,2 tenemos dos posibles partes derechas que son AA y AS , y por ello tanto S como A deben estar en t3,3 . Con t3,2 y t5,1 tenemos como parte derecha SS , que no es generada por ningun no-terminal.

Analisis Sintactico p.27/64

Mtodos Universales de anlisis sintctico. El algoritmo CYK (VI)

Despus de hacer el paso 2, con j = 3 la tabla T queda as:

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

Mtodos Universales de anlisis sintctico. El algoritmo CYK (VII)


Ahora, hacemos j = 4. Tenemos que ti,j se ha calculado para 1 j < 4. Tenemos que encontrar no-terminales que produzcan subcadenas de w, de longitud 4. t1,4 = {A, S }, ya que 1 k < 4, y la regla ha de ser tal que el primer no-terminal de la parte derecha est en t1,1 , k = 1, o en t1,2 , k = 2, o en t1,3 , k = 3 y el segundo no-terminal en t2,3 , k = 1, o en t3,2 , k = 2 o en t4,1 . El conjunto de no-terminales que podran formar el primer no-terminal de la parte derecha es {A, S } y el de no-terminales que podran formar el segundo no-terminal de la parte derecha es {A, S }. Por lo tanto la parte derecha va a estar en {AA, AS, SA, SS }. t2,4 = {A, S }, ya que 1 k < 4, y la regla ha de ser tal que el primer no-terminal de la parte derecha est en t2,1 , k = 1, o en t2,2 , k = 2 o en t2,3 , k = 3 y el segundo no-terminal en t3,3 , k = 1, o en t4,2 , k = 2, o en t5,1 . El conjunto de no-terminales que podran formar el primer no-terminal de la parte derecha es {A, S }, y el de no-terminales que podran formar el segundo no-terminal de la parte derecha es {A, S }. Por lo tanto la parte derecha va a estar en {AA, AS, SA, SS }.

Analisis Sintactico p.29/64

Mtodos Universales de anlisis sintctico. El algoritmo CYK (VIII)

Despus de hacer el paso 2, con j = 4 la tabla T queda as:

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

Obteniendo una secuencia de derivaciones a partir de T

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 )
+

Analisis Sintactico p.31/64

Obteniendo una secuencia de derivaciones a partir de T


Tomemos la gramtica del ejemplo anterior y dispongmosla en el orden siguiente: (1)S AA (2)S AS (3)S b (4)A SA (5)A AS (6)A a Sea la cadena de entrada w = abaab la misma que para T Tenemos que llamar a gen(1, 5, S ), siempre que S t1,5

Analisis Sintactico p.32/64

Obteniendo una secuencia de derivaciones a partir de T


Ahora la evolucin, con el k y m correspondientes es
k=1 gen(1,5,S) m=1 k=1 gen(1,1,A) m=6 k=1 gen(2,1,S) m=3 k=1 gen(2,4,A) m=4 k=1 gen(3,3,A) m=5

k=1 gen(3,1,A) m=6 k=1 gen(4,1,A) m=6

k=1 gen(4,2,5)m=2 k=1 gen(5,1,S)m=3

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

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

El algoritmo de Early (II)


El algoritmo trabaja construyendo un conjunto de items I j para cada j , 0 j n, de tal forma que [A , i] Ij , con 0 i j sii para algn y , se tiene que: 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 prejo 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

El algoritmo de Early (III)


Algoritmo 3 El algoritmo de parsing de Early Entrada: la gramtica CFG, G = (VN , VT , P, S ) y la cadena de entrada . w = a 1 a2 a n V T Salida: Las listas del parser, I0 , I1 , . . . , In . Mtodo: Primero se construye I0 usando los pasos (1) a (3) 1. Si S P entonces, aadir el item [S , 0] a I0 . Ejecutar (2) y (3) hasta que no se aada ningn item nuevo a I 0 . 2. Si [B , 0] I0 , aadir [A B , 0] para todo [A B, 0] I0 . 3. Sea [A B, 0] I0 . Para toda produccin B , aadir el item [B , 0] a I0 , siempre que no estuviera aadido ya. Ahora, sea I0 , I1 , . . . , Ij 1 el conjunto de listas de items ya construidos. Para la construccin de Ij , hacer: 4. Para cada [B a, i] Ij 1 tal que a = aj , aadir [B a , i] a Ij . Ejecutar los dos ltimos pasos, para cada j , hasta que no se pueda aadir ningn item ms a Ij . 5. Sea [A , i] Ij . Si existe un [B A, k] Ii , entonces, aadir [B A , k] a Ij . 6. Sea [A B, i] Ij . Para todo B P , aadimos [B , j ] a Ij .
Analisis Sintactico p.36/64

Interpretacin del algoritmo


Paso 1: Iniciamos la construccin de la tabla con todas las producciones de S Paso 2: Exploramos todas las producciones a partir de S Paso 3: Si en I0 tenemos A B , debemos incluir tambin todas las producciones de B Paso 4: Si [B a, i] Ij 1 sabemos entonces que (suponiendo que w L(G))

a1 a2 . . . ai+1 ai+2 . . . aj 1 aj . . . an entonces, si a = aj podemos decir que


aaj

a1 a2 . . . ai+1 ai+2 . . . aj 1 aj . . . an por lo tanto incluimos [B a , i] Ij

Analisis Sintactico p.37/64

Interpretacin del algoritmo


Paso 5: Si [A , i] Ij tenemos que

. . . ai+1 ai+2 . . . aj . . . y como A entonces decimos tambin que


A

ai+1 ai+2 . . . aj entonces, si tenemos que [B A, k] Ii signica que tenemos


A

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] [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]

y como [E T , 0] I6 , tenemos que w L(G).

Analisis Sintactico p.43/64

Obtencin de una derivacin derecha


Algoritmo 4 Construccin de un rbol de derivacin a partir de I 0 , I1 , . . . , In . Entrada: una gramtica CFG, libre de ciclos, G = (VN , VT , P, S ), en donde las producciones estn numeradas, de 1 . . . p, una cadena w = a 1 . . . an , y la lista I0 , I 1 , . . . , I n . Salida: , un rbol de derivacin derecho para w, un mensaje de error. / L(G). Emitir salida de error. Si Mtodo: si un [S , 0] en In , entonces w no, hacer = . Ejecutar R([S , 0], n), en donde R se dene como sigue: Rutina R([A , i], j ): 1. Sea h el ndice de A . Entonces, hacer + h 2. Si = X1 X2 Xm , hacer k = m, l = j . 3. Mientras que k > 0 hacer: (a) Si Xk VT , hacer k = k 1 y l = l 1. (b) Si Xk VN , i. Encontrar un item [Xk , r] Il , para algn r ii. Ejecutar R([Xk , r], l). Hacer k = k 1 y l = r.

Analisis Sintactico p.44/64

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 .

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) Se obtiene el rbol de derivacin derecho 64642156432.

Analisis Sintactico p.48/64

rbol de derivacin obtenido


E
R([E T , 0], 7)

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)

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

Eliminacin smbolos intiles


Pasos para eliminar los smbolos no tiles de una gramtica 1. Eliminacin de variables (A VN ) improductivas. 2. Eliminacin de smbolos inaccesibles. Denicin 15 Una variable A VN es improductiva si no existe ninguna . derivacin tal que A w con w VT Denicin 16 Un smbolo X es inaccesible si no aparece en ninguna forma sentencial de la gramtica, es decir, , (VN VT ) tal que S X . Teorema 1 Dada una g.l.c. G = (VN , VT , S, P ), con L(G) = , existe una g.l.c. equivalente G = (VN , VT , S, P ) tal que A VN se cumple que existe una serie de derivaciones tal que A w, w VT , es decir, existe una gramtica equivalente sin variables improductivas.

Analisis Sintactico p.51/64

Eliminacin de variables improductivas


El algoritmo para el clculo de G (VN y P ) es el siguiente: Algoritmo 5 begin OLDV := NEWV := {A VN |A w P , w VT } while OLDV = NEWV do begin OLDV := NEWV NEWV := OLDV {A VN |A , (VT end VN := NEWV P = {A P |A VN , (VN VT ) } end

OLDV ) }

Analisis Sintactico p.52/64

Eliminacin de smbolos inaccesibles


Teorema 2 Dada una g.l.c. G = (VN , VT , S, P ), con L(G) = , existe una g.l.c. equivalente G = (VN , VT , S, P ) sin smbolos inaccesibles. El algoritmo para el clculo de G (VN , VT y P ) es el siguiente: Algoritmo 6 begin VN := {S }; VT := ; P := ; repeat un for A VN , A 1 |2 | |n , no procesada a {a nadir todas las variables de i a VN nadir todos los terminales de i a VT } a until VN no var e P = {A P |A VN (VN VT ) } end

Analisis Sintactico p.53/64

Eliminacin de smbolos intiles


Teorema 3 Dada una gramtica libre de contexto G, con L(G)= , existe una GLC G equivalente sin smbolos intiles. Los pasos a seguir seran (el orden es importante): Pasamos de G a G1 segn el algoritmo 5 Pasamos de G1 a G segn el algoritmo 6 G no contiene smbolo intiles, es decir, todo smbolo X (VN VT ) es tal que S X w.

Analisis Sintactico p.54/64

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.

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

Analisis Sintactico p.56/64

Eliminacin de producciones unitarias


Denicin 18 Llamamos producciones unitarias a las que tienen la forma A B , con A, B VN . Teorema 5 Dada una g.l.c. G = (VN , VT , S, P ) existe una g.l.c. equivalente G = (VN , VT , S, P ) que no contiene producciones unitarias. El algoritmo para calcular G es el siguiente: Algoritmo 8 1. Suponemos que G es -libre; si no es as, se transforma segn el algoritmo 3 2. Para cada A VN se calcula VV (A) = {B VN |A + B }. 3. P = Producciones no unitarias de P . 4. Para cada A VN tal que VV (A) = . Para cada B VV (A) Para cada B P (no unitaria) Aadir A a P
Analisis Sintactico p.57/64

Gramtica libre de ciclos


Denicin 19 Una gramtica libre de ciclos es aquella que no contiene derivaciones de la forma A A. Denicin 20 Una gramtica es propia si no tiene smbolos intiles, es -libre y libre de ciclos. Para convertir una gramtica en otra equivalente propia, podemos seguir los siguientes pasos: 1. Pasar la gramtica a una equivalente -libre. 2. Eliminar las producciones unitarias (no hay ciclos). 3. Eliminar smbolos intiles. No debemos olvidar que una gramtica puede tener producciones unitarias y ser propia.

Analisis Sintactico p.58/64

Recursividad en las gramticas


Denicin 21 Una gramtica G = (VN , VN , P, S ) es recursiva por la izquierda (derecha) si existe un A VN tal que existe una derivacin A = A (A = A) para alguna cadena . Denicin 22 Una gramtica G = (VN , VN , P, S ) es recursiva si existe un A VN tal que existe una derivacin A = A . Algoritmo 9 Eliminacin de la recursividad inmediata por la izquierda. Entrada: Un conjunto de producciones {pi /pi P } con el no terminal A VN como parte izquierda de una gramtica G CFG sin -producciones. Salida: Un nuevo conjunto de producciones sin recursividad inmediata por la izquierda. 1. Ordnense las producciones de Ai en la forma A A1 |A2 | |Am |1 |2 | |n en donde ninguna i comienza con A. 2. Sustituir todas las producciones de A por A 1 A |2 A | |n A A 1 A |2 A | |m A | 3. La salida es el conjunto de nuevas producciones obtenidas en el paso anterior.
+ + +

Analisis Sintactico p.59/64

Recursividad en las gramticas (III)


Algoritmo 10 Eliminacin de la recursividad por la izquierda. Entrada: La gramtica G propia Salida: Una gramtica equivalente, sin recursividad por la izquierda. 1. Ordnense los Ai VN en un orden A1 , A2 , . . . , An . 2. for i:=1 to n do
begin

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 .

Analisis Sintactico p.61/64

Forma normal de Chomsky (II)


Algoritmo 11 Conversin a Forma Normal de Chomsky. Entrada: Una gramtica CFG propia, G = (VN , VT , P, S ) sin producciones simples. Salida: Una gramtica G en forma CNF, tal que L(G) = L(G ). Mtodo: Sea el conjunto P formado por las producciones siguientes: 1. Aadir toda produccin en la forma A a P 2. Aadir toda produccin en la forma A AB P 3. Si S P entonces aadirla tambin. 4. Para cada produccin en la forma A X1 Xk con k > 2, aadir las producciones resultantes a continuacin: asumimos que Xi representa a Xi si Xi VN , y Xi es un nuevo no-terminal si Xi VT . Las nuevas producciones sern las siguientes: A X 1 < X2 X k > < X2 Xk > X2 < X3 Xk > < Xk2 Xk > Xk2 < Xk1 Xk > < Xk1 Xk > Xk1 Xk 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 X 1 X2 a P 6. Para cada a introducido en los pasos 4 y 5, aadir a a. Sea VN igual a VN ms todos los nuevos no-terminales introducidos en los pasos anteriores. La nueva gramtica G = (VN , VT , P , S ) es la deseada.

Analisis Sintactico p.62/64

Forma normal de Chomsky (III)


Veamos la aplicacin del algoritmo con la gramtica CFG cuyo conjunto P est formado por las siguientes producciones: S aAB |BA A BBB |a B AS |b En el nuevo conjunto P introducimos las producciones S BA, A a y B AS |b. La produccin S aAB generar el siguiente grupo de nuevas producciones S a < AB > < AB > AB a a que irn a parar a P .

Analisis Sintactico p.63/64

Forma normal de Chomsky (IV)


Para la produccin A BBB , se generarn las siguientes nuevas producciones A B < BB > < BB > BB que tambin se introducirn en P . La nueva gramtica, G = (VN , VT , P , S ) quedar, con VN = {S, A, B, < BB >, < AB >, a }, y P contendr las siguientes producciones: S a < AB > |BA A B < BB > |a B AS |b < AB > AB < BB > BB a a

Analisis Sintactico p.64/64

También podría gustarte