Teoría de Autómatas La computación, muy avanzada hoy en día, sienta sus bases sobre una sólida plataforma desarrollada con mucho esfuerzo e investigación, un área importante es el trabajo con los lenguajes de programación, cuyas raíces están en la teoría de autómatas y lenguajes formales. Esta asignatura forma parte del área fundamental de la carrera de Ingeniería en Informática Informática correspondi correspondiente ente al seto semestre. Esta asignatura asignatura tiene su importancia en !ue se"ala los aspectos básicos de los lenguajes computacionales, así como nos muestra de manera general el trabajo interno de los sistemas de computación en lo referen referente te al tratam tratamien iento to de cadena cadenass y lengua lenguajes, jes, los conten contenido ido !ue se cubren cubren son principalmente los autómatas finitos, autómatas de pila, lenguajes independientes de conte conteto, to, ma!uin ma!uinas as de turing turing como como reconoc reconocedo edores res de lengua lenguajes. jes. #ea bienve bienvenid nido o al presente curso y no dude en contactar a su profesor en caso de necesitar resolver cual!uier in!uietud. #aludos y $itos%%%
Tabla de contenidos •
& 'bjetivo (eneral ) 'bjetivos Especificos
•
* +ibliografia
•
-esarrollo del prendiza
•
o
o
.& /apitulo &0 utomatas 1initos
.&.& -atos (enerales
.&.) -E#22'LL'
.&.* /onstrucción de autómatas
.&. 3ransformación de un 14 en un 1-.
.) /apitulo ) Epresiones y Lenguajes 2egulares
.).& -atos (enerales
.).) /onversión de una epresión regular en autómata finito
o
.* /apitulo * nalisis Leico
o
.*.& -atos (enerales
. /apitulo utomatas utomatas a 5ila
o
.).* lgoritmo lgoritmo de transformación de una epresión regular en un 14
..& -atos (enerales
.6 /apitulo 6 Lenguajes Independientes de /onteto
.6.& -atos (enerales
o
.7 /apitulo 7 8a!uinas de 3uring
.7.& -atos (enerales
.7.) /onstrucción de má!uinas de turing
Objetivo General -ar al estudiante una visión global del trabajo de los autómatas y su aplicación en los lenguajes de programación.
Objetivos Especificos •
/onocer como funcionan los lenguajes. Especificar lenguajes regulares y autómatas finitos para reconocimiento.
•
Escribir programas de reconocimiento l$ico.
•
•
Especificar lenguajes independientes de conteto y autómatas de pila para reconocimiento.
•
/onstruir má!uinas de turíng para reconocer lenguajes.
•
Escribir gramáticas de conteto libre.
•
Escribir programas de análisis sintáctico
Bibliografia Texto Base Hopcroft, !, et All, "ntroducción a la Teoría de Autómatas, #enguajes $ %omputación, &egunda Edición, Adison 'esle$, (adrid, )**)
Este libro tiene un espectro amplio en cuanto a !ue cubre desde los detalles hasta aspectos aspectos avanzados avanzados de cada tema, está epresado en t$rminos t$rminos sencillos sencillos y solo en casos necesarios recurre a epresar con formalismos los diferentes aspectos !ue trata. Texto Te xto %omplementario +elle$ +elle$,, ! Teoria de Autóma Autómatas tas $ #enguaj #enguajes es -ormale -ormales, s, .rent .rentice ice Hall, Hall, (adrid (adrid /001Esco Escogi gido do por por los los tema temass !ue !ue cubr cubree y prin princip cipal alme ment ntee por por la ampl amplia ia gama gama de ejercicios !ue resuelve y plantea, ofrece un capitulo especial 9el n:mero cero; dedicado a a!uellos !ue tienen problemas con las matemáticas necesarias para abordar la materia. #u metodología la basa en definiciones cortas, ejercicios resueltos con eplicaciones detalladas y muchos ejercicios planteados.
%onstrucción de autómatas
-ise"ar un 1- !ue acepte identificadores !ue inicien siempre con un guión bajo y luego puedan contener letras o dígitos. Inicialmente debemos asociar la condición inicial al estado inicial, esto significa !ue desde el primer estado al segundo estado :nicamente puede eistir una transición !ue eti!uetada con guión bajo
hora es necesario !ue la cadena pueda tener mas letras o más dígitos, esto se puede conseguir haciendo !ue desde el estado * salga una arista eti!uetada con letra 9L; hacia otro estado 9!ue puede ser el mismo estado *;. Lo mismo hay !ue hacer para reconocer más dígitos.
-esarrollemos ahora otro autómata !ue reconozca cadenas de letras 9sobre el alfabeto =a,b>; en las !ue nunca puedan ir dos a?s seguidas La condición inicial no esta asociada al estado inicial, el autómata puede empezar con una letra a o con una letra b
hora puede tener otra letra b con la !ue regresa al estado &. 4ote !ue siempre termina en el estado ).
Es posible construir autómatas !ue tengan transiciones vacías, es decir !ue sus aristas no tienen como eti!ueta símbolos del alfabeto del autómata, en su lugar tienen vacío 9@;, generalmente las transiciones vacías se utilizan para unir autómatas, como en el caso de la figura ).&A de la página B& del teto base. Transformación de un A-2 en un A-!
El procedimiento consiste en agrupar los conjuntos de estados !ue tengan entradas y salidas 9aristas; comunes, para ello se crea una tabla de transiciones 9representación del 1-;, esta matriz 9llamada 8atrizCdeC-; tiene como índices el conjunto de estados 9con aristas comunes; y los elementos del alfabeto. #on necesarias tres operaciones cuyos resultados se re!uieren al aplicar el algoritmo de transformación0 /erraduraD@ de s.D E!uivale al conjunto de estados del 14 !ue se pueden alcanzar desD de s sin consumir símbolos de la entrada 9o lo !ue es lo mismo con transicionesDe;. Esta operación devuelve un conjunto de elementos 9estados;. /erraduraDe de 3.D #ea 3 un conjunto de estados, esta operación e!uivale al conjunto de estados del 14 !ue se pueden alcanzar desde cada s en 3 sin consumir símbolos de la entrada 9o lo !ue es lo mismo con transicionesDe;. Esta operación devuelve un conjunto de elementos 9estados;. 8ueve 93, a;.D E!uivale al conjunto de estados !ue se pueden alcanzar con un símbolo a 9arista eti!uetada con a ; desde alg:n estado s de 3. Esta operación devuelve un conjunto de elementos 9estados;. En caso de tener problemas, recuerde !ue s es un estado 3 es un conjunto de estados en donde cada uno en su momento se representa por s a es un símbolo !ue eti!ueta una arista !ue va desde un estado a otro. 5or conveniencia se denominan el 14 como 4 y el 1- como -. lgoritmo &. Inicio ). F /erraduraD@ de sG H /erradura vacía del estado inicial del 14 H *. gregar al conjunto EstadosCdeC- H #e crea un conjunto con el elemento H . 5ara cada conjunto del conjunto EstadosCdeC- H #e recorre ese conjunto H 6. 3 F /onjunto del conjunto EstadosCdeC- H #e toma un elemento H 7. 5ara cada elemento del alfabeto J. a 0F elemento del alfabeto B. < F /erraduraDe 9mueve93, a;; A. #i < no está en EstadosCdeC- &G. gregar < a EstadosCdeC- &&. 1in#i &). 8atrizCdeC-K3, a 0F < &*. 1in5ara &. 1in5ara &6. 1inCdelCalgoritmo /omo ejercicio vamos a tomar el diagrama del autómata no determinista siguiente0 "nsertar Grafica
F/erradura vacia de #G F=G>
-el estado G solo se puede llegar a G sin consumir símbolos de entrada
EstadosCdeC-F=> 3FF=G>
3FF=G>
a F Ma?
a F Mb?
F+
a b + + #e llena la matriz con las entradas 9,a;F+
EstadosCdeC-F=, +> 3F+F=&,),*,6,B>
3F+F=&,),*,6,B>
a F Ma?
a F Mb?
a b + + / -
#e llena la
F/
F-
9+,b;F-
EstadosCdeC-F=, +, /, -> a b 3F/F=),*,,6,J,B,A>
3F/F=),*,,6,J,B,A>
a F Ma?
a F Mb?
+ + / / / E
F/ 9se repite;
FE
#e llena la matriz con las entradas 9/,a;F/ y 9/,b;FE
EstadosCdeC-F=, +, /, -, E> 3F-F=),*,6,7,J,B>
3F-F=),*,6,7,J,B>
a b +
+ / a F Ma?
a F Mb?
/ / E - / -
#e llena la
F/ 9se repite;
F- 9se repite;
las entradas 9-,a;F/ y 9-,b;F-
EstadosCdeC-F=, +, /, -, E> a b 3FEF=),*,6,7,J,B,&G>
3FEF=),*,6,7,J,B,&G>
+ + / -
a F Ma?
a F Mb?
/ / E - / E / -
F/ 9se repite;
F- 9se repite;
#e llena la matriz con las entradas 9E,a;F/ y 9E,b;F-
l graficar la matriz, el autómata resultante es el siguiente0
%apitulo ) Expresiones $ #enguajes 3egulares
%onversión de una expresión regular en autómata finito
/omo conclusión de lo hasta ahora visto, es posible epresar mediante una epresión regular un lenguaje regular, por lo !ue ahora nos vamos a centrar en un proceso de transformación de una epresión regular a un autómata finito no determinista. El algoritmo !ue se presenta más adelante, se basa en el orden !ue tiene la construcción de la epresión regular y toma cada uno de sus componentes por separado, construyendo un 14 para cada componente estos 14 se unifican en el mismo orden en !ue se epresa la epresión regular, dando como resultado un 14 !ue reconoce el lenguaje !ue genera la epresión regular en cuestión. Algoritmo de transformación de una expresión regular en un A-2
5ara cada uno de los componentes sintácticos de la ED2 ejecutar los pasos uno y dos 5aso uno; 5ara @ 9vacío; construya el autómata correspondiente.
5aso dos; 5ara cada símbolo a independiente de la epresión regular construya su autómata correspondiente.
En los dos casos i es el estado inicial y f el estado final o de aceptación de la subepresión. /ombinar los autómatas resultantes de acuerdo a las guías del paso tres. 5aso tres; #i #e tiene dos 14 para las epresiones s y t a; 5ara la epresión s . t construya el autómata finito siguiente0 "nsertar "magen
d; 5ara la epresión regular 9s; 9entre par$ntesis; utilice el 14 !ue diagramó para s Ejemplo0 5ara la epresión regular a 9a N b; ab obtener el 14 5aso uno y paso dos; Las epresiones !ue forman parte de la epresión regular son0 &. a ). a *. b . a 6. b 4ote !ue para cada componente se re!uiere un 14 independiente. Autómata para el componente /
Autómata para el componente )
Autómata para el componente 4
Autómata para el componente 5
Autómata para el componente 1
.aso 46
/ombinación de los autómatas a N b
'btención de 9a < b;
/oncatenación de a con 9a < b;
/oncatenación de a 9a < b; con a
%apitulo 4 Analisis #exico
5ara el desarrollo de este capitulo, no hace falta trabajar con el teto guía, trabajaremos :nicamente con la guía didáctica, pero es necesario !ue primero lea el aneo . Inicialmente veremos !ue es el análisis l$ico, para lo cual es necesario comprender cual es el trabajo de un compilador y cuales son sus partes0
ejecutable, para ello utiliza un compilador. El compilador se encarga de verificar !ue no tenga errores y luego lo convierte en ejecutable 9con etensión .EOE; El compilador cumple los siguientes tres pasos0 &. Perificación de errores del programa fuente9código de alto nivel;
•
Perificación de errores l$icos ! Perificación de errores sintácticos ! Perificación de errores semánticos 3ransformación del código de alto nivel en código objeto
•
3ransformación del código objeto en código ma!uina9ejecutable;
•
Lo anterior significa !ue el compilador esta formado por los siguientes módulos0
•
8odulo l$ico.D Encargado de verificar !ue no eistan errores l$icos 8odulo sintáctico.D Encargado de verificar !ue no eistan errores sintácticos
•
8odulo semántico.D Encargado de verificar !ue no eistan errores semánticas
•
•
•
8odulo generador de código objeto.D Encargado de convertir el programa fuente en programa objeto9código ensamblador; Encadenador.D Encargado de convertir el programa objeto en código o ma!uina programa ejecutable9unos y ceros;
Es!uema de módulos de un compilador /omo conclusión podemos anotar !ue el analizador l$ico 9o modulo l$ico; se encarga de verificar !ue todas las palabras escritas en el programa fuente pertenezcan al lenguaje de alto nivel en el !ue se escribe el programa. Ejemplo0 -ado el programa int main9; = int bF&G cout QQ aNb retur G > El analizador l$ico debe detectar !ue aNb es un error l$ico por!ue a no ha sido declarada como variable.
-e igual forma en la línea Rretur GS, el analizador l$ico detectará !ue retur no es una palabra reservada 9le falta una n al final; Ta sabemos cual es la tarea de un analizador l$ico, ahora veamos cuales son sus etapas.
int main9; =
).
int bF&G
*.
cout QQ aNb
.
return G
6.
>
En la línea & del archivo 9!uiero decir del programa; se van uniendo los caracteres i, n y finalmente la t para formar la cadena int 9sabemos !ue la cadena termina en t por el espacio !ue le sigue RseparadorS; y luego hay verificar si esta cadena es una palabra reservada de /NN o es un identificador, caso contrario tendremos un error de tipo l$ico. -e igual manera procedemos con la cadena main, en lo !ue respecta a los par$ntesis, el analizador debe ser lo suficientemente inteligente como para entender !ue son símbolos independientes de la cadena main y cuando los reconozca, debe retornar un indicador adecuado !ue permita saber !ue se reconoció un par$ntesis. 5ara comparar, es necesario !ue las palabras reservadas est$n guardadas en alguna estructura, conceptualmente se maneja el termino tabla de símbolos, en ella se guardan las palabras reservadas y los identificadores9variables; !ue se declaran, cuando el analizador l$ico forma una cadena, esta se compara con los elementos almacenados en esta tabla de símbolos. 5rimero se busca si es palabra reservada, si no es, se busca si es alguna variable ya declarada. 2esumiendo, podemos decir !ue las etapas del análisis l$ico son0
•
pertura del archivo. Lectura de sus caracteres.
•
/oncatenación de caracteres.
•
•
•
/omparación de las cadenas !ue se forman con los elementos de la tabla de símbolos. 2etorno de un indicador de la cadena reconocida, tambi$n llamado toUen.
Especificación de componentes l7xicos
/uando se dise"a un lenguaje de programación, es necesario definir cuales serán las palabras reservadas, !ue forma tendrán los identificadores, !ue formato tendrán los valores num$ricos, etc. Esto depende del tipo de aplicación !ue se le vaya a dar al lenguaje de programación, por ejemplo si se !uiere construir un lenguaje /NN, será necesario incluir palabras como int, main, return, etc. #e debe definir !ue los identificadores inicien con una letra o con un n:mero o con guion bajo y luego puedan contener letras o n:meros, así mismo los valores num$ricos deben iniciar con un n:mero, luego debe n tener un punto decimal y luego pueden tener más n:meros. Las palabras reservadas serán fijas, pero los identificadores y valores num$ricos pueden ser especificados con una epresión regular. 'bserve el siguiente ejemplo0 l d V C 9l V d ; 9l V d V C; /on esta epresión regular estamos indicando !ue los identificadores pueden iniciar con una letra o con un digito o con un guion bajo, luego deben tener una letra o un digito y despu$s pueden tener letras, dígitos o guiones bajos. En el caso de los valores num$ricos, se puede especificar su formato con la siguiente epresión regular0 9dN.dN; V 9dN; Estamos indicando !ue pueden empezar con uno o mas n:meros, seguidos de un punto decimal y luego tener mas dígitos, o tambi$n pueden ser solamente n:meros9sin punto decimal;. 2ecuerde !ue el símbolo V 9línea; significa o 9para escoger una u otra opción;. En el siguiente cuadro se indica la diferencia entre leema y componente l$ico y toUen0 En el siguiente cuadro se indica la diferencia entre leema y componente l$ico y toUen0 Leema
/omponente Leico 3oUen
Pelocidad I-
I-
&G
4<8
4<8
Int
int
Int
'bserve !ue el leema es la cadena !ue se encuentra en el archivo fuente, el componente l$ico es una clasificación a la !ue pertenece el leema y finalmente el toUen es el valor !ue retorna el analizador l$ico una vez !ue reconoció un leema. El toUen tambi$n puede ser un código !ue el dise"ador le asigne a cada componente l$ico. /oncluyendo, los componentes l$icos se especifican a trav$s de epresiones regulares, las mismas !ue luego deben ser programadas en el analizador l$ico. 3econocimiento de componentes l7xicos
/on el fin de facilitar el entendimiento, vamos a dividir el reconocimiento de componentes l$icos en categorías 9esto no es normal, sin embargo es :til;, las categorías en las !ue podemos trabajar son0 •
5alabras reservadas
•
identificadores
•
Palores num$ricos
En todos los casos vamos a utilizar una tabla de símbolos 93-#;, esta es una estructura !ue permite guardar información acerca de los componentes l$icos. 4ormalmente es una lista ligada con algunos atributos, observe la siguiente figura0
Lista ligada !ue representa una tabla de simbolos La 3-# es una estructura donde normalmente están guardadas todas las palabras reservadas del lenguaje de programación !ue se construye. El campo comCle es el espacio en donde se guardan todas las palabras reservadas o los identificadores !ue forman parte del programa, el campo valor sirve para guardar los valores !ue puedan ir tomando las variables y el campo tipo sirve para indicar el tipo de dato !ue le corresponde a cada variable. En t$rminos generales lo !ue el analizador l$ico hace es formar una cadena con los caracteres del programa fuente y compararla con cada una de los nodos de la estructura. 4ormalmente la b:s!ueda 9para la comparación;, se da a trav$s de alg:n tipo de hash o utilizando en lugar de una lista ligada un árbol +, con lo !ue se acelera la b:s!ueda. 5ara reconocer las palabras reservadas, el dise"ador del lenguaje de programación puede optar por una epresión regular como la siguiente0 letraN Wue significa !ue una palabra reservada puede estar formada por una o mas letras. Esta epresión regular transformada en seudocódigo puede !uedar como sigue0 brir archivo fuente 8ientras no sea fin de archivo H/on las siguientes líneas vamos a formar la cadena ósea la palabra reservada Paciar la variable c H inicializarla con vació Leer el siguiente carácter
#i el carácter es una letra 8ientras el carácter es diferente de espacio gregar el carácter a c H c es una variable H Leer el siguiente carácter 1in mientras 1in si Hhora lo vamos a buscar en la 3-# #i el valor de c se halla en la 3-# 2etornar c H !ue es el toUen de la palabra reservada #i no 2etornar I- H !ue es el toUen para un identificador 1in si 1in mientras /errar archivo /omo recordaran, el modulo l$ico reconoce cadenas y retorna el toUen 9símbolo; !ue las identifica, en el seudocódigo anterior se retorna I- en el caso de las palabras reservadas y se retorna la cadena misma, es decir la palabra reservada, en este caso es igual al toUen. 5ara reconocer identificadores, podemos utilizar la siguiente epresión regular0 L d C 9Ld;9Ld C; 4ote !ue el símbolo significa o #e puede empezar con letras, dígitos o guión bajo, como segundo carácter del identificador puede ir una letra o un digito y de ahí en adelante puede ir una letra, un digito o un guión bajo. Esa epresión regular puede representarse en pseudocódigo como se muestra a continuación. brir archivo fuente 8ientras no sea fin de archivo H/on las siguientes líneas vamos a formar la cadena ósea la palabra reservada Paciar la variable c H inicializarla con vació Leer el siguiente carácter
#i el carácter es una letra o un digito o un guion bajo 8ientras el carácter es letra o es digito o es guion bajo gregar el carácter a c H c es una variable H Leer el siguiente carácter 1in mientras 1in si Hhora lo vamos a buscar en la 3-# #i el valor de c se halla en la 3-# 2etornar c H !ue es el toUen de la palabra reservada #i no 2etornar I- H !ue es el toUen para un identificador 1in si 1in mientras /errar archivo /on el código escrito podemos notar !ue no eiste una forma de asegurarnos !ue el segundo carácter no sea un guión bajo, por lo !ue en ocasiones el código es algo mas difícil de implementar. nte esto surge la necesidad de programar un autómata como veremos a continuación.
utómata para reconocer identificadores en /NN 'bserve !ue el reconocimiento inicia en el estado cero y desde ahí se puede leer una letra o un digito 9un n:mero; o un guión bajo, se llega al estado uno y desde ahí leyendo letra o digito se traslada al estado dos, en donde se pueden leer letras dígitos o guiones, en cual!uier caso serán identificadores válidos. Este autómata se puede programar, observe el siguiente procedimiento0
Inicio brir archivo Pariable estado igual cero 9estadoFG; Pariable c igual vacío 9cFSS; 8ientras no sea fin de archivo y c sea diferente de espacio Leer el siguiente carácter en c En caso de !ue estado #ea cero y c sea letra o digito o guión Estado es igual a uno #ea uno y c sea letra o digito Estado es igual a dos #ea dos y c sea letra o digito o guión Estado es igual a dos En cual!uier otro caso Error l$ico y terminar 1in de caso 1in mientras 2etornar I/errar archivo 1in Es posible programar autómatas para cual!uier epresión regular, sin embargo cuando se trata de lenguajes de programación complejos, podemos hallarnos con dificultades en el reconocimiento de los componentes l$icos. continuación se presenta un algoritmo tomado del teto /ompiladores t$cnicas y herramientas del -r. lfred ho, el mismo !ue resume de manera sencilla los diferentes aspectos !ue se deben tomar en cuenta al implementar un analizador l$ico. function anale0 integer var bufle arrayKG..&GG of char H arreglo de longitud &GG c char begin
loop begin lee un carácter en c if c es un espacio en blanco o un símbolo tab then no hacer nada else if c es un carácter de línea nueva then numlinea 0Fnumlinea N & else if c es un digito then begin asignar a valcomple el valor de este y los dígitos siguientes return 4<8 end else if c es una letra then begin poner c y las letras y dígitos sucesivos en bufle buscar bufle en la 3-# if bufle no esta en la 3-# then begin insertar bufle en la 3-# return Iend end else begin asignar 4I4(<4' a valcomple return el numero entero del carácter c end end end
La tarea es hacer funcionar de forma manual este algoritmo utilizando un archivo !ue contenga cadenas de caracteres.
%apitulo 5 Automatas a .ila
%apitulo 1 #enguajes "ndependientes de %ontexto
%apitulo 8 (a9uinas de Turing
%onstrucción de m:9uinas de turing
continuación se presentan ejemplos de construcción de má!uinas de turing0 Escriba una má!uina de 3urín !ue reconozca cadenas de unos y ceros alternados !ue siempre inicien en uno y siempre terminen en cero 9G&;N La recomendación está en iniciar definiendo la función de trancisión, luego se pueden definir los elementos restantes de la má!uina0 La ma!uina siempre inicia en el estado !G, y la cadena !ue reconoce, siempre inicia con G0 9!G, vacio; F 9!&, vacio, -;
Inicio del trabajo de la má!uina
9!&, G; F 9!), G, Inicia reconociendo el cero de la cadena, lo escribe en la cinta y se -; mueve hacia la derecha 9!), &; F 9!&, &, /uando encuentra un uno, regresa al estado !& para volver a reconocer -; un cero En el estado !& puede encontrar el símbolo en blanco !ue indica !ue la 9!&, blanco; F cadena se termino, en ese caso regresa una posición y se mueve al estado 9!*, blanco, I; * en donde se reconoce la cadena. 4ote !ue en el estado !& puede reconocer un cero lo !ue indica !ue la cadena continua o puede encontrar un símbolo en blanco lo !ue
indica !ue la cadena termina hora definimos los elementos restantes de la má!uina0
Estados F =!G, !&, !), !*> lfabeto de la cinta F =G,&, blanco> lfabeto F =G,&,> Estado inicial F =!G> Estado final F =!*>
-ise"emos ahora una má!uina !ue acepte comentarios en lenguaje c, recuerde !ue los comentarios en lenguaje c son de este tipo0 H !uí va el comentario H
El contenido del comentario puede ser cual!uier símbolo, al !ue llamaremos c Este símbolo no puede ser el RS
Igualmente definamos primero la función de transición0 9!G, vacio; F 9!&, vacio, -;
Inicio del trabajo de la má!uina
9!G, vacio; F 9!&, vacio, -;
Inicio del trabajo de la má!uina
9!&, H; F 9!), H, -;
Inicia reconociendo el RHS de la cadena, lo escribe en la cinta y se mueve hacia la derecha
9!), ; F 9!*, , -;
/uando encuentra un , avanza para seguir el reconocimiento
9!*,c; F 9!*, c, -;
En el estado !* puede estar leyendo muchos símbolos cual!uiera a ecepción del
9!*,; F 9!, , -;
/uando en el estado !* encuentra un , se prepara para a continuación recibir un H
9!,H; F 9!6, H, -;
/uando en ! recibe un H, se prepara para terminar de reconocer la cadena
9!6, blanco; F 9!7, blanco, I;
En el estado !6 puede encontrar el símbolo en blanco !ue indica !ue la cadena se termino.
hora si completamos la má!uina
Estados F =!G, !&, !), !*,!,!6,!7>
lfabeto de la cinta F =H,,c,blanco> lfabeto F =H.,c> Estado inicial F =!G> Estado final F =!7> X/ 3HmcD&7DG)DGJD*A
La teoría de autómatas es una rama de las ciencias de la computación que estudia las máquinas abstractas y los problemas que éstas son capaces de resolver. La teoría de autómatas está estrechamente relacionada con la teoría del lenguaje formal ya que los autómatas son clasificados a menudo por la clase de lenguajes formales que son capaces de reconocer. Un autómata es un modelo matemático para una máquina de estado finito (!" sus siglas en inglés#. Una !" es una máquina que$ dada una entrada de símbolos$ %salta% a través de una serie de estados de acuerdo a una función de transición (que puede ser e&presada como una tabla#. 'n la variedad comn %"ealy% de !"s$ esta función de transición dice alautómata a qué estado cambiar dados unos determinados estado y símbolo. La entrada es leída símbolo por símbolo$ hasta que es %consumida% completamente (piense en ésta como una cinta con una palabra escrita en ella$ que es leída por una cabe)a lectora del autómata* la cabe)a se mueve a lo largo de la cinta$ leyendo un símbolo a la ve)# una ve) la entrada se ha agotado$ el autómata se detiene. +ependiendo del estado en el que el autómata finali)a se dice que este ha aceptado o recha)ado la entrada. !i éste termina en el estado %acepta%$
el autómata acepta la palabra. !i lo hace en el estado %recha)a%$ el autómata recha)ó la palabra$ el conjunto de todas las palabras aceptadas por elautómata constituyen el lenguaje aceptado por el mismo. 'n este autómata nos basamos en la imagen siguiente$ la cual muestra el diagrama del autómata con la secuencia de estados$ este es un autómatafinito determinista$ ya no tiene transiciones vacías. 'l programa esta hecho en base al ejemplo tal cual.
'ste autómata verifica una cadena$ si llega al estado , significa que la cadena ingresada es un he&adecimal$ si el estado termina en significa que es un natural$ si termina en es decimal$ si termina en / es un octal. 'ste es solo un ejemplo$ ustedes en base a este que esta simple pueden hacer uno mucho mas complejo. La manera en la que se maneja el programa es
muy parecida a la de unanali)ador lé&ico ya que regresa que tipo de cadena es$ esto lo hice solo para verificar que el programa funciona correctamente.
'h aquí el 0ódigo1
#include #define UDEF -1 using namespace std ; int delta(int estado, char c) s!itch(estado) case " if(c $$ %"%) return 1;
case 1
case case case . case &
case case / case
else if((isdigit(c)) and c > %"%) return &; else if(c $$ %'%) return ; else return UDEF; if(isdigit(c) and c < %%) return ; else if(c $$ %*% or c $$ %+%) return ; else if(c $$ %'%) return ; else return UDEF; if(is+digit(c)) return ; else return UDEF; if(is+digit(c)) return .; else return UDEF; if(is+digit(c)) return ; else return UDEF; if(isdigit(c)) return &; else if( c $$ %'%) return ; else return UDEF; if(isdigit(c)) return /; else return UDEF; if(isdigit(c)) return /; else return UDEF; if(isdigit(c) and c < %%) return ; else return UDEF;
0 0 string process(int estado, const char cadena) for(int i $ ";cadena2i3 4$ "; i55) estado $ delta(estado,cadena2i3); if(estado $$ UDEF) 6rea7; 0 if(estado $$ .) return 8he+adecimal8; else if(estado $$ &) return 8natural8; else if(estado $$ /) return 8decimal8; else if(estado $$ ) return 8octal8; else return 8no 9alida8; 0 string test(const char cadena) int pf $ "; :: estado inicial string tipo; tipo $ process( pf,cadena); return tipo; 0 int main() string cadena; cout << 8ngresa la cadena 8; getline(cin,cadena); cout << 8a cadena es 8 << test(cadena'c=str()); return ";
0