AUTÓMATAS FINITOS Y LENGUAJES REGULARES
Un autómata es una máquina, ya sea real o virtual, que se utiliza para el reconocimiento de patrones, es decir, buscar una cadena de símbolos determinada de entre varias válidas. Una aplicación real es la construcción de compiladores, que como sabemos, comprueban que las palabras reservadas de las estructuras estén bien puestas (parte del análisis léxico). Como veremos, los autómatas finitos y los lenguajes regulares se encuentran en el nivel más bajo de la jerarquía de máquinas y lenguajes.
1.1. ANÁLISIS LÉXICO Vamos a seguir un ejemplo real para la descripción de un autómata: los nombres de variables en un lenguaje de programación cualquiera, los cuales están compuestos por una letra inicial seguidos por un conjunto finito de letras y números cualquiera. Cualquier estructura léxica en un lenguaje de programación (una cadena del programa fuente) termina con un conjunto de símbolos reconocidos como fin de la estructura; las llamaremos marcas de fin de cadena y pueden ser espacios, puntos y comas y retorno de carro. En la declaración de variables, recordemos que usamos comas para separar los nombres de variable. Como la descripción de un autómata en lenguaje natural puede ser ambigua si este es un poco complicado, necesitamos medios para representarlos de una forma exacta.
1.1.1. Diagramas de transiciones También llamado diagrama de estados o red de transiciones, es una representación gráfica del autómata, y está compuestos de: Círculos.- Es un conjunto finito, que van a representar posiciones o estados. Cada uno de ellos lo podremos etiquetar con un número (un nombre) para identificarlo posteriormente. A Uno de ellos se le apunta con una flecha (apuntador) para denotar que se trata del estado inicial. A Uno o más de ellos son círculos dobles van a ser el/los estados de aceptación, designando así estados en los que se reconoce la cadena como válida. Al estado actual puede ser a la vez de aceptación, aunque no es obligatorio Arcos.- Es cada una de las flechas que unen dos estados cualesquiera. Cada arco estará etiquetado con el símbolo o el tipo de símbolo que podría presentarse en la cadena de entrada que se analice. Decimos que el autómata representado por un diagrama de transiciones acepta una cadena si la secuencia de símbolos que aparecen en la misma (de izquierda a derecha) corresponde a una secuencia de arcos rotulados que conducen del círculo con apuntador a un círculo doble. A partir del diagrama de transiciones se puede hacer un programa que reconozca estructuras léxicas (cadenas válidas), aunque el resultado de la conversión no sea la mejor de las posibles soluciones. Se designa una variable para almacenar el estado actual y se inicializa como el estado inicial. Con una dentro de una sentencia WHILE (no sea fin de cadena), una sentencia CASE OF dirige las transiciones a otros estados, dando el estado siguiente mediante IF-THEN-ELSE anidados, dependiendo del símbolo leído. Si la cadena es inaceptable, el programa sale a una rutina de error.
1.1.2. Tabla de transiciones Es una representación tabular (una tabla) del autómata donde la tabla tiene:
Desde la tabla de transiciones también se puede hacer un programa, pero la solución es mejor, pues el algoritmo es el mismo para autómatas con el mismo número de estados y de símbolos, cambiando sólo el contenido de la tabla. Se asigna a una variable el estado inicial, que se actualizará con el elemento (variable, símbolo actual) que estará en memoria. El programa desde el diagrama de transiciones no es la mejor solución (si hay muchos estados, el CASE-OF puede ser interminable); Es mejor desde la tabla de transiciones.
© 1999 Roberto de la Fuente López. Todos los derechos reservados Fecha de actualización: 15 de abril de 1999 |