import java.util.Scanner;
class AnalizadorLexico {
Estados estadoActual;
private enum Estados {
q00, q01, q02, q03, q04, q05, q06, q07, q08, q09, q10,
q11, q12, q13, q14, q15, q16, q17, q18, q19, q20, q21, q22
}
private boolean palabraReservada(String token) {
int i;
String reservadas[] = {"abstract","assert","boolean","break","byte","case","catch","char","class","const",
"continue","default","do","double","else","enum","extends","final","finally","float","for","goto","if",
"implements","import","instanceof","int","interface","long","native","new","package","private","protected",
"public","return","short","static","super","switch","new","package","private","protected","synchronized","this",
"throw","throws","transient","try","void","volatile","while"};
for(i = 0;i < reservadas.length;i++) {
if(reservadas[i].equals(token))
return true;
}
return false;
}
private boolean esIdentificador(String token) {
int estadoSiguiente;
char arregloToken[] = token.toCharArray();
estadoActual = Estados.q00;
for(int i = 0;i < arregloToken.length;i++){
if(esLetra(arregloToken[i]))
estadoSiguiente = 0;
else if(esDigito(arregloToken[i]))
estadoSiguiente = 1;
else
estadoSiguiente = 2;
estadoActual = matrizTransicion(estadoActual,estadoSiguiente);
}
if(estadoActual.equals(Estados.q01))
return true;
else
return false;
}
private boolean esDecimalEntero(String token){
int estadoSiguiente;
char arregloToken[] = token.toCharArray();
estadoActual = Estados.q00;
for(int i = 0;i < arregloToken.length;i++){
if(esDigito(arregloToken[i]))
estadoSiguiente = 0;
else
estadoSiguiente = 1;
estadoActual = matrizTransicion2(estadoActual,estadoSiguiente);
}
if(estadoActual.equals(Estados.q01))
return true;
else
return false;
}
private boolean esDecimalReal(String token){
int estadoSiguiente;
char arregloToken[] = token.toCharArray();
estadoActual = Estados.q00;
for(int i = 0;i < arregloToken.length;i++){
if(esDigito(arregloToken[i]))
estadoSiguiente = 0;
else if(arregloToken[i] == '.')
estadoSiguiente = 1;
else
estadoSiguiente = 2;
estadoActual = matrizTransicion3(estadoActual,estadoSiguiente);
}
if(estadoActual.equals(Estados.q03))
return true;
else
return false;
}
public Estados matrizTransicion(Estados estadoActual,int estadoSiguiente){
int estado;
Estados posicion,matriz[][] = {{Estados.q01,Estados.q02,Estados.q02},
{Estados.q01,Estados.q01,Estados.q02},
{Estados.q02,Estados.q02,Estados.q02}};
estado = estadoActual.ordinal();
posicion = matriz[estado][estadoSiguiente];
return posicion;
}
public Estados matrizTransicion2(Estados estadoActual,int estadoSiguiente){
int estado;
Estados posicion,matriz[][] = {{Estados.q01,Estados.q02},
{Estados.q01,Estados.q02},
{Estados.q02,Estados.q02}};
estado = estadoActual.ordinal();
posicion = matriz[estado][estadoSiguiente];
return posicion;
}
public Estados matrizTransicion3(Estados estadoActual,int estadoSiguiente){
int estado;
Estados posicion,matriz[][] = {{Estados.q01,Estados.q05,Estados.q04},
{Estados.q01,Estados.q02,Estados.q04},
{Estados.q03,Estados.q04,Estados.q04},
{Estados.q03,Estados.q04,Estados.q04},
{Estados.q04,Estados.q04,Estados.q04},
{Estados.q03,Estados.q04,Estados.q04}};
estado = estadoActual.ordinal();
posicion = matriz[estado][estadoSiguiente];
return posicion;
}
public boolean esLetra(char caracter) {
if((caracter >= 'A' && caracter <= 'Z')||(caracter >= 'a' && caracter <= 'z'))
return true;
else
return false;
}
public boolean esDigito(char caracter) {
if((caracter >= '0' && caracter <= '9'))
return true;
else
return false;
}
public void AutomataFinitoDeterminista(String token) {
if(palabraReservada(token))
System.out.println("El token " + token + " es una palabra reservada");
else if(esDecimalEntero(token))
System.out.println("El token " + token + " es un numero decimal entero");
else if(esIdentificador(token))
System.out.println("El token " + token + " es un identificador");
else if(esDecimalReal(token))
System.out.println("El token " + token + " es un numero decimal real");
}
}
public class AutomataFinito {
public static void main(String[] args) {
String token;
char otroToken;
AnalizadorLexico analizador = new AnalizadorLexico();
Scanner teclado = new Scanner(System.in);
do
{
System.out.print("Dame el token: ");
token = teclado.nextLine();
analizador.AutomataFinitoDeterminista(token);
System.out.print("Desea ingresar otro token?(S/N) ");
otroToken = teclado.nextLine().charAt(0);
}while(otroToken == 'S' || otroToken == 's');
teclado.close();
}
}