Tema: Autómatas de Estado Finitos

Anuncio
Compiladores. Guía 2
1
Facultad:
Ingeniería
Escuela:
Computación
Asignatura: Compiladores
Tema: Autómatas de Estado Finitos
Contenido
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.
Objetivos Específicos
Conocer las características básicas de un Autómata
Estado Finito.
Crear algunas secuencias de cadenas evaluadas por
Autómata Finito en Jflap, e implementarlos en C++.
de
un
Material y Equipo
Guía No 2.
Computadora con Dev-C++ y
el simulador Jflap.
Introducción Teórica
Aplicación de los autómatas en los procesadores de lenguaje
Guía 3
La tarea de comprobar si una sentencia pertenece o no a un
determinado
lenguaje se encomienda a los autómatas. En el
Guía 4
campo
de
estudio
de
los
traductores,
compiladores,
procesadores e intérpretes los autómatas se utilizan como
fía
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
2
Compiladores. Guía 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
de un estado y un símbolo del alfabeto obtiene
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
de un estado y un símbolo del alfabeto obtiene
estado.
a partir
un nuevo
a partir
un nuevo
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.
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
1
1
1
2
Cadena que consume
B
A
abab
A
Produce estado
1
1
2
2
Así probamos que la cadena baabbaba es aceptada por el AFND.
4
Compiladores. Guía 2
Procedimiento
Los autómatas finitos se pueden utilizar para reconocer las
Guía 3
expresiones
regulares asociadas a los componentes léxicos en
los lenguajes de programación.
Guía 4
PARTE I.
Jflap)
(Simulación
de
un
autómata
de
estado
finito
en
fía
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
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
realizar, por ejemplo:
la
barra
Para crear estados El circulo
de
menú
la
operación
.
La flecha con punta rellena es para seleccionar
flecha que apunta hacia la derecha
transiciones, tiene que crear las
indicadas en su autómata.
.
, la otra
es para indicar las
que sean necesarias o
Para crear una transición de un estado
ubíquese en el estado y haga un doble clic.
Y la calavera es para eliminar
a
hacia
el
mismo,
6
Compiladores. Guía 2
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:
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:
8
Compiladores. Guía 2
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.
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 '_':
10 Compiladores. Guía 2
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
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
Autómatas de Pila.
Investigar que es un analizador sintáctico.
implementar
12 Compiladores. Guía 2
Guía
2:
Finitos
Autómatas
de
Hoja de cotejo:
Estado
Docente:
Tema: Presentación
del programa
Alumno
:
2
1
Máquina No:
Máquina No:
Máquina No:
GL:
Alumno:
Docente:
GL:
Docente:
GL:
Fecha:
a
EVALUACION
%
CONOCIMIENTO
Del 20
al 30%
APLICACIÓN
DEL
CONOCIMIENTO
Del 40%
al 60%
1-4
5-7
8-10
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
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.
ACTITUD
Del 15%
al 30%
TOTAL
100%
Nota
Descargar