Beruflich Dokumente
Kultur Dokumente
Automatas de Pila
Puesto que los automatas nitos no son sucientemente poderosos para aceptar los LLC, 1
cabe preguntarnos que tipo de automata se necesitara para aceptar los LLC.
Una idea es agregar algo a los AF de manera que de alguna manera se incremente su
poder de calculo.
Para ser mas concretos, tomemos por ejemplo el lenguaje de los parentesis bien balanceados, que sabemos que es propiamente LLC. 2 >Que maquina se requiere para distinguir
las palabras de parentesis bien balanceados de las que tienen los parentesis desbalanceados?
Una primera idea podra ser la de una maquina que tuviera un registro aritmetico que le
permitiera contar los parentesis dicho registro sera controlado por el control nito, quien le
mandara smbolos para incrementar en uno el contador y para decrementarlo en uno. A
su vez, el registro mandara un smbolo para indicar que esta en cero, o bien para indicar
que no esta en cero. Entonces para analizar una palabra con parentesis lo que haramos sera
llevar la cuenta de cuantos parentesis han sido abiertos pero no cerrados en todo momento
dicha cuenta debe ser positiva o cero, y al nal del calculo debe ser exactamente cero. Por
ejemplo, para la palabra (())() el registro tomara sucesivamente los valores 1 2 1 0 1 0. 3
I
127
128
a
a
q0
q1
q2
q3
es un conjunto de estados
es el alfabeto de entrada
es el alfabeto de la pila
s
2K
es el estado inicial
K
s F
), donde:
) (K
129
) es la relacion de transicion.
p u
)(
q
))
Las operaciones t
picas en las pilas {el \push" y el \pop"{ pueden ser vistas como casos
particulares de las transiciones de nuestro AP en efecto, si solo queremos meter la cadena
a la pila, se har
a con la transicion ((
)( )) (\push"), mientras que si solo queremos
sacar caracteres de la pila se hara con la transicion ((
)( )) (\pop").
p u "
q
p u
q "
Ahora formalizaremos el funcionamiento de los AP, para llegar a la denicion del lenguaje
aceptado por un AP. Para ello seguiremos el mismo metodo que usamos en el caso de los
AF, metodo que reposa completamente en la nocion de con guracion.
De nicion.- Una conguracion es un elemento de K
aa
p " "
=f
s f
=f
=f
a b c
=f
a b
130
esta representada en la siguiente tabla:
(
(
(
(
(
)
)
)
)
)
s a "
s b "
s c "
f a a
f b b
( )
( )
( )
( )
( )
s a
s b
f "
f "
f "
Por ejemplo, la siguiente tabla muestra un calculo que permite aceptar la palabra
:
abcba
abcba
"
bcba
cba
ba
ba
ba
"
"
1
2
3
5
4
a b
=f
s f
=f g =f
f
a b c
g = fa bg
)
)
)
)
)
s a "
s b "
s " "
f a a
f b b
( )
( )
( )
( )
( )
s a
s b
f "
f "
f "
Como se ve, la unica diferencia con respecto al automata del ejemplo anterior es que en la
tercera transicion, en vez de consumir la y hacer en consecuencia el cambio de estado de
c
ENTRE AF Y AP
7.2. RELACION
131
a f , ahora simplemente hace el cambio de estado sin consumir ninguna entrada ni modicar
la pila ! Esta transicion parece muy peligrosa, porque se puede \disparar" en cualquier
momento, y si no lo hace exactamente cuando hemos recorrido ya la mitad de la palabra, el
AP podra llegar al nal a un estado que no sea nal, rechazando en consecuencia la palabra
de entrada. Entonces, >como saber que estamos exactamente a la mitad de la palabra?
Conviene en este punto recordar que en un automata no determinista una palabra es
aceptada cuando existe un calculo que permite aceptarla, independientemente de que un
calculo en particular se vaya por un camino erroneo. Lo importante es, pues, que exista un
calculo que acepte la palabra en cuestion. Por ejemplo, la siguiente tabla muestra un calculo
que permite aceptar la palabra w = abba:
Estado Falta leer Pila Transicion
s
s
s
f
f
f
abba
bba
ba
ba
a
"
"
a
ba
ba
a
"
1
2
3
5
4
Este resultado debe quedar intuitivamente claro, puesto que los AP son una extension
de los AF.
Prueba: Sea (K s F ) un AF el AP (K s F ), con = f((p u ")(q ")) j
(p u q) 2 g acepta el mismo lenguaje.
0
132
1. Si M es un AP, entonces L(M ) es un LLC
M = (fp qg V p fqg)
donde contiene las siguientes transiciones:
1. Una transicion ((p " ")(q S ))
2R
Ejemplo.- Obtener un AP que acepte el LLC generado por la gramatica con reglas:
1. S ! aSa
2. S ! bSb
3. S ! c
(p
(q
(q
(q
(q
(q
(q
" ")
" S)
" S)
" S)
a a)
b b)
c c)
(q
(q
(q
(q
(q
(q
(q
S)
aSa)
bSb)
c)
")
")
")
ENTRE AP Y LLC
7.3. RELACION
133
abcba
abcba
abcba
bcba
bcba
cba
cba
ba
a
"
"
S
aSa
Sa
bSba
Sba
cba
ba
a
"
134
por el procedimiento
Todava nos queda por probar que para todo AP hay una gramatica equivalente. A este
respecto remitimos al lector a la referencia Lewis,Papadimitriou].
La equivalencia de los AP y de las GLC permite aplicar todas las propiedades de los LLC
a los AP. En particular, sabemos que si = 1 2, y tanto 1 como 2 son LLC, existe
un AP para . Sin embargo, no hemos visto ningun procedimiento especco para obtener
un AP para dados los AP para 1 y para 2. Esto no es difcil de hacer, y as tenemos el
siguiente resultado:
L
s " "
"
s " "
"
s F
i j
i j
7.4 AP deterministas
En muchas aplicaciones practicas el no determinismo de los automatas es indeseable, en
el sentido de que en la practica no es suciente con saber que \existe una manera" de
aceptar la palabra de entrada, sino que el automata debe encontrar el calculo que conduce
a la aceptacion de la entrada. Dicho de otra manera, si nuestro AP fracaso en el intento
de aceptar la palabra de entrada, nosotros quisieramos poder atribuir este hecho a que la
palabra no pertenece al lenguaje, y no simplemente a un posible calculo que se fue por
un camino equivocado. Por ejemplo imagnese un compilador de C++ que al recibir un
programa correcto a veces lo aceptara y a veces no {desde luego sus usuarios no estaran
muy contentos.
Por estas razones, se ha hecho necesario denir automatas de pila que se comporten en
forma determinista. El determinismo se interpretara como el hecho de que en cualquier
punto de un calculo, no debe poderse ir a dos conguraciones distintas. Esta condicion se
puede formalizar de la manera siguiente:
7.5. COMPILADORES LL
135
C
` C1 & C ` C2 ) C1 = C2
Esta formula puede leerse como \si de una conguracion dada puedo pasar a otras dos
conguraciones, estas son iguales (la misma)". Esta es una forma (muy frecuentemente
utilizada en matematicas) de decir que algo es unico.
Vamos a utilizar otra denicion de determinismo, equivalente a la anterior, pero que en
la practica va a resultar mas util, porque la denicion anterior, al hacer referencia a \toda
conguracion" posible, nos deja en la imposibilidad de vericar si es cierta o falsa para un
caso dado.
w
p u
p w
]] si
2
)(
q2 2
)) son compatibles si
7.5 Compiladores LL
El metodo visto en la seccion precedente para obtener un AP a partir de una GLC puede ser
considerado como una manera de construir un compilador para el lenguaje correspondiente
a la GLC dada. Desde luego, para tener un verdadero compilador se requiere que el AP
resultante sea determinista, pues sera inaceptable que un mismo compilador diera resultados
136
Ejemplo.- Supongase la GLC con reglas S ! aSb, S ! ", que representa el lenguaje
f g. La construccion del AP correspondiente es directa y la dejamos como ejercicio.
Ahora bien, teniendo una palabra de entrada aabb, la traza de ejecucion comenzara de la
manera siguiente:
an bn
aabb
aabb
"
S
En este punto, no se sabe si reemplazar en la pila S por " o por aSb, al ser transiciones
aplicables tanto ((q " S ) (q ")) como ((q " S ) (q aSb)). En cambio, si tomamos en cuenta
que el siguiente caracter en la entrada sera a, es evidente que no conviene reemplazar S
por ", pues entonces la a de entrada no podra ser cancelada. Entonces hay que aplicar la
transicion ((q " S ) (q aSb)). Continuamos la ejecucion:
Estado Falta leer Pila
...
...
...
q
q
q
q
aabb
abb
abb
bb
aSb
Sb 5
aSbb
Sbb
Al ver que el siguiente caracter de entrada sera una b, nos damos cuenta de que no
conviene reemplazar en la pila S por aSb, pues la b de la entrada no podra cancelarse contra
la a de la pila. Entonces aplicamos la otra transicion disponible, que es ((q " S ) (q ")). La
ejecucion continua:
Estado Falta leer Pila
...
...
...
q
q
q
bb
b
"
bb
b
"
7.5. COMPILADORES LL
137
con lo cual la palabra de entrada es aceptada. Resumiendo, en este ejemplo la regla para
decidir sobre la transicion a aplicar, basandose en la prevision del siguiente caracter a leer,
fue esta: si el siguiente caracter es a, reemplazar en la pila S por aSb, y si es b, reemplazar
S por ". Esta regla puede ser representada mediante la siguiente tabla:
a b "
S aSb "
En esta tabla, las columnas (a partir de la segunda) se re eren al siguiente caracter a
leer (la \prevision"), habiendo una columna marcada \"" por si en vez de haber un caracter
siguiente se encuentra el n de la palabra. La primera columna contiene la variable que se
va a reemplazar en la pila por lo que indique la celda correspondiente en la tabla. 6
A un AP aumentado con su tabla de prevision se le llama \compilador LL" por las siglas
en ingles \Left to right Leftmost derivation", porque efectivamente dentro de la pila se lleva
a cabo una derivacion izquierda el lector puede comprobar esto en el ejemplo anterior. A
un compilador LL que considera una prevision de un caracter, como lo que hemos visto, se
le llama \LL(1)" en general, un compilador de tipo LL que toma en cuenta una prevision
de k caracteres es LL(k).
La razon por la que es necesario a veces hacer una prevision de mas de un caracter es
porque para ciertas gramaticas no es su ciente una prediccion de un solo caracter. Considerese, por ejemplo, la gramatica con reglas S ! aSb, S ! ab, que tambien genera el
lenguaje fanbng. Hacemos el inicio de la ejecucion del AP correspondiente:
Estado Falta leer Pila
p
q
aabb
aabb
"
S
Ejercicio: hacer nuevamente la traza de ejecucion para la palabra abb, utilizando la tabla de prevision.
138
p
q
q
q
q
q
q
q
q
q
aabb
aabb
aabb
abb
abb
abb
bb
bb
b
"
"
S
aA
A7
Sb
aAb
Ab 8
bb
b
"
a b "
S aA aA
A Sb b
Ahora veremos de una manera mas sistematica como construir la tabla de prevision.
Supongamos una GLC sin producciones vacas {lo cual practicamente no representa una
perdida de generalidad. Necesitamos hacer las siguientes deniciones:
Si = au, a 2
, first() = fag
Si = uv, u v 2
, first() = first(u)
Si A ! 2 R, first() first(A)
Ejemplos: first(aA) = fag, por la primera regla first(Sb) = first(S ) por la segunda a
su vez, first(S ) = first(aA) por la tercera regla 9, de donde first(S ) = fag. Similarmente,
first(A) = first(Sb) first(b) = first(S ) fbg = fag fbg = fa bg.
Ahora estamos en condiciones de dar un procedimiento para construir la tabla de prevision: supongamos que estamos tratando de llenar una celda de la tabla donde el renglon
corresponde a la variabla X y la columna a la constante . Si hay en la gramatica una regla
X ! donde 2 first(), el lado derecho se pone en dicha celda:
9
Pusimos \=" en vez de \ " porque solo hay una regla con S del lado izquierdo.
LR(1)
7.6. COMPILACION
139
...
... "
... ... ... ...
X ... ...
Por ejemplo, con este procedimiento se obtiene la siguiente tabla de prevision para la
gramatica con reglas S ! aA, A ! Sb, A ! b:
a b "
S aA
A Sb b
Esta tabla es casi identica a la que habamos supuesto anteriormente para la misma
gramatica.
Puede ocurrir que en una celda de la tabla de prevision queden los lados derechos de
varias reglas esto es, si la celda corresponde la columna de la constante y al renglon de
la variable X , y hay dos reglas distintas X ! y X ! , donde 2 y 2 , entonces
tanto como beta tendran derecho a estar en esa celda de la tabla. Cuando esto ocurre,
simplemente se concluye que la tabla no se puede construir y que la gramatica no es del tipo
LL(1).
140
La dicultad que se presenta en la practica es que muchas veces es posible tanto desplazar como reducir. Aun peor, cuando se reduce puede ser posible hacerlo de varias formas
distintas. Vamos a ilustrar esta situacion con un ejemplo, que es el mismo que hemos visto
anteriormente, esto es, la gramatica para el lenguaje fanbng con las reglas S ! aA, A ! Sb,
A ! b. Dada la palabra aabb, el AP correspondiente tendra una traza de ejecucion como
sigue:
Falta leer Pila Accion
aabb
"
Desplazar
aab
a
Desplazar
bb
aa Desplazar
b
baa Reducir por A ! b
b
Aaa Reducir por S ! aA
b
Sa Desplazar
"
bSa Reducir por A ! Sb
"
Aa Reducir por S ! aA
"
S Exito
En este ejemplo en particular es muy facil discernir cuando hacer cada una de las acciones,
si damos preferencia a \reducir" sobre \desplazar". En efecto, nunca hubo conicto respecto
a como reducir, pues en cada momento solo hubo una reduccion aplicable. Sin embargo,
en otros ejemplos es mucho mas difcil determinar que accion llevar a cabo, y existe un
procedimiento para construir una tabla de prevision para compiladores LR(1), que puede ser
consultado en la referencia 1].
Ahora formalizaremos el procedimiento para construir el AP de tipo LR a partir de una
GLC (V R S ):
Hay 4 estados: i (inicial), f (nal), p y q.
((i " ") (p #)) 2 . Esta transicion coloca un \marcador" # en el fondo de la pila,
para luego reconocer cuando la pila se ha vaciado.
((p ") (p )) 2 para cada 2 . Estas transiciones permiten hacer la accion de
desplazar.
((p " ) (p A)) 2 para cada regla A ! 2 R. Estas transiciones efectuan las
reducciones.
((p " S ) (q ")) 2 esta transicion reconoce cuando se llego al smbolo inicial.
7.7. EJERCICIOS
141
((q " #) (f ")) 2 esta transicion se asegura de que se haya vaciado la pila antes
de aceptar la palabra.
Este procedimiento es directo y dejamos los ejemplos como ejercicios (ver seccion de
ejercicios).
7.7
Ejercicios
142
i. <AD> ! a <AD> d
ii. <AD> ! b <BD> d
iii. <BD> ! b <BD> d
iv. <BD> ! b <BC> c
v. <BC> ! b <BC> c
vi. <BC> ! e
vii. <AD> ! a <AC> c
viii. <AC> ! a <AC> c
ix. <AC> ! b <BC> c
El smbolo inicial es <AD>. Pruebe la correccion de la GLC por induccion sobre la
longitud de la derivacion.
6. La siguiente gramatica genera el lenguaje en fa bg en que las palabras tienen la misma
cantidad de a's que de b's.
(a) S ! aSb
(b) S ! bSa
(c) S ! SS
(d) S ! e
(a) Hacer una derivacion izquierda de la palabra \babbabaa" usando esta gramatica.
(b) Probar la correccion de esta gramatica. Ponga cuidado en formar el enunciado
generalizado (que se aplica a las palabras con variables), en enunciar la hipotesis
de induccion, y en aplicar el enunciado generalizado para el ultimo paso de la
derivacion.
(c) Transforme esta gramatica a la forma normal de Chomsky. Para esto, elimine las
producciones vacas, las producciones \inutiles", etc.
(d) Proponga un automata de pila que acepte el lenguaje del problema.
7. Proponga maquinas lo memos poderosas que sea posible para que acepten los siguientes
lenguajes:
(a) f() ] <> (]) < ()(<>) > ()] : : :g
(b) f() (()) ((())) (((()))) : : :g
(c) f() ()() ()()() : : :g
8. Las maquinas reales tienen siempre lmites a su capacidad de almacenamiento. As,
la pila innita de los automatas de pila puede ser limitada a un cierto tama~no jo.
Suponga una variante de los AP, los APn, en que la pila tiene un tama~no jo n.
(a) Proponga una denicion de APn y de palabra aceptada por un APn.
143
7.7. EJERCICIOS
(b) Pruebe (constructivamente) que los AP son equivalentes a los AF. (Hint: se puede asociar a cada par ( 1 2 n), donde es un estado del AP y 1 2 n
es el contenido de la pila, un estado del AF).
(c) Pruebe su m etodo con el AP de pila de tama~no 2 (caben dos caracteres), con
relaci on de transici on como sigue: = f(( 0 ) ( 0 )) (( 0 ) ( 1 ))
( 1 ) ( 1 ))g, donde 0 es inicial y 1 es nal.
9. Considere el lenguaje = f n n+m mg
(a) Proponga una GLC que genere
(b) Elimine de la gram atica las producciones vac as y las in utiles, si las hay
(c) Pruebe por inducci on que la gram atica es correcta
(d) Obtenga el AP correspondiente, del tipo LL
(e) Obtenga la tabla de previsi on LL(1), calculando primero el \
" de cada variable de la gram atica
(f) Obtenga un AP de tipo LR para la gram atica, si esto es posible, escribiendo
primero una traza que indique c omo deber a comportarse el LR para aceptar la
palabra
.
n
q
:::
:::
b a
a b
a e
f irst
abbbcc
b a