Vous êtes sur la page 1sur 21

Teora de Autmatas

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

1 Objetivo General 2 Objetivos Especificos 3 Bibliografia 4 Desarrollo del Aprendiza 4.1 Capitulo 1: Automatas Finitos

4.1.1 Datos Generales 4.1.2 DESARROLLO 4.1.3 Construccin de autmatas 4.1.4 Transformacin de un AFN en un AFD.

4.2 Capitulo 2 Expresiones y Lenguajes Regulares

4.2.1 Datos Generales 4.2.2 Conversin de una expresin regular en autmata finito 4.2.3 Algoritmo de transformacin de una expresin regular en un AFN

4.3 Capitulo 3 Analisis Lexico

4.3.1 Datos Generales

4.4 Capitulo 4 Automatas a Pila

4.4.1 Datos Generales

4.5 Capitulo 5 Lenguajes Independientes de Contexto

4.5.1 Datos Generales

4.6 Capitulo 6 Maquinas de Turing

4.6.1 Datos Generales 4.6.2 Construccin de mquinas de turing

Objetivo General
Dar al estudiante una visin global del trabajo de los autmatas y su aplicacin en los lenguajes de programacin.

Objetivos Especificos
Conocer como funcionan los lenguajes. Especificar lenguajes regulares y autmatas finitos para reconocimiento. Escribir programas de reconocimiento lxico. Especificar lenguajes independientes de contexto y autmatas de pila para reconocimiento. Construir mquinas de turng para reconocer lenguajes. Escribir gramticas de contexto libre. Escribir programas de anlisis sintctico

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 1995 Escogido 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.

Desarrollo del Aprendiza


Capitulo 1: Automatas Finitos

Datos Generales
Texto Base Capitulo Paginas Capitulo Paginas Capitulo Paginas Introduccion a la teoria de automatas, lenguaje y computacion 1. Para que sirven los automatas? 1-6 1.5 Conceptos centrales de la teoria de automatas 32 - 37 2 Automatas finitos 41 - 90 Horas de estudio empleadas para el 10 desarrollo del contenido Horas Horas de estudio empleadas para el 1 desarrollo del contenido Horas Horas de estudio empleadas para el 1 horas desarrollo del contenido

DESARROLLO
Estimado(a) estudiante, en este primer capitulo se van a tratar los temas iniciales de la Teora de Autmatas, para un mejor entendimiento los temas se plantean en la siguiente tabla con recomendaciones que pueden guiar su trabajo.
Tema a revisar Descripcin del Contenido a revisar Actividades Recomendadas * Lectura de las pginas 1 y 2 Ingresar al Entorno Virtual de Aprendizaje (EVA) y consultar con los(as) participantes del curso y con el profesor * Lectura de las pginas 2, 3 y 4 Descripcin de las Porqu estudiar teora aplicaciones de los de autmatas? autmatas, Elabore un cuadro de las principales aplicaciones de los autmatas Observar y ejecutar el modelo de

Para qu sirven los autmatas finitos?

Descripcin del uso de los autmatas

autmata de interruptor de la pgina 3 Observar y ejecutar el autmata de la figura 1.2 pgina 4 Representaciones estructurales Descripcin de la notacin gramatical y expresiones regulares * Lectura de la seccin 1.1.2 del texto base * Lectura de la seccin 1.1.3 Autmatas y complejidad Ingresar al Entorno Virtual de Aprendizaje (EVA) y responda la autoevaluacin plateada Alfabetos, cadenas y lenguajes Alfabetos, construccin de cadenas, operaciones * Lectura de la seccin 1..5 con lenguajes * Lectura de las pginas 41 y 42 Ingresar al Entorno Virtual de Aprendizaje (EVA) y consultar con los(as) participantes del curso y con el profesor * Lectura de las pginas 42 50 Entender las reglas bsicas del Presentacin del Descripcin informal de funcionamiento de un AF los autmatas finitos a travs de un ejemplo proceso mostradas en la pgina 43 Analizar detenidamente los autmatas de la pgina 44, en las paginas 44 y 45 se halla la descripcin de su funcionamiento * Lectura de las pginas 50 60 Tome nota de la definicin formal de un autmata finito determinista (AFD) Determine como trabaja la funcin de Autmatas finitos deterministas Definicin y graficacin de autmatas transicin extendida Determinar la diferencia entre una tabla de transiciones y un diagrama de transiciones Ingresar al Entorno Virtual de Aprendizaje (EVA) y responda la autoevaluacin plateada

Autmatas finitos: introduccin

Generalidades sobre los autmatas finitos

* Lectura de las pginas 61-74 Determine que es un autmata finito no determinista (AFND) Tome nota de la definicin formal Determine como trabaja la funcin de transicin extendida Determine cual es el lenguaje que acepta un AFND Determinar las principales aplicaciones de los autmatas finitos. Seccin 2.4. Autmatas finitos no deterministas Observar el autmata de la figura 2.16, pgina 76 Determinar cual es la utilidad de una transicin vaca Ingresar al Entorno Virtual de Aprendizaje (EVA) y descargue materiales complementario y ejercicios planteado y resueltos sobre el tema Ingrese al Entorno Virtual de Aprendizaje (EVA) y participe en el foro del primer bimestre, las indicaciones precisas estn descritas en el foro.

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.

Es posible construir autmatas que tengan transiciones vacas, es decir que sus aristas no tienen como etiqueta smbolos del alfabeto del autmata, en su lugar tienen vaco (), generalmente las transiciones vacas se utilizan para unir autmatas, como en el caso de la figura 2.19 de la pgina 81 del texto base.

Transformacin de un AFN en un AFD.

El procedimiento consiste en agrupar los conjuntos de estados que tengan entradas y salidas (aristas) comunes, para ello se crea una tabla de transiciones (representacin del AFD), esta matriz (llamada Matriz_de_D) tiene como ndices el conjunto de estados (con aristas comunes) y los elementos del alfabeto. Son necesarias tres operaciones cuyos resultados se requieren al aplicar el algoritmo de transformacin: Cerradura- de s.- Equivale al conjunto de estados del AFN que se pueden alcanzar des-de s sin consumir smbolos de la entrada (o lo que es lo mismo con transiciones-e). Esta operacin devuelve un conjunto de elementos (estados). Cerradura-e de T.- Sea T un conjunto de estados, esta operacin equivale al conjunto de estados del AFN que se pueden alcanzar desde cada s en T sin consumir smbolos de la entrada (o lo que es lo mismo con transicionese). Esta operacin devuelve un conjunto de elementos (estados). Mueve (T, a).- Equivale al conjunto de estados que se pueden alcanzar con un smbolo a (arista etiquetada con a ) desde algn estado s de T. Esta operacin devuelve un conjunto de elementos (estados). En caso de tener problemas, recuerde que s es un estado; T es un conjunto de estados en donde cada uno en su momento se representa por s; a es un smbolo que etiqueta una arista que va desde un estado a otro. Por conveniencia se denominan el AFN como N y el AFD como D. Algoritmo 1. Inicio 2. A = Cerradura- de s0 /* Cerradura vaca del estado inicial del AFN */ 3. Agregar A al conjunto Estados_de_D /* Se crea un conjunto con el elemento A */ 4. Para cada conjunto del conjunto Estados_de_D /* Se recorre ese conjunto */ 5. T = Conjunto del conjunto Estados_de_D /* Se toma un elemento */ 6. Para cada elemento del alfabeto 7. a := elemento del alfabeto 8. U = Cerradura-e (mueve(T, a)) 9. Si U no est en Estados_de_D 10. Agregar U a Estados_de_D 11. FinSi 12. Matriz_de_D[T, a] := U 13. FinPara 14. FinPara 15. Fin_del_algoritmo Como ejercicio vamos a tomar el diagrama del autmata no determinista siguiente: Insertar Grafica
A=Cerradura vacia de S0 Del estado 0 solo se puede llegar a 0

A={0} Estados_de_D={A} T=A={0} a = a U=Cerrad-vacia(Mueve(T,a)) U=Cerrad-vacia(Mueve(0,a)) U=Cerrad-vacia(1) U={1,2,3,5,8}=B Estados_de_D={A, B} T=B={1,2,3,5,8} a = a U=Cerrad-vacia(Mueve(T,a)) U=Cerrad-vacia(Mueve(1,2,3,5,8, a)) U=Cerrad-vacia(4,9) U={2,3,4,5,7,8,9}=C Estados_de_D={A, B, C, D}

sin consumir smbolos de entrada

T=A={0} a b a = b U=Cerrad-vacia(Mueve(T,a)) U=Cerrad-vacia(Mueve(0,b)) U=Cerrad-vacia(vacio) U=vacio; no se lo considera A B B Se llena la matriz con las entradas (A,a)=B

T=B={1,2,3,5,8} a = b U=Cerrad-vacia(Mueve(T,a))

a b A B B C D Se llena la matriz

U=Cerrad-vacia(Mueve(1,2,3,5,8, b))

con las entradas

U=Cerrad-vacia(6) U={2,3,5,6,7,8}=D

(B,a)=C y (B,b)=D

a b T=C={2,3,4,5,7,8,9} a = a U=Cerrad-vacia(Mueve(T,a)) T=C={2,3,4,5,7,8,9} a = b U=Cerrad-vacia(Mueve(T,a)) A B B C D C C E D

U=Cerrad-vacia(Mueve(2,3,4,5,7,8,9, U=Cerrad-vacia(Mueve(2,3,4,5,7,8,9, Se llena la matriz a)) U=Cerrad-vacia(4,9) U={2,3,4,5,7,8,9}=C (se repite) b)) U=Cerrad-vacia(6,10) U={2,3,5,6,7,8,10}=E con las entradas (C,a)=C y (C,b)=E Estados_de_D={A, B, C, D, E} T=D={2,3,5,6,7,8} a = a U=Cerrad-vacia(Mueve(T,a)) U=Cerrad-vacia(Mueve(2,3,5,6,7,8, T=D={2,3,5,6,7,8} a = b U=Cerrad-vacia(Mueve(T,a)) U=Cerrad-vacia(Mueve(2,3,5,6,7,8 a b A B B C D C C E D C D

a)) U=Cerrad-vacia(4,9) U={2,3,4,5,7,8,9}=C (se repite)

b)) U=Cerrad-vacia(6) U={2,3,5,6,7,8}=D (se repite)

Se llena la matriz con 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} a = a U=Cerrad-vacia(Mueve(T,a)) U=Cerradvacia(Mueve(2,3,5,6,7,8,10, a)) U=Cerrad-vacia(4,9) U={2,3,4,5,7,8,9}=C (se repite) A B T=E={2,3,5,6,7,8,10} a = b U=Cerrad-vacia(Mueve(T,a)) U=Cerradvacia(Mueve(2,3,5,6,7,8,10, b)) U=Cerrad-vacia(6) U={2,3,5,6,7,8}=D (se repite) B C D C C E D C D E C D Se llena la matriz con las entradas (E,a)=C y (E,b)=D

Al graficar la matriz, el autmata resultante es el siguiente: insertar grafica

Capitulo 2 Expresiones y Lenguajes Regulares

Datos Generales
Texto Base Capitulo Introduccion a la teoria de automatas, lenguaje y computacion 3. Expresiones y Lenguajes Regulares Horas de estudio empleadas para el desarrollo del contenido Tema a revisar Descripcin del Contenido a revisar Actividades Recomendadas * Lectura de las pginas 91-94 12 horas

Paginas

1-6

E-R, y operadores Expresiones regulares utilizados en la y lenguajes regulares construccin de E-R

Determine que es una E-R, como trabaja y con que tipo de lenguajes opera Ingresar al Entorno Virtual de Aprendizaje (EVA) y consultar con los(as) participantes del curso y con el profesor * Lectura de las pginas 94-96 Determinar que elementos pueden ser EConstruccin de E-R Se detallan los pasos para construir E-R R Analice la BASE y el PASO INDUCTIVO que muestran como se forman las E-R Observe los ejemplos planteados en la pgina 96 * Lectura de las pginas 97-98 Determine el orden en que se evalan las Precedencia de operadores de E-R Definicin del orden de evaluacin de las expresiones expresiones regulares Elabore una tabla con los operadores ordenados segn su prioridad o precedencia * Lectura de las pginas 111-117 Observe el ejemplo planteado Conversin de E-R en autmatas finitos Resolver el ejercicio 3.2.4 de la pgina 116 del texto base Ingresar al Entorno Virtual de Aprendizaje (EVA) y responder la auto evaluacin que all se plantea

Conversin de una expresin regular en autmata finito


Como conclusin de lo hasta ahora visto, es posible expresar mediante una expresin regular un lenguaje regular, por lo que ahora nos vamos a centrar en un proceso de transformacin de una expresin regular a un autmata finito no determinista. El algoritmo que se presenta ms adelante, se basa en el orden que tiene la construccin de la expresin regular y toma cada uno de sus componentes por separado, construyendo un AFN para cada componente; estos AFN se unifican en el mismo orden en que se expresa la

expresin regular, dando como resultado un AFN que reconoce el lenguaje que genera la expresin regular en cuestin.

Algoritmo de transformacin de una expresin regular en un AFN


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 dos) Para cada smbolo a independiente de la expresin regular construya su autmata correspondiente.

En los dos casos i es el estado inicial y f el estado final o de aceptacin de la subexpresin. Combinar los autmatas resultantes de acuerdo a las guas del paso tres. Paso tres) Si Se tiene dos AFN para las expresiones s y t a) Para la expresin s . t construya el autmata finito siguiente: Insertar Imagen d) Para la expresin regular (s) (entre parntesis) utilice el AFN que diagram para s Ejemplo: Para la expresin regular a (a + b)* ab obtener el AFN Paso uno y paso dos) Las expresiones que forman parte de la expresin regular son: 1. a 2. a 3. b 4. a 5. b Note que para cada componente se requiere un AFN independiente.

Autmata para el componente 1

Autmata para el componente 2

Autmata para el componente 3

Autmata para el componente 4

Autmata para el componente 5

Paso 3) Combinacin de los autmatas a + b

Obtencin de (a U b)*

Concatenacin de a con (a U b)*

Concatenacin de a (a U b)* con a

Capitulo 3 Analisis Lexico

Datos Generales
Texto Base Paginas No es necesario el texto base Horas de estudio empleadas para el desarrollo del contenido 10 horas

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 ejecutable, para ello utiliza un compilador. El compilador se encarga de verificar que no tenga errores y luego lo convierte en ejecutable (con extensin .EXE) El compilador cumple los siguientes tres pasos: 1. Verificacin de errores del programa fuente(cdigo de alto nivel)

Verificacin de errores lxicos q Verificacin de errores sintcticos q Verificacin de errores semnticos Transformacin del cdigo de alto nivel en cdigo objeto Transformacin del cdigo objeto en cdigo maquina(ejecutable) Lo anterior significa que el compilador esta formado por los siguientes mdulos: Modulo lxico.- Encargado de verificar que no existan errores lxicos Modulo sintctico.- Encargado de verificar que no existan errores sintcticos Modulo semntico.- Encargado de verificar que no existan errores semnticas Modulo generador de cdigo objeto.- Encargado de convertir el programa fuente en programa objeto(cdigo ensamblador) Encadenador.- Encargado de convertir el programa objeto en cdigo o maquina programa ejecutable(unos y ceros)

Esquema de mdulos de un compilador Como conclusin podemos anotar que el analizador lxico (o modulo lxico) se encarga de verificar que todas las palabras escritas en el programa fuente pertenezcan al lenguaje de alto nivel en el que se escribe el programa. Ejemplo: Dado el programa int main() { int b=10; cout << a+b; retur 0; }

El analizador lxico debe detectar que a+b es un error lxico porque a no ha sido declarada como variable. 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. 2. 3. 4. 5. int main() { int b=10; cout << a+b; return 0; }

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: Apertura del archivo. Lectura de sus caracteres. Concatenacin de caracteres. Comparacin de las cadenas que se forman con los elementos de la tabla de smbolos. Retorno de un indicador de la cadena reconocida, tambin llamado token. Especificacin de componentes lxicos Cuando se disea un lenguaje de programacin, es necesario definir cuales sern las palabras reservadas, que forma tendrn los identificadores, que formato tendrn los valores numricos, etc. Esto depende del tipo de aplicacin que se le vaya a dar al lenguaje de programacin, por ejemplo si se quiere construir un lenguaje C++, ser necesario incluir palabras como int, main, return, etc. Se debe definir que los identificadores inicien con una letra o con un nmero o con guion bajo y luego puedan contener letras o nmeros, as mismo los valores numricos deben iniciar con un nmero, luego debe n tener un punto decimal y luego pueden tener ms nmeros. Las palabras reservadas sern fijas, pero los identificadores y valores numricos pueden ser especificados con una expresin regular. Observe el siguiente ejemplo: l d _ (l d ) (l d _) Con esta expresin regular estamos indicando que 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 despus pueden tener letras, dgitos o guiones bajos. En el caso de los valores numricos, se puede especificar su formato con la siguiente expresin regular: (d+.d+) (d+) Estamos indicando que pueden empezar con uno o mas nmeros, seguidos de un punto decimal y luego tener mas dgitos, o tambin pueden ser solamente nmeros(sin punto decimal). Recuerde que el smbolo (lnea) significa o (para escoger una u otra opcin).

En el siguiente cuadro se indica la diferencia entre lexema y componente lxico y token: En el siguiente cuadro se indica la diferencia entre lexema y componente lxico y token:
Lexema 10 Int Componente Lexico Token ID NUM Int NUM int Velocidad ID

Observe que el lexema es la cadena que se encuentra en el archivo fuente, el componente lxico es una clasificacin a la que pertenece el lexema y finalmente el token es el valor que retorna el analizador lxico una vez que reconoci un lexema. El token tambin puede ser un cdigo que el diseador le asigne a cada componente lxico. Concluyendo, los componentes lxicos se especifican a travs de expresiones regulares, las mismas que luego deben ser programadas en el analizador lxico. Reconocimiento de componentes lxicos Con el fin de facilitar el entendimiento, vamos a dividir el reconocimiento de componentes lxicos en categoras (esto no es normal, sin embargo es til), las categoras en las que podemos trabajar son: 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:

Lista ligada que representa una tabla de simbolos La TDS es una estructura donde normalmente estn guardadas todas las palabras reservadas del lenguaje de programacin que se construye. El campo com_lex es el espacio en donde se guardan todas las palabras reservadas o los identificadores que forman parte del programa, el campo valor sirve para guardar los valores que puedan ir tomando las variables y el campo tipo sirve para indicar el tipo de dato que le corresponde a cada variable. En trminos generales lo que el analizador lxico hace es formar una cadena con los caracteres del programa fuente y compararla con cada una de los nodos de la estructura. Normalmente la bsqueda (para la comparacin), se da a travs de algn tipo de hash o utilizando en lugar de una lista ligada un rbol B, con lo que se acelera la bsqueda. Para reconocer las palabras reservadas, el diseador del lenguaje de programacin puede optar por una expresin regular como la siguiente: letra+ Que significa que una palabra reservada puede estar formada por una o mas letras. Esta expresin regular transformada en seudocdigo puede quedar como sigue: Abrir archivo fuente Mientras no sea fin de archivo /*****Con las siguientes 4 lneas vamos a formar la cadena sea la palabra reservada Vaciar la variable c /* inicializarla con vaci Leer el siguiente carcter

Si el carcter es una letra Mientras el carcter es diferente de espacio Agregar el carcter a c /* c es una variable */ Leer el siguiente carcter Fin mientras Fin si /*****Ahora lo vamos a buscar en la TDS Si el valor de c se halla en la TDS Retornar c /* que es el token de la palabra reservada Si no Retornar ID /* que es el token para un identificador Fin si Fin mientras Cerrar archivo Como recordaran, el modulo lxico reconoce cadenas y retorna el token (smbolo) que las identifica, en el seudocdigo anterior se retorna ID en el caso de las palabras reservadas y se retorna la cadena misma, es decir la palabra reservada, en este caso es igual al token. Para reconocer identificadores, podemos utilizar la siguiente expresin regular:

Se puede empezar con letras, dgitos o guin bajo, como segundo carcter del identificador puede ir una letra o un digito y de ah en adelante puede ir una letra, un digito o un guin bajo. Esa expresin regular puede representarse en pseudocdigo como se muestra a continuacin. Abrir archivo fuente Mientras no sea fin de archivo /*****Con las siguientes 4 lneas vamos a formar la cadena sea la palabra reservada Vaciar la variable c /* inicializarla con vaci Leer el siguiente carcter

Si el carcter es una letra o un digito o un guion bajo Mientras el carcter es letra o es digito o es guion bajo Agregar el carcter a c /* c es una variable */ Leer el siguiente carcter Fin mientras Fin si /*****Ahora lo vamos a buscar en la TDS Si el valor de c se halla en la TDS Retornar c /* que es el token de la palabra reservada Si no Retornar ID /* que es el token para un identificador Fin si Fin mientras Cerrar archivo Con el cdigo escrito podemos notar que no existe una forma de asegurarnos que el segundo carcter no sea un guin bajo, por lo que en ocasiones el cdigo es algo mas difcil de implementar. Ante esto surge la necesidad de programar un autmata como veremos a continuacin.

Autmata para reconocer identificadores en C++