Professional Documents
Culture Documents
La computacin, muy avanzada hoy en da, sienta sus bases sobre una slida plataforma
desarrollada con mucho esfuerzo e investigacin, un rea importante es el trabajo con
los lenguajes de programacin, cuyas races estn en la teora de autmatas y lenguajes
formales. Esta asignatura forma parte del rea fundamental de la carrera de Ingeniera
en Informtica correspondiente al sexto semestre. Esta asignatura tiene su importancia
en que seala los aspectos bsicos de los lenguajes computacionales, as como nos
muestra de manera general el trabajo interno de los sistemas de computacin en lo
referente al tratamiento de cadenas y lenguajes, los contenido que se cubren son
principalmente los autmatas finitos, autmatas de pila, lenguajes independientes de
contexto, maquinas de turing como reconocedores de lenguajes. Sea bienvenido al
presente curso y no dude en contactar a su profesor en caso de necesitar resolver
cualquier inquietud. Saludos y xitos!!!
Tabla de contenidos
1 Objetivo General
2 Objetivos Especificos
3 Bibliografia
4.1.2 DESARROLLO
Objetivo General
Dar al estudiante una visin global del trabajo de los autmatas y su aplicacin en los
lenguajes de programacin.
Objetivos Especificos
Bibliografia
Texto Base
Hopcroft, J., et All, Introduccin a la Teora de Autmatas, Lenguajes y
Computacin, Segunda Edicin, Adison Wesley, Madrid, 2002
Este libro tiene un espectro amplio en cuanto a que cubre desde los detalles hasta
aspectos avanzados de cada tema, est expresado en trminos sencillos y solo en casos
necesarios recurre a expresar con formalismos los diferentes aspectos que trata.
Texto Complementario
Kelley, D. Teoria de Autmatas y Lenguajes Formales, Prentice Hall, Madrid
1995Escogido por los temas que cubre y principalmente por la amplia gama de
ejercicios que resuelve y plantea, ofrece un capitulo especial (el nmero cero) dedicado
a aquellos que tienen problemas con las matemticas necesarias para abordar la materia.
Su metodologa la basa en definiciones cortas, ejercicios resueltos con explicaciones
detalladas y muchos ejercicios planteados.
Construccin de autmatas
Disear un AFD que acepte identificadores que inicien siempre con un guin bajo y
luego puedan contener letras o dgitos.
Inicialmente debemos asociar la condicin inicial al estado inicial, esto significa que
desde el primer estado al segundo estado nicamente puede existir una transicin que
etiquetada con guin bajo
Una vez en el estado dos, se puede avanzar hacia el estado tres con una transicin
etiquetada con letra (L) o con digito (D).
Ahora es necesario que la cadena pueda tener mas letras o ms dgitos, esto se puede
conseguir haciendo que desde el estado 3 salga una arista etiquetada con letra (L) hacia
otro estado (que puede ser el mismo estado 3). Lo mismo hay que hacer para reconocer
ms dgitos.
Desarrollemos ahora otro autmata que reconozca cadenas de letras (sobre el alfabeto
{a,b}) en las que nunca puedan ir dos as seguidas
La condicin inicial no esta asociada al estado inicial, el autmata puede empezar con
una letra a o con una letra b
Ahora puede tener otra letra b con la que regresa al estado 1. Note que siempre termina
en el estado 2.
A=Cerradura vacia de S0
A={0}
Estados_de_D={A}
T=A={0}
T=A={0}
a = a
a = b
U=Cerrad-vacia(Mueve(T,a))
U=Cerrad-vacia(Mueve(T,a))
U=Cerrad-vacia(Mueve(0,a))
U=Cerrad-vacia(Mueve(0,b))
U=Cerrad-vacia(1)
U=Cerrad-vacia(vacio)
U={1,2,3,5,8}=B
U=vacio; no se lo considera
a b
A B
B
Se llena la
matriz con las
entradas
(A,a)=B
Estados_de_D={A, B}
T=B={1,2,3,5,8}
T=B={1,2,3,5,8}
a = a
a = b
U=Cerrad-vacia(Mueve(T,a))
U=Cerrad-vacia(Mueve(T,a))
a b
A B
B CD
Se llena la
U=Cerrad-vacia(Mueve(1,2,3,5,8, U=Cerrad-vacia(Mueve(1,2,3,5,8, matriz con
a))
b))
las entradas
U=Cerrad-vacia(4,9)
U=Cerrad-vacia(6)
(B,a)=C y
U={2,3,4,5,7,8,9}=C
U={2,3,5,6,7,8}=D
(B,b)=D
Estados_de_D={A, B, C, D}
a b
T=C={2,3,4,5,7,8,9}
T=C={2,3,4,5,7,8,9}
a = a
a = b
U=Cerrad-vacia(Mueve(T,a))
U=Cerrad-vacia(Mueve(T,a))
U=Cerradvacia(Mueve(2,3,4,5,7,8,9, a))
U=Cerradvacia(Mueve(2,3,4,5,7,8,9, b))
Se llena la
matriz con
U=Cerrad-vacia(4,9)
U=Cerrad-vacia(6,10)
U={2,3,5,6,7,8,10}=E
las entradas
(C,a)=C y
A B
B CD
C CE
(C,b)=E
Estados_de_D={A, B, C, D, E}
T=D={2,3,5,6,7,8}
T=D={2,3,5,6,7,8}
a b
A B
B CD
a = a
a = b
U=Cerrad-vacia(Mueve(T,a))
U=Cerrad-vacia(Mueve(T,a))
C CE
D CD
U=Cerrad-vacia(6)
las entradas
(D,a)=C y
(D,b)=D
Estados_de_D={A, B, C, D, E}
a b
T=E={2,3,5,6,7,8,10}
T=E={2,3,5,6,7,8,10}
a = a
a = b
U=Cerrad-vacia(Mueve(T,a))
U=Cerrad-vacia(Mueve(T,a))
U=Cerradvacia(Mueve(2,3,5,6,7,8,10, a))
U=Cerradvacia(Mueve(2,3,5,6,7,8,10, b))
U=Cerrad-vacia(4,9)
U=Cerrad-vacia(6)
A B
B CD
C CE
D CD
E CD
Se llena la
matriz con
las entradas
(E,a)=C y
(E,b)=D
Para cada uno de los componentes sintcticos de la E-R ejecutar los pasos uno y dos
Paso uno) Para (vaco) construya el autmata correspondiente.
Paso 3)
Combinacin de los autmatas a + b
Obtencin de (a U b)*
Para el desarrollo de este capitulo, no hace falta trabajar con el texto gua, trabajaremos
nicamente con la gua didctica, pero es necesario que primero lea el anexo A.
Inicialmente veremos que es el anlisis lxico, para lo cual es necesario comprender
cual es el trabajo de un compilador y cuales son sus partes: Un compilador es un
programa que convierte un programa escrito en un lenguaje de alto nivel en un
programa en cdigo objeto y luego en ejecutable. Ejemplo: Cuando usted escribe un
programa en lenguaje C++, antes de hacerlo funcionar(correr) debe convertirlo en
Lo anterior significa que el compilador esta formado por los siguientes mdulos:
De igual forma en la lnea retur 0, el analizador lxico detectar que retur no es una
palabra reservada (le falta una n al final)
Ya sabemos cual es la tarea de un analizador lxico, ahora veamos cuales son sus etapas.
Una vez escrito un programa fuente, para compilarlo(transformarlo), es necesario
abrirlo y empezar a leerlo, luego se deben ir concatenando (uniendo) cada uno de sus
caracteres para formar cadenas y a su vez hay que comprobar que cada cadena
pertenezca al lenguaje en cuestin. Suponga que el lenguaje en cuestin es C++.
Entonces hay que verificar que cada una de las cadenas del programa fuente sea una
palabra reservada o un identificador. Observemos el programa:
1.
int main() {
2.
int b=10;
3.
4.
return 0;
5.
En la lnea 1 del archivo (quiero decir del programa) se van uniendo los caracteres i, n y
finalmente la t para formar la cadena int (sabemos que la cadena termina en t por el
espacio que le sigue separador) y luego hay verificar si esta cadena es una palabra
reservada de C++ o es un identificador, caso contrario tendremos un error de tipo lxico.
De igual manera procedemos con la cadena main, en lo que respecta a los parntesis, el
analizador debe ser lo suficientemente inteligente como para entender que son smbolos
independientes de la cadena main y cuando los reconozca, debe retornar un indicador
adecuado que permita saber que se reconoci un parntesis.
Para comparar, es necesario que las palabras reservadas estn guardadas en alguna
estructura, conceptualmente se maneja el termino tabla de smbolos, en ella se guardan
las palabras reservadas y los identificadores(variables) que se declaran, cuando el
analizador lxico forma una cadena, esta se compara con los elementos almacenados en
esta tabla de smbolos. Primero se busca si es palabra reservada, si no es, se busca si es
alguna variable ya declarada.
Resumiendo, podemos decir que las etapas del anlisis lxico son:
Concatenacin de caracteres.
Velocidad ID
ID
10
NUM
NUM
Int
int
Int
Palabras reservadas
identificadores
Valores numricos
En todos los casos vamos a utilizar una tabla de smbolos (TDS), esta es una estructura
que permite guardar informacin acerca de los componentes lxicos. Normalmente es
una lista ligada con algunos atributos, observe la siguiente figura:
Inicio
Abrir archivo
Variable estado igual cero (estado=0)
Variable c igual vaco (c=)
Mientras no sea fin de archivo y c sea diferente de espacio
Leer el siguiente carcter en c
En caso de que estado
Sea cero y c sea letra o digito o guin
Estado es igual a uno
Sea uno y c sea letra o digito
Estado es igual a dos
Sea dos y c sea letra o digito o guin
Estado es igual a dos
En cualquier otro caso Error lxico y terminar
Fin de caso
Fin mientras
Retornar ID
Cerrar archivo
Fin
Es posible programar autmatas para cualquier expresin regular, sin embargo cuando
se trata de lenguajes de programacin complejos, podemos hallarnos con dificultades en
el reconocimiento de los componentes lxicos. A continuacin se presenta un algoritmo
tomado del texto Compiladores tcnicas y herramientas del Dr. Alfred Aho, el mismo
que resume de manera sencilla los diferentes aspectos que se deben tomar en cuenta al
implementar un analizador lxico.
function analex: integer;
var buflex array[0..100] of char /* arreglo de longitud 100
c char;
begin
loop begin
lee un carcter en c
if c es un espacio en blanco o un smbolo tab then
no hacer nada;
else if c es un carcter de lnea nueva then
numlinea :=numlinea + 1;
else if c es un digito then begin
asignar a valcomplex el valor de este y los dgitos siguientes;
return NUM;
end
else if c es una letra then begin
poner c y las letras y dgitos sucesivos en buflex;
buscar buflex en la TDS
if buflex no esta en la TDS then begin
insertar buflex en la TDS
return ID
end
end
else begin
asignar NINGUNO a valcomplex;
return el numero entero del carcter c;
end
end
end
La tarea es hacer funcionar de forma manual este algoritmo utilizando un archivo que
contenga cadenas de caracteres.
(q1, /) = (q2, /, D)
(q2, *) = (q3, *, D)
(q3,c) = (q3, c, D)
(q3,*) = (q4, *, D)
(q4,/) = (q5, /, D)