Вы находитесь на странице: 1из 64

Anlisis Sintctico

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

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


Definicin 1 Una gramtica libre de contexto G = (V N , Vt , S, P ) es aquella cuyas
S
producciones tienen la forma A , siendo A VN y (VN VT ) .
Definicin 2 Un autmata de pila se define como una 7-tupla AP = (Q, V, , , q 0 , z0 , F )
en donde:
Q es un conjunto finito 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 finales.
es la funcin de transicin:
: Q (V {}) 2Q

Analisis
Sintactico
p.3/64

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


Definicin 3 Se entiende por configuracin 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)


Definicin 4 Un movimiento de un AP es una transicin entre configuraciones. Una
transicin no tiene porqu realizarse en un solo movimiento.
Por ej. el movimiento (q, aw, Z) ` (q 0 , w, ) es un movimiento vlido siempre y cuando
(q 0 , ) (q, a, Z) con q 0 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
configuracin inicial, (q0 , t, Z0 ), llega a una configuracin final (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


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


Definicin 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 ) }
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

Anlisis Sintctico Ascendente y Descendente (II)

Un ejemplo de este tipo de derivaciones, para la gramtica

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

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.
Descendente:

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.
Ascendente:

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 ineficientes desde un punto de vista
computacional.
Para la mayora de lenguajes de programacin es suficiente con trabajar con subconjuntos
de las CFG, como los de las LL y LR que permiten algoritmos de parsing ms eficientes.

Analisis
Sintactico
p.11/64

El problema de la ambigedad en el anlisis sintctico


Definicin 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 .
Definicin 13 La frontera de un rbol de derivacin es la cadena que se obtiene
concatenando, de izquierda a derecha, las etiquetas de las hojas.
Definicin 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:

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

if

expr then prop

if

expr then prop else prop

otra

De acuerdo con ella, la sentencia


if

E1 then S1 else if E2 then S2 else S3

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


prop

if

expr
E1

then

prop

else

prop

S1

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

expr

then

prop

else

prop

E1
then

prop
S1

else

prop
S2

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

expr then prop endif

if

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

if expr then
otra

prop_no_emparejada

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

t21

t22

t31

t13

t14

t23

t32

t41

en donde A tij sii A + ai ai+1 ai+j1


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


Mtodo:
1. Hacer ti,1 = {A|A ai P } para todo i.
2. Supongamos que ti,j 0 se ha calculado para todo i, 1 i n, y para todo j 0 ,
1 j 0 < j. Hgase
ti,j = {A| para algun k , 1 k < j, A BC P, B ti,k , y C ti+k,jk }
Dado que i k < j, tanto k como j k son menores que j. Por lo tanto, t i,k y
ti+k,jk 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+j1


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

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

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 0 se ha calculado para j 0 = 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 0 se ha calculado para 1 j 0 < 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 0 se ha calculado para 1 j 0 < 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

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
+

la derivacin A = ai ai+1 ai+j1 . Se define 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,jk 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,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

En esa figura 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 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

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 = a1 a2 an VT .
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 , . . . , Ij1 el conjunto de listas de items ya construidos. Para la
construccin de Ij , hacer:
4. Para cada [B a, i] Ij1 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] Ij1 sabemos entonces que (suponiendo que w L(G))

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

Interpretacin del algoritmo


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

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]

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 6 un [S , 0] en In , entonces w
no, hacer = . Ejecutar R([S , 0], n), en donde R se define 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 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

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

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

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.
Definicin 15 Una variable A VN es improductiva si no existe ninguna
derivacin tal que A w con w VT .
Definicin 16 Un smbolo X es inaccesible si no aparece en ninguna
S
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) 6= , existe una
g.l.c. equivalente G0 = (VN0 , VT , S, P 0 ) tal que A VN0 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 G0 (VN0 y P 0 ) es el siguiente:
Algoritmo 5
begin
OLDV :=
NEWV := {A VN |A w P , w VT }
while OLDV 6= NEWV do
begin
OLDV := NEWV
S
S
NEWV := OLDV {A VN |A , (VT OLDV ) }
end
VN0 := NEWV
S
0
0
0
P = {A P |A VN , (VN VT ) }
end

Analisis
Sintactico
p.52/64

Eliminacin de smbolos inaccesibles


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

Teorema 4 Dada una g.l.c. G = (VN , VT , S, P ), existe una


g.l.c. equivalente G0 = (VN0 , VT , S 0 , P 0 ) 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 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

Eliminacin de producciones unitarias


Definicin 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 G0 = (VN , VT , S, P 0 ) 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 0 = Producciones no unitarias de P .
4. Para cada A VN tal que VV (A) 6= .
Para cada B VV (A)
Para cada B P 0 (no unitaria)
Aadir A a P 0

Analisis
Sintactico
p.57/64

Gramtica libre de ciclos


Definicin 19 Una gramtica libre de ciclos es aquella que no contiene
derivaciones de la forma A A.
Definicin 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


Definicin 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


.
Definicin 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 A0 |2 A0 | |n A0
A0 1 A0 |2 A0 | |m A0 |
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


Definicin 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 G0 en forma CNF, tal que L(G) = L(G0 ).
Mtodo: Sea el conjunto P 0 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 Xi0 representa a Xi si Xi VN , y Xi0 es un nuevo no-terminal si Xi VT . Las
nuevas producciones sern las siguientes:
A X10 < X2 Xk >
< X2 Xk > X20 < X3 Xk >

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

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 0 introducimos las producciones S BA, A a y
B AS|b. La produccin S aAB generar el siguiente grupo de
nuevas producciones
S a0 < AB >
< AB > AB
a0 a
que irn a parar a P 0 .

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 0 . La nueva gramtica, G0 = (VN0 , VT0 , P 0 , S) quedar, con
VN0 = {S, A, B, < BB >, < AB >, a0 }, y P 0 contendr las siguientes producciones:
S a0 < AB > |BA
A B < BB > |a
B AS|b
< AB > AB
< BB > BB
a0 a

Analisis
Sintactico
p.64/64

Вам также может понравиться