Clase #3 - DFA y NFA [Compiladores e Interpretes]

Clase #3 - DFA y NFA [Compiladores e Interpretes] -...

Info iconThis preview shows page 1. Sign up to view the full content.

View Full Document Right Arrow Icon
This is the end of the preview. Sign up to access the rest of the document.

Unformatted text preview: Compiladores Compiladores e Interpretes Autómatas Finitos Deterministas (DFA) Autómatas Finitos No Deterministas (NFA) Luis Ochoa [email protected] Definición formal de un autómata finito determinista (DFA) Los autómatas con un número finito de estados, que tienen un único estado inicial, y para cada estado una, y solo una transición para cada símbolo, se denominan autómatas finitos deterministas y para poderlo definir se requiere requiere conocer: • • • • • Cuál es el conjunto de estados. Cuál de estos estados es su estado inicial. Cuáles son los estados aceptadores. Cuál es el alfabeto de la palabra que se escribe en la cinta. Una manera de determinar el nuevo estado en función del símbolo leído y del estado actual. Definición formal de un autómata finito determinista (DFA) Definición formal de un autómata finito determinista (DFA) Como ejemplo de esta definición consideraremos el siguiente autómata sobre ∑ = {a,b} Definición formal de un autómata finito determinista (DFA) Ejercicio para la casa: escribir escribir el Algoritmo en lenguaje lenguaje C para este autómata finito, que lea una palabra carácter por carácter indicando si la palabra es aceptada o no Lenguajes regulares y lenguajes reconocidos por los DFA El lenguaje regular y el reconocido por un DFA son expresiones sinónimas, pero es importante tener en cuenta que un lenguaje es regular, si y sólo si, existe un DFA que lo reconozca. Lenguajes regulares y lenguajes reconocidos por los DFA • Muchos lenguajes son reconocidos como regulares, pero para demostrar que un lenguaje es regular basta con exhibir un autómata que lo reconozca reconozca • Pero es preciso asegurarse que el lenguaje reconocido por el autómata es exactamente el que dice que es. Lenguajes regulares y lenguajes reconocidos por los DFA A continuación se presentan algunos ejemplos de lenguajes regulares, sobre ∑={a,b} y su DFA correspondiente. Lenguajes regulares y lenguajes reconocidos por los DFA Ejercicio: Cree el DFA correspondiente a los siguientes lenguajes: Lenguajes regulares y lenguajes reconocidos por los DFA Solución: Ejercicios • Encontrar un DFA que reconozca los siguientes lenguajes definidos en el alfabeto ∑={a,b}: 1. L = {abba} 1 Ejercicios • Encontrar un DFA que reconozca los siguientes lenguajes definidos en el alfabeto ∑={a,b}: 2. L = {abba,ababba} 2 Ejercicios • Encontrar un DFA que reconozca los siguientes lenguajes definidos en el alfabeto ∑={a,b}: 3. L = {a}*={an |n ≥ 0 } = { w | |w|b= 0} 3 Ejercicios • Encontrar un DFA que reconozca los siguientes lenguajes definidos en el alfabeto ∑={a,b}: 4. L = {a}+ 4 Ejercicios • Encontrar un DFA que reconozca los siguientes lenguajes definidos en el alfabeto ∑={a,b}: 5. L = { w | |w| ≥ 3} 5 Ejercicios • Encontrar un DFA que reconozca los siguientes lenguajes definidos en el alfabeto ∑={a,b}: 6. L = { w | |w| < 4} 6 Ejercicios • Encontrar un DFA que reconozca los siguientes lenguajes definidos en el alfabeto ∑={a,b}: 7. L = { w | |w|a= 3} 7 Ejercicios • Encontrar un DFA que reconozca los siguientes lenguajes definidos en el alfabeto ∑={a,b}: 8. L = { w | |w|b= 4n, n ≥ 0 } 8 Ejercicios • Encontrar un DFA que reconozca los siguientes lenguajes definidos en el alfabeto ∑={a,b}: 9. L = { w | |w|b= 4n, n > 0 } 9 Lenguajes No Regulares • No todos los lenguajes son regulares • De hecho estos últimos representan una minoría (infinita) entre todos los lenguajes, es por esto que debemos razonar sobre la existencia de lenguajes que no son regulares • Es decir lenguajes que no pueden ser reconocidos por ningún DFA. • Concretamente nos podemos conseguir con lenguajes que para ser reconocidos necesitarían autómatas con un número infinito de estados, como por ejemplo: Lenguajes No Regulares • Para comprender este problema hay que situarnos en el hecho de que una palabra que sea reconocida como perteneciente a este lenguaje requiere tener la misma cantidad de as y bs. • Por lo tanto es indispensable recordar el número de símbolos a, para verificar el número de símbolos b, pero ¿Cómo puede un autómata finito recordar algo? Lenguajes No Regulares ¿Qué tendría que hacerse para que aceptara la palabra aaaabbbb.? Autómatas finitos Indeterministas ¿Qué es un autómata finito indeterminista (NFA)? Son una forma especial de autómatas finitos que facilitan facilitan la tarea de construcción de los DFA. El mismo se da cuando se cumple algunas de estas tres condiciones: 1. Tiene más de un estado inicial. 2. Tiene transiciones definidas de forma múltiple. 3. Tiene transiciones no definidas. Autómatas finitos Indeterministas Por ejemplo: Y si es una b Aceptación de una palabra en los Autómatas finitos Indeterministas Es similar al de los DFA, pero teniendo en cuenta las siguientes consideraciones: Aceptación de una palabra en los Autómatas finitos Indeterministas Por ejemplo si consideramos la palabra abaabb y el NFA: • Vemos que si ante el primer símbolo se opta hacia el estado b, no habrá transición definida, por el contrario si se opta por quedarse en el estado a, la palabra puede evolucionar hasta su aceptación. • Por esto debemos concluir que la palabra es aceptada por el autómata porque como mínimo, hay una secuencia de transiciones que lo llevan hacia un estado aceptador. Autómatas finitos Indeterministas Ejemplos paradigmáticos. Autómatas finitos Indeterministas Ejemplos paradigmáticos. Autómatas finitos Indeterministas Ejemplos paradigmáticos. Autómatas finitos Indeterministas Ejemplos paradigmáticos. Autómatas finitos Indeterministas: Definición formal Ejercicios • Encontrar un NFA que reconozca los siguientes lenguajes definidos en el alfabeto ∑={a,b}: 1. L = {abba} 1 Ejercicios • Encontrar un NFA que reconozca los siguientes lenguajes definidos en el alfabeto ∑={a,b}: 2. L = {abba,ababba} 2 Ejercicios • Encontrar un NFA que reconozca los siguientes lenguajes definidos en el alfabeto ∑={a,b}: 3. L = { w | Ůx,y Є ∑* (w=xy ˄ Ůz Є ∑2(y=az)) } = ∑*{a}{a,b}2, = es decir las palabras cuyo antepenúltimo símbolo es una a 3 Ejercicios • Encontrar un NFA que reconozca los siguientes lenguajes definidos en el alfabeto ∑={a,b}: 4. Como se podría convertir el NFA del ejercicio 1 en un DFA. 1 4 Diferencias Autómatas finitos Indeterministas y Deterministas 1. El DFA tiene un único estado inicial, mientras que en un NFA puede tener más de uno. 2. En un DFA, la función de transición determina un nuevo estado para cada pareja estado-símbolo, mientras que en un NFA, para cada pareja estado símbolos tenemos un conjunto de estados. Diferencias Autómatas finitos Indeterministas y Deterministas Ejemplo: Coincidencias Autómatas finitos Indeterministas y Deterministas • Los lenguajes reconocidos por los autómatas finitos deterministas son los llamados lenguajes regulares. • Los lenguajes que los autómatas finitos indeterministas pueden reconocer son exactamente los mismos que los deterministas, los lenguajes regulares. • Un hecho importante es que con un proceso especial conocido como determinización, ser puede convertir un NFA en un DFA. Determinización de autómatas no deterministas • Un DFA y un NFA se pueden considerar equivalentes: ▫ Por un lado los DFA pueden considerarse un caso particular de los NFA. ▫ Por otro lado, cualquier NFA puede convertirse en un DFA que acepta el mismo lenguaje mediante un procedimiento algorítmico denominado determinización. • Y aunque son equivalentes por un lado, por otro no son equivalentes en todos los sentidos: ▫ La construcción de NFA es más simple. ▫ El indeterminismo es una cualidad poco deseable. • Por estas razones la mayoría de autómatas se crean indeterministas, se determinizan, y se utiliza su versión determinada. Determinización de autómatas no deterministas • La clave del proceso de determinización es la siguiente: cada estado de un autómata determinista se corresponde con un subconjunto de los estados del autómata indeterminista. Concretamente: ▫ El estado inicial del autómata determinista es el conjunto de los estados iníciales del indeterminista (I). ▫ Los estados aceptadores del determinista son aquellos que contienen algún aceptador del indeterminista. ▫ La función de transición del determinista tiene en consideración todas las transiciones definidas para cada uno de los estados del autómata indeterminista que componen un estado del autómata determinista. Determinización de autómatas no deterministas • Por ejemplo, consideremos el autómata indeterminista y veamos su determinización paso a paso: Determinización de autómatas no deterministas • En primer lugar, el estado inicial del autómata determinista se corresponderá con los estados iníciales del indeterminista {A,D}: Determinización de autómatas no deterministas • La función de transición del estado {A,D} con el símbolo a debe recoger las transiciones tanto del estado A como del estado D con este símbolo. Concretamente, la transición para A con a es hacia el estado B (δ(A,a)={B}) y, para D con a no esta definido (δ(D,a)={ɸ}). Así la transición para {A,D} con a es hacia el estado {B} U {ɸ} = {B}: Determinización de autómatas no deterministas • Para el estado A,D y el símbolo b se procede de la misma forma, δ(A,b)={ɸ} y (δ(D,b)={E}). Así la transición para {A,D} con b hacia el estado {ɸ} U {E} = {E} Determinización de autómatas no deterministas • El mismo proceso que se seguido con el estado {A,D} se debe seguir con los nuevos estados que han aparecido {B} y {E}: ▫ En relación con {B}, tenemos que δ(B,a)={B} y que δ(B,b)={B,C} Determinización de autómatas no deterministas ▫ Del mismo modo, para {E} tenemos que δ(E,a)={E,F} y que δ(E,b)={E} Determinización de autómatas no deterministas • El mismo proceso se repite para los estados {B,C} y {E,F} por lo que tenemos que: ▫ ▫ ▫ ▫ δ(B,a)={B} y δ(C,a)={ɸ}, así la transición para {B,C} con a es hacia {B}. δ(B,b)={B,C} y δ(C,b)={ɸ}, así la transición para {B,C} con b es hacia {B,C}. δ(E,a)={E,F} y δ(F,a)={ɸ}, así la transición para {E,F} con a es hacia {E,F}. δ(E,b)={E} y δ(F,b)={ɸ}, así la transición para {E,F} con b es hacia {E}. Determinización de autómatas no deterministas • Detalles Finales: Como ya no queda ningún nuevo estado por considerar, el autómata resultante es la versión determinista del autómata indeterminista original. • Se debe prestar atención a que {B,C} y {C,F} han sido marcados como estados aceptadores, siendo esto así porque contienen estados aceptadores del autómata indeterminista (C,F). Determinización de autómatas no deterministas Generalmente la determinación no se hace construyendo gráficamente el autómata determinista resultante, lo más habitual es construir la tabla de función de transición del DFA a partir del NFA. Determinización de autómatas no deterministas Por ejemplo, veamos la determinación del autómata que vemos a continuación: que posee la tabla: Determinización de autómatas no deterministas Iniciamos la construcción de la tabla del DFA a partir de lo que será su estado inicial: el estado unión de los estados iníciales del NFA: Y solo ha sido necesario “unir” las filas correspondientes al estado A y al estado D: Determinización de autómatas no deterministas Han aparecido dos nuevos estados {B,E} y {C,F}, por lo que es necesario incorporarlos a la tabla de función de transición del DFA y calcular sus transiciones: Determinización de autómatas no deterministas El estado {A, D, G} resultante de la unión de las transiciones de los estados C y F con el símbolo a, no ha aparecido antes en la tabla, por lo que lo incorporamos y obtenemos: Observemos {A,D,G} es un estado final, porque contiene a G, que es un estado final del NFA. Determinización de autómatas no deterministas El proceso de incorporación de estados nuevos a la tabla y calcular sus transiciones a partir de las transiciones de la tabla del NFA se repite hasta que ya no aparece ninguno nuevo más. Determinización de autómatas no deterministas ¿Cuál es el precio que se debe pagar por la determinización de un autómata indeterminista? ▫ La respuesta es simple, tomando en cuenta que cada estado del determinista es un conjunto de estados del indeterminista. ▫ En otras palabras cada estado del determinista es un subconjunto de estados del indeterminista, si el NFA tiene N estados, el determinista puede llegar a 2N. Por lo que el crecimiento en el número de estados puede ser exponencial, y este es el precio a pagar por eliminar el indeterminismo. Minimización de estados de un DFA • La versión mínima de un DFA es otro DFA que reconoce exactamente el mismo lenguaje que el primero pero lo hace con el menor número de estados posibles. • La idea de la minimización es que existen grupos de DFA que se comporten de la misma manera, y cuando cuando uno de estos sea encontrado se puede reducir a un único estado. • Una característica importante es la unicidad del autómata mínimo que no es otra cosa que: dado un lenguaje regular, el autómata mínimo que lo reconoce es único. Si desea profundizar en el tema debe: Investigar autómata cociente y como sirven para la minimización de estados de un DFA. Repasando: Autómatas finitos • Son un manera matemática para describir clases particulares de algoritmos (o “máquinas”), en nuestro caso específicamente los mismos se utilizan para describir el proceso de reconocimiento de patrones en cadenas de entrada, y de este modo se pueden usar para para construir analizadores léxicos. • Sus principales componentes son: los estados, las transiciones, el estado inicial y los estados de aceptación. • Existen dos tipos principales de autómatas finitos: Los determinísticos (DFA). Los no determinísticos (NFA). Implementación de autómatas finitos en código fuente: • Existen diversas maneras de implementar un DFA o NFA en código, sin embargo todos los métodos no serán útiles para implementar un analizador léxico. • Consideremos nuestro ejemplo de un DFA que acepte identificadores compuestos de una letra seguido por una secuencia de letras o números, en su versión corregida. letra 1 letra [Otro] 2 ID de retorno 3 dígito + Implementación de autómatas finitos en código Primera forma de implementación Es la más sencilla y es la siguiente: {iniciando en el estado 1} If el siguiente carácter es una letra then avanza avanza en la entrada; {Ahora en el estado 2} while el siguiente carácter es una letra o dígito do avanza en la entrada; {permanece en estado 2} end while; {ir al estado 3 sin avanzar en la entrada} aceptar; else {error u otros casos} end if; Comentarios: • Se usa la posición en el el código para mantener el estado implícitamente. • Útil si no hay demasiados estados. • Cada DFA se tiene que implementar de forma diferente. •La complejidad aumenta a medida que se eleva el número de estados. Implementación de autómatas finitos en código Ejercicio Primera forma de implementación Lleve a cabo la implementación del autómata de las constantes numéricas en notación científica mediante el uso de Java . digito 2 digito digito 3 + 1 - digito 4 digito 5 . + 6 - digito 7 digito digito 8 E + E + + Implementación de autómatas finitos en código Segunda forma de implementación Esta forma usa una variable para mantener el estado actual y escribe las transiciones como una sentencia case doblemente anidada dentro de una iteración, donde la primera sentencia case prueba el estado actual y el segundo nivel anidado prueba el carácter de entrada, lo que da el estado. Comentarios: • Refleja el DFA de manera estado := 1; {inicio} directa, directa, las transiciones while while estado = 1 o 2 do case estado of corresponden con la 1: case carácter de entrada of asignación de un nuevo letra: avanza en la entrada; estado a la variable estado estado:=2; y avanza en la entrada, else estado:= … {error u otro estado} excepto en el caso de end case; transiciones que no 2: case carácter de entrada of consumen por ejemplo del letra, dígito: avanza en la entrada; {innecesario realmente} estado:=2; estado 2 al 3. else estado:= 3; •Se puede cambiar el case end case; exterior para que tenga los end case; caracteres de entrada y los end while; internos basados en el If estado=3 then aceptar else error; estado actual. Implementación de autómatas finitos en código Ejercicio Segunda forma de implementación Lleve a cabo la implementación del autómata de las constantes numéricas en notación científica mediante el uso de Java. + 1 - digito 2 digito digito 3 digito 4 digito 5 . + 6 - digito 7 digito digito 8 E + E + + Implementación de autómatas finitos en código Tercera forma de implementación Es posible expresarlo también como una estructura de datos y entonces escribir un código “genérico” que tomara sus acciones de la estructura de datos (ej. Tabla de transición) Caracteres en el alfabeto ∑ (c) Estados s Estados representando transiciones T(s,c) Implementación de autómatas finitos en código Tercera forma de implementación El DFA para identificadores entonces se puede representar como la tabla de transiciones, donde los espacios en blanco representan transiciones que no se muestran en el DFA (a estados de error u otros procesamientos) Carácter de Entrada Estado letra 2 2 digito otro 1 2 3 2 3 Implementación de autómatas finitos en código Tercera forma de implementación Si a la tabla de transiciones, agregamos la información acerca de cuales estados son aceptadores y cuales transiciones no consumen sus entradas en esta misma estructura estructura obtenemos: Carácter de Entrada Estado letra 2 2 digito otro aceptación No 1 2 3 2 [3] No Sí Implementación de autómatas finitos en código Tercera forma de implementación Ahora podemos escribir el código en una forma que implementara cualquier DFA, dadas las entradas y estructuras de datos apropiadas, el siguiente ejemplo supone que las transiciones se mantienen en un arreglo de transición T, indexado por estados y caracteres de entrada, que aquellas que hacen avanzar la entrada (sin [ ]) están dadas por el arreglo booleano avanzar avanzar, indexado también por estados y caracteres de entrada; y que los estados de aceptación están dados por el arreglo booleano Aceptar indexado por estados: Comentarios: •Se denomina algoritmo controlado por tabla. •El tamaño del código se reduce. •Servirá el mismo código para muchos DFA diferentes •En DFA grandes tienden a ser poco eficientes. estado:=1; ch:= siguiente carácter de entrada; while not Aceptar[estado] and not error(estado) do nuevoestado:=T[estado,ch]; if Avanzar[estado,ch] then ch:= siguiente carácter de entrada; estado := nuevoestado; end while; If Aceptar[estado] then aceptar; Expresiones Regulares Todo esto nos ha traído hacia un tipo de expresiones que proporcionan una manera simple, sencilla y precisa de un lenguaje regular y las cuales son conocidas como expresiones regulares. regulares. Tarea Casa: Buscar en internet información relacionada con las expresiones regulares, su funcionamiento, principales usos, etc. Mínimo leer articulo de wikipedia sobre el tema. Proyecto • Debe crear una aplicación en el lenguaje de programación Java, que permita crear un DFA simple en forma gráfica y genere el código en JAVA del DFA creado. • La aplicación debe ser creada en JAVA usando el patrón patrón de diseño de software MVC. • Debe diseñar con UML su aplicación antes de llevarla a cabo (como es correcto y no LUEGO DE HACERLA). • Debe usar el servicio de control de versiones SVN que será habilitado el día de mañana en la universidad. • Prestar atención a las siguientes normas… • Fecha de entrega: 04 de Mayo. PROYECTO: Modelo-Vista-Controlador (MVC) Modelo-Vista-Controlador • Este patrón fue descrito por primera vez por Trygve Reenskaug en 1979, y la implementación original fue realizada en Smalltalk en los laboratorios Xerox. • MVC se basa en la separación de la aplicación en tres capas principales: Modelo, Vista y Controlador. • Se usa (él o alguna de sus variantes) en la gran mayoría de las interfaces de usuario. Modelo-Vista-Controlador • Modelo: es la representación específica del dominio de la información sobre la cual funciona la aplicación. • El modelo es otra forma de llamar a la capa de dominio. • La lógica de dominio añade significado a los datos; por ejemplo, calculando si hoy es el cumpleaños del usuario o los totales, impuestos o portes en un carrito de la compra. Modelo-Vista-Controlador • Vista: Se presenta el modelo en un formato adecuado para interactuar, interactuar, usualmente un elemento de interfaz de usuario. • Controlador: Este responde a eventos, usualmente acciones del usuario e invoca cambios en el modelo y probablemente en la vista. Modelo-Vista-Controlador En general Modelo-Vista-Controlador • Muchas aplicaciones utilizan un mecanismo de almacenamiento persistente (como puede ser una base de datos) para almacenar los datos. MVC no menciona específicamente esta capa de acceso a datos porque supone que está encapsulada por el modelo. • El objetivo primordial del MVC es la reutilización del código ya implementado. • Esta tarea se facilita mucho si a la hora de programar tenemos la precaución de separar el código en varias partes que sean susceptibles de ser reutilizadas sin modificaciones. Modelo-Vista-Controlador Ejemplos • Los datos de una hoja de cálculo pueden mostrarse de en formato tabular, con un gráfico de barras, con uno de sectores. • Los datos son el modelo. • Si cambia el modelo, las vistas deberían actualizarse en consonancia. • El usuario manipula el modelo a través de las vistas. (en realidad, a través de los controladores) Modelo-Vista-Controlador Mas de una Vista de un Modelo de Datos Modelo-Vista-Controlador • MVC es utilizado con mayor frecuencia en las aplicaciones web, donde la Vista es la página HTML, y el Controlador es el código que reúne la data dinámica y genera el contenido de la página. • El Modelo es representado por el contenido actual, que usualmente se encuentra almacenado en una base de datos o en archivos XML. Modelo-Vista-Controlador Modelo-Vista-Controlador Fortalezas • Se presenta la misma información de distintas formas. • Las vistas y comportamiento de una aplicación deben reflejar las manipulaciones de los datos de forma inmediata. • Debería ser fácil cambiar la interfaz de usuario (incluso en tiempo de ejecución). • Permitir diferentes estándares de interfaz de usuario o portarla a otros entornos no debería afectar al código de la aplicación. Modelo-Vista-Controlador • En UML Se propone para el desarrollo del Modelo de Análisis de las aplicaciones, tres tipos de clases fundamentales, con las cuales podemos expresar todas las funciones de cualquier software, con sus respectivas responsabilidades Clase Interfaz <<Interface>>: Recepcionar peticiones al sistema. Mostrar respuestas del sistema. Clase Entidad <<Entity>>: Gestionar datos (información) necesaria necesaria para el sistema. Almacenar datos (información) persistentes del sistema. Provee la funcionalidad principal de la aplicación Clase Controlador <<Controller>>: Procesar Información del sistema. Gestionar visualización de respuesta del sistema. Obtiene los datos del modelo. Modelo-Vista-Controlador Variantes del Modelo. - Variante en la cual no existe ninguna comunicación entre el Modelo y la Vista y esta última recibe los datos a mostrar a través del Controlador. • Variante inicial del Patrón MVC. Modelo-Vista-Controlador • Variante en la cual se desarrolla una comunicación entre el Modelo y la Vista, donde esta última al mostrar los datos los busca directamente en el Modelo, dada una indicación del Controlador, disminuyendo el conjunto de responsabilidades de este último. Variante Intermedia del Patrón MVC. Modelo-Vista-Controlador Muchas interfaces gráficas de usuario, como Swing o MFC, hacen innecesario el uso de un controlador. • Definen su propio flujo de control y manejan los eventos internamente. • Integran, así, la vista y el controlador. • A esta variante se la suele denominar Document-View Modelo-Vista-Controlador Un controlador (controlador.java, por ejemplo) puede gestionar el clic en un botón, de tal forma que recoge datos por medio del Modelo (model.cargar_texto(..)) y los manda a la Vista (el applet) para su actualización (vista.mostrar_texto( )): /**************************************************************** Responde al click en botón "abrir" La respuesta al evento es hacer que se abra en la vista el archivo correspondiente a la referencia seleccionada en el combo box ****************************************************************/ void b_abrir_actionPerformed(ActionEvent e) { … String texto_archivo = model.cargar_texto( indice_ref ); // Obtener texto de archivo /*** Si la carga de archivo es ok, lo muestro. Si no, aviso de error ****/ if (texto_archivo != null) { vista.mostrar_texto(texto_archivo); // Mostrar texto vista.mostrar_aviso("Carga de " + path + " completada."); } else vista.mostrar_aviso("Error en la carga de " + path); } ...
View Full Document

This note was uploaded on 05/13/2010 for the course REDES 7 taught by Professor Asesor during the Spring '10 term at UNE.

Ask a homework question - tutors are online