Documentos de Académico
Documentos de Profesional
Documentos de Cultura
-- Introducción --
Índice
1 Definición formal
2 Representación gráfica
2.1 AF como Grafo
2.2 Función de transición
3 Comportamiento
4 Tipos de AFs
4.1 AF Determinístico (AFD)
4.1 AF No Determinístico (AFN)
5 Programa Java de un AFD
6 Bibliografía
Representación gráfica
AF como Grafo
Un AF es un grafo finito que empieza en un estado inicial y tiene una serie de transiciones de
estado en estado definidas por la función de transición, hasta que llega a uno o más estados
de aceptación. Es de anotar, que un estado de aceptación de un AF no es necesariamente
absorbente, es decir que puede salir de este tipo de estado con transiciones si así lo permite su
función de transición.
id letra(letra|dígito)*
Función de transición δ AF
Símbolo de
entrada Є ∑
Estado
letra digito
0 1 error
1 2 3
2 2 3
3 2 3
Todos los estados del autómata que se representan en la columna "Estado", son únicos
y se grafican en el AF.
Todas las transiciones se efectúan con un único símbolo que debe pertenecer a ∑. En
el AF los símbolos se muestran identificados en cada arco.
La función δ: Q x ∑ Q indica las transiciones (estado, símbolo) estado válidas en
el AF. Obsérvese que la transición (0, letra) 1 es una transición válida, la cual se
indica en la función de transición y en el AF. Por el contrario, la transición (0, digito) no
se encuentra definida, y se identifica en la función de transición con "error" y no se
muestra en al AF.
La función δ define al AF.
Comportamiento
Estado Símbolo de
#Itera actual Transición Acepta
Entrada
1 0 c 1 si
2 1 u 2 si
3 2 e 2 si
4 2 n 2 si
5 2 t 2 si
6 2 a 2 si
7 2 1 3 si
La 5-tupla (Q, Σ, q0, δ, F) para este AF id es: id = ({0, 1, 2, 3}, {letra, digito}, 0, δ, {1, 2, 3})
donde δ:
Símbolo de
entrada
Estado
letra digito
0 1 --
1 2 3
2 2 3
3 2 3
Ejemplo 2. Plantear un AF que reconozca las cadenas generadas por la definición regular
id letra(letra|dígito)*
Función de transición δ
Símbolo de
Estado entrada Є ∑
letra digito
0 1 error
1 1 1
Símbolo de
#Itera Estado Entrada Transición Acepta
1 0 c 1 si
2 1 u 1 si
3 1 e 1 si
4 1 n 1 si
5 1 t 1 si
6 1 a 1 si
7 1 1 1 si
La 5-tupla (Q, Σ, q0, δ, F) para este AF id es: id = ({0, 1}, {letra, digito}, 0, δ, {1})
donde δ:
Símbolo de
Estado entrada
letra digito
0 1 error
1 1 1
A pesar de que los dos autómatas analizados tienen estructuras diferentes, son equivalentes
debido a que reconocen el mismo lenguaje.
Tipos de AFs
Los AFs pueden ser determinísticos (AFD) o no determinísticos (AFN), donde el término "no
determinístico" significa que en un estado se pude dar el caso de tener más de una transición
para el mismo símbolo de entrada1 además de poder presentar transiciones con Є. Un AFD por
su parte, pude dar reconocedores más rápidos y directos que su versión de AFN, aunque el
primero puede ser mucho mayor. Esta diferencia se indica en la función de transición δ, la cual
como para un AFD es δ: Q x ∑ Q donde el rango Q toma un solo estado. Por su parte, δ
para un AFN es δ: Q x ( ∑ U Є ) Q donde el rango Q puede tomar más de un estado, es
decir un subconjunto de Q. En este contexto se considera que un AFD es un caso especial de
AFN.
Como ya se anotó anteriormente, el lenguaje a reconocer por parte de un AF puede ser
generado por medio de una expresión o definición regular. En este sentido, realmente la
creación de un AF a partir de una expresión o definición regular da como resultado un AFN.
Luego, por facilidad de programación y por razones de velocidad de computo, un AFN se debe
convertir por su equivalente AFD el cual se programa en un lenguaje. Es de anotar, que el AF
que se ha relacionado anteriormente como ejemplo es realmente un AFD.
id letra(letra|digito)* Símbolo de
entrada Є ∑
Estado
letra digito
0 1 --
1 1 1
String lexema;
int estado;
boolean estadoAcepta;
int estadoError;
int inicioCadena;
int posLectura[ ];
boolean valido;
int inicioCadena=1;
valido = automataID();
System.out.println("Cadena: "+lexema);
valido=automataOperaMate();
if (valido){
for(int k=inicioCadena-1;k<posLectura[0];k++)
System.out.print(lexema.charAt(k));
System.out.println(" es ID ");
System.out.print(lexema.charAt(posLectura[0])+" es OPMAT");
}
else
System.out.println("error lexico en " +lexema.charAt(posLectura[0]));
}
}
boolean automataID(){
char caracter;
caracter=lexema.charAt(i);
if(Character.isLetter(caracter) && estado==0){
estado=1;
estadoAcepta=true;
}
else
if(Character.isLetterOrDigit(caracter) && estado==1){
estado=1;
estadoAcepta=true;
}
else{
estadoAcepta=false;
posLectura[0]=i;
break;
}
}
return estadoAcepta;
}
boolean automataOperaMate(){
[1] Aho, a. V., Sethi, R., & Ullman, J. D. (2008). Compiladores: principios, técnicas y
herramientas. Pearson Educación.
[2] Hopcrof J., Motwani R. & Ullman J. (2007). Teoría de autómatas, lenguajes y computación.
Ed. Pearson Addison Wesley.
[3] Louden, K. C. (2005). Construcción de compiladores. Principios y prácticas.