1. a )
Diagrama de Transición de Estados.
Como paso intermedio en la construcción de un analizador léxico, primero convertimos
los patrones en diagramas de flujo estilizados, a los cuales se les llama “diagramas de
transición de estados”.
Los diagramas de transición de estados tienen una colección de nodos o círculos, llamados
estados. Cada estado representa una condición que podría ocurrir durante el proceso de
explorar la entrada, buscando un lexema que coincida con uno de varios patrones.
Podemos considerar un estado como un resumen de todo lo que debemos saber acerca de
los caracteres que hemos visto entre el apuntador inicio Lexema y el apuntador avance.
Las Líneas se dirigen de un estado a otro del diagrama de transición de estados. Cada
línea se etiqueta mediante un símbolo o conjunto de símbolos. Si nos encontramos en
cierto estado s, y el siguiente símbolo de entrada es a, buscamos una línea que salga del
estado 5 y este etiquetado por a (y tal vez por otros símbolos también). Si encontramos
dicha línea, avanzamos el apuntador avance y entramos al estado del diagrama de
transición de estados al que nos lleva esa línea. Asumiremos que todos nuestros diagramas
de transición de estados son deterministas, lo que significa que nunca hay más de una
línea que sale de un estado dado, con un símbolo dado de entre sus etiquetas Algunas
convenciones importantes de los diagramas de transición de estados son:
1. Se dice que ciertos estados son de aceptación, o finales. Estos estados indican que
se ha encontrado un lexema, aunque el lexema actual tal vez no consista de todas
las posiciones entre los apuntadores inicio Lexema y avance Siempre indicamos
un estado de aceptación mediante un círculo doble, y si hay que realizar una acción
(por lo general, devolver un token y un valor de atributo al analizador sintáctico),
la adjuntaremos al estado de aceptación.
2. Además, si es necesario retroceder el apuntador avance una posición (es decir, si
el lexema no incluye el símbolo que nos llevó al estado de aceptación), entonces
deberemos colocar de manera adicional un * cerca del estado de aceptación. En
nuestro ejemplo, nunca es necesario retroceder a avance más de una posición, pero
si lo fuera, podríamos adjuntar cualquier número de *s al estado de aceptación.
3. Un estado se designa como el estado inicial; esto se indica mediante una línea
etiquetada como “inicio”, que no proviene de ninguna parte. El diagrama de
transición siempre empieza en el estado inicial, antes de leer cualquier símbolo de
entrada.
Autómata
Del
Lenguaje
2. b )
En la figura anterior y en la de esta página podemos observar lo que es nuestro diagrama
de transición de estados aplicado a nuestro lenguaje de programación, específicamente en
cuanto a operadores se refiere.
Estos ya fueron vistos en al gramática y tabal de Tokens propia del lenguaje, cada uno
con una función específica. Nuestro analizador léxico va leyendo token por token dada
las secuencias de nuestro autómata, actuando este como un reglamento que se debe seguir
para la ejecución correcta del programa.
3. c )
El reconocimiento de las palabras reservadas y los identificadores presenta un problema.
Por lo general, las palabras clave como i f o then son reservadas, por lo que no son
identificadores, aun cuando lo parecen. Así, aunque por lo general usamos un diagrama
de transición de estados para buscar lexemas de identificadores, este diagrama también
reconocerá las palabras claves y de operaciones aritméticas que hemos declarado en este
documento previamente.
4. d )
Hay dos formas en las que podemos manejar las palabras reservadas que parecen
identificadores:
1. Instalar las palabras reservadas en la tabla de símbolos desde el principio. Un
campo dela entrada en la tabla de símbolos indica que estas cadenas nunca serán
identificadores ordinarios, y nos dice qué token representan.
2. Crear diagramas de transición de estados separados para cada palabra clave;
9. i )
Hay varias formas en las que pueden utilizarse los diagramas de transición de estados
para construir un analizador léxico. Sin importar la estrategia general, cada estado se
representa mediante una pieza de código.
Podemos imaginar una variable estado que contiene el número del estado actual para un
diagrama de transición de estados. Una instrucción Switch con base en el valor de estado
nos lleva al código para cada uno de los posibles estados, en donde encontramos la acción
de ese estado.
A menudo, el código para un estado es en sí una instrucción Switch o una bifurcación de
varias vías que determina el siguiente estado mediante el proceso de leer y examinar el
siguiente carácter de entrada.
Ejemplo:
El método preferido, y el que vamos a usar en las siguientes secciones, es combinar todos
los diagramas de transición de estados en uno solo. Permitimos que el diagrama de
transición de estados lea la entrada hasta que no haya un siguiente estado posible, y
después tomamos el lexema más largo que haya coincidido con algún patrón.
En las siguientes secciones se mostrara la aplicación de nuestro diagrama de estados al
momento de hacer concretamente nuestro analizador léxico utilizando JFlex. El modo en
que este va a analizando token por token hasta encontrar ya sea un error o el permiso
gramatical que da nuestras declaraciones anteriores para seguir ejecutándose.