Automatas de Estado Finito

12
1 Compiladores. Guía 2 Tema: Autómatas de Estado Finitos En esta guía se aborda la aplicación de los autómatas en el campo de los procesadores de lenguaje, haciendo énfasis en los Autómatas de Estado Finito. Conocer las características básicas de un Autómata de Estado Finito. Crear algunas secuencias de cadenas evaluadas por un Autómata Finito en Jflap, e implementarlos en C++. Guía No 2. Computadora con Dev-C++ y el simulador Jflap. Aplicación de los autómatas en los procesadores de lenguaje La tarea de comprobar si una sentencia pertenece o no a un determinado lenguaje se encomienda a los autómatas. En el campo de estudio de los traductores, compiladores, procesadores e intérpretes los autómatas se utilizan como reconocedores de lenguajes, que dada una cadena de símbolos indican si dicha cadena pertenece o no al lenguaje. Una cadena pertenece a un lenguaje si el autómata reconocedor de dicho lenguaje lo toma como entrada, y partiendo del estado inicial transita a través de varias configuraciones hasta que alcanza el estado final Autómatas finitos Un autómata finito es un conjunto de nodos y aristas que representan trayectorias para generar una expresión bajo un Introducción Teórica Facultad: Ingeniería Escuela: Computación Asignatura: Compiladores Contenido Objetivos Específicos Material y Equipo

Transcript of Automatas de Estado Finito

Page 1: Automatas de Estado Finito

1 Compiladores. Guía 2

Tema: Autómatas de Estado Finitos

En esta guía se aborda la aplicación de los autómatas en el

campo de los procesadores de lenguaje, haciendo énfasis en

los Autómatas de Estado Finito.

Conocer las características básicas de un Autómata de

Estado Finito.

Crear algunas secuencias de cadenas evaluadas por un

Autómata Finito en Jflap, e implementarlos en C++.

Guía No 2.

Computadora con Dev-C++ y el simulador Jflap.

Aplicación de los autómatas en los procesadores de lenguaje

La tarea de comprobar si una sentencia pertenece o no a un

determinado lenguaje se encomienda a los autómatas. En el

campo de estudio de los traductores, compiladores,

procesadores e intérpretes los autómatas se utilizan como

reconocedores de lenguajes, que dada una cadena de símbolos

indican si dicha cadena pertenece o no al lenguaje.

Una cadena pertenece a un lenguaje si el autómata reconocedor

de dicho lenguaje lo toma como entrada, y partiendo del

estado inicial transita a través de varias configuraciones

hasta que alcanza el estado final

Autómatas finitos

Un autómata finito es un conjunto de nodos y aristas que

representan trayectorias para generar una expresión bajo un

Introducción Teórica

Guía 3

Guía 4

fía

Facultad: Ingeniería

Escuela: Computación

Asignatura: Compiladores

Contenido

Objetivos Específicos

Material y Equipo

Page 2: Automatas de Estado Finito

Compiladores. Guía 2

2

alfabeto. Un diagrama de transición es un autómata finito.

Existen dos tipos autómatas finitos, los cuales son:

Autómatas finitos deterministas (AFD)

Autómatas finitos no deterministas (AFND)

Autómatas finitos deterministas (AFD)

Definición. Una máquina de estados finitos M es un quíntuplo

(K, Σ, δ, s, F), donde:

K es conjuntos de estados.

Σ es el alfabeto de entrada.

δ : K X Σ → K, es la función de transición, que a partir

de un estado y un símbolo del alfabeto obtiene un nuevo

estado.

s ∈ K es el estado inicial. F ⊆ K es un conjunto de estados finales. δ : K X Σ → K, es la función de transición, que a partir

de un estado y un símbolo del alfabeto obtiene un nuevo

estado.

Ejemplo:

Figura 1. Autómata Finito Determinista

Este autómata finito determinista puede ser expresado

formalmente como: M = (K, Σ, δ, q0, F)

K = {q0, q1, q2}

Σ = {a, b}

δ = {((q0, a), q1), ((q0, b), q2), ((q1, a), q1), ((q1,

b), q1), ((q2, a), q0), ((q2, b), q2)}

F = { q1, q2 }

IMPORTANTE: Para que un AFD sea válido, el número de

transiciones que salen de cada estado debe ser igual a la

cantidad de caracteres del alfabeto, puesto que δ es una

función que está definida para todas las entradas posibles.

Page 3: Automatas de Estado Finito

Compiladores. Guía 2

3

Para el AFD anterior, el alfabeto es {a, b} de cada estado

deben salir exactamente dos transiciones, una con a y otra

con b.

Otra condición es que debe tener exactamente un estado

inicial. En cambio, la cantidad de estados finales puede

ser cualquiera, inclusive cero, hasta un máximo de |K| (la

cantidad de estados).

Autómatas finitos no deterministas (AFND)

Una extensión de los AFD’S es la de permitir que de cada

estado o nodo del diagrama de estados salga un número de

flechas mayor o menor que |Σ|. Así se puede permitir que

falte la flecha correspondiente a alguno de los símbolos del

alfabeto, o bien que haya varias flechas que salgan de un

solo nodo con la misma etiqueta. Inclusive se permite que las

transiciones tengan como etiqueta palabras de varias letras o

hasta la palabra vacía.

Definición. Un autómata finito no determinista es un

quíntuplo (K, Σ, Δ, s, F), donde K, Σ, s y F tienen el mismo

significado para el caso de los AFD y Δ, llamada la relación

de transición, es un subconjunto finito K X Σ* X K.

Ejemplo. Verificar si la palabra baabbaba es aceptada por el

autómata finito no determinista siguiente:

Figura 2. Autómata Finito No Determinista

Solución. La palabra baabbaba puede ser dividida en cuatro

pedazos: p1 = b, p2 = a, p3 = abbab y p4 = a, cuya

concatenación produce la palabra original. Ahora bien,

podemos seguir la siguiente secuencia de estados

(trayectoria) en el AFND dado:

Estado Cadena que consume Produce estado

1 B 1

1 A 1

1 abab 2

2 A 2

Así probamos que la cadena baabbaba es aceptada por el AFND.

Page 4: Automatas de Estado Finito

Compiladores. Guía 2

4

Los autómatas finitos se pueden utilizar para reconocer las

expresiones regulares asociadas a los componentes léxicos en

los lenguajes de programación.

PARTE I. (Simulación de un autómata de estado finito en

Jflap)

Se desea construir una gramática que describe el lenguaje

formado por los identificadores de un lenguaje de

programación.

Los identificadores de este lenguaje pueden estar formados

por las tres primeras letras minúsculas (a,b,c) y el guion

bajo(_). Sin embargo, un identificador no puede comenzar por

un guion bajo(_).

Crearemos un autómata para validar los identificadores de

este lenguaje

Ingrese al Jflap (su instructor le indicará la ubicación para

acceder a este aplicativo). Una vez cargada la aplicación se

le mostrará la siguiente ventana:

Figura 3. Pantalla de inicio de Jflap

Procedimiento

Guía 3

Guía 4

fía

Page 5: Automatas de Estado Finito

Compiladores. Guía 2

5

Presione el botón Finite Automaton y se deberá cargar la

siguiente ventana:

Figura 4. Ventana de edición de un AF en Jflap

Cree el diagrama de la figura 5 en base a la siguiente ayuda:

Primero seleccione de la barra de menú la operación a

realizar, por ejemplo:

Para crear estados El circulo .

La flecha con punta rellena es para seleccionar , la otra

flecha que apunta hacia la derecha es para indicar las

transiciones, tiene que crear las que sean necesarias o

indicadas en su autómata.

Para crear una transición de un estado hacia el mismo,

ubíquese en el estado y haga un doble clic.

Y la calavera es para eliminar .

Page 6: Automatas de Estado Finito

Compiladores. Guía 2

6

Figura 5. Creación del AF, parte 1/3

Luego de haber agregado los estados, es el momento de indicar

cuál es el estado inicial y final, para ello debe estar en

modo selección, luego clic derecho del mouse sobre el estado

y observará el siguiente submenú:

Figura 6. Creación del AF, parte 1/2

Defina el estado q0 como estado inicial y q1 como estado de

aceptación. El diagrama debe verse más o menos de la

siguiente forma:

Page 7: Automatas de Estado Finito

Compiladores. Guía 2

7

Figura 7. Creación del AF, parte 3/3

Para probar el autómata, seleccione Step by State del menú

Input para evaluar carácter por carácter de la cadena

digitada.

Figura 8. Evaluación de una cadena por el AF, parte 1/3

Digite la cadena:

Page 8: Automatas de Estado Finito

Compiladores. Guía 2

8

Figura 9. Evaluación de una cadena por el AF, parte 2/3

Presione Aceptar para analizar la cadena de estado a estado

(carácter por carácter).

El resultado es la siguiente ventana, donde debe dar clic

sobre el botón Step para ir observando paso a paso la

ejecución del autómata.

Figura 9. Evaluación de una cadena por el AF, parte 3/3

Evalué las siguientes cadenas en el autómata creado y marque

con una X las que son aceptadas por este:

abc

abC

aba_a

_abc

abcd PARTE II. (Simulación de un autómata de estado finito en C++)

Crearemos un pequeño programa en C++ que simule en autómata

de pila creado en la parte I.

Page 9: Automatas de Estado Finito

Compiladores. Guía 2

9

Una forma sencilla de implementar autómatas de estado finito

es mediante bucles anidados.

Usamos una variable para almacenar el estado actual y una

estructura de selección múltiple doblemente anidada. La

primera estructura de selección comprueba el estado actual y

el siguiente el carácter en la entrada. Las transiciones se

corresponden con asociar un nuevo estado a la variable y

avanzar en la entrada.

Digite y compile el siguiente código fuente en C++

#include <iostream>

#include <string>

using namespace std;

bool simular_af(char *c)

{

int pos = 0; //posicion del caracter a evaluar en la cadena

int state = 0; //estado del automata

int longitud = strlen(c);

while( (state == 0 || state == 1) && pos < longitud)

{

switch(state)

{

case 0://estado 0

switch(c[pos])

{

case 'a':

state = 1;

break;

case 'b':

state = 1;

break;

case 'c':

state = 1;

break;

default:

return false;

};

break;

case 1://estado 1

switch(c[pos])

{

case 'a':

state = 1;

break;

case 'b':

state = 1;

break;

case 'c':

state = 1;

break;

case '_':

Page 10: Automatas de Estado Finito

Compiladores. Guía 2

10

state = 1;

break;

default:

return false;

};

break;

default:

return false; //error, el estado solo puede ser 0||1

};

pos++;

};

if(state == 1)//estado de aceptacion

return true;

else

return false;

}

int main(){

char cadena[80];

cout<<"Ingrese la cadena a analizar: ";

cin.getline(cadena,80);

if(!simular_af(cadena))

cout<<"Error: Identificador no valido"<<endl;

else

cout<<"La cadena '"<<cadena<<"' es un identificador valido"<<endl;

system("pause");

return 0;

}

El código que se genera es largo y difícil de mantener en el

caso de que se introduzcan nuevos caracteres en el alfabeto

de entrada o nuevos estados.

Evalué las siguientes cadenas en el autómata creado y marque

con una X las que son aceptadas por este:

abc

abC

aba_a

_abc

abcd

Page 11: Automatas de Estado Finito

Compiladores. Guía 2

11

Análisis de resultados

Ejercicio 1

Se desea construir una gramática que describe el lenguaje

formado por los identificadores de MICRO C. (Puede consultar

la guía anterior)

Cree el autómata para validar los identificadores de este

lenguaje.

Se pide

a) Simulación del autómata de estado correspondiente en

JFlap

b) Simular el autómata en un pequeño programa en C/C++.

Investigación complementaria

Parte A - Ejercicio 2

Crear un autómata finito para validar el tipo de dato float

de un lenguaje de programación, considerando los siguientes

aspectos:

El alfabeto de entrada de este autómata deberá estar

formado por los números dígitos (0-9), el signo menos (-)

y el punto (.)

Las cantidades pueden ser positivas o negativas.

Las cantidades pueden ser o no ser enteras.

Se pide:

a) Simulación del autómata de estado correspondiente en

Jflap

b) Simular el autómata en un pequeño programa en C/C++.

Parte B

Investigar con el tutorial de Jflap como implementar

Autómatas de Pila.

Investigar que es un analizador sintáctico.

Page 12: Automatas de Estado Finito

Compiladores. Guía 2

12

EVALUACION

% 1-4 5-7 8-10 Nota

CONOCIMIENTO

Del 20

al 30%

Conocimiento

deficiente

de los

fundamentos

teóricos

Conocimiento

y explicación

incompleta de

los

fundamentos

teóricos

Conocimiento

completo y

explicación

clara de los

fundamentos

teóricos

APLICACIÓN

DEL

CONOCIMIENTO

Del 40%

al 60%

ACTITUD

Del 15%

al 30%

No tiene

actitud

proactiva.

Actitud

propositiva y

con

propuestas no

aplicables al

contenido de

la guía.

Tiene

actitud

proactiva y

sus

propuestas

son

concretas.

TOTAL 100%

Máquina No:

Máquina No:

Alumno:

Alumno: Docente:

Docente:

GL:

GL:

Fecha:

Guía 2: Autómatas de Estado

Finitos

Tema: Presentación del programa

Hoja de cotejo:

Docente:

Máquina No:

GL:

a

2 1