Analizador que permita leer carácter, carácter o dígito, punto y coma
Es un analizador que solo pueda pasar del estado 0 al estado 1 con un cacacter (a,... Z), en el estado 1 hay un bucle donde puede leer carácter, dígito(0,.. 9) y que pase al estado 2 con un punto y coma (;). Hice este código pero cuando pongo que me valide una palabra sin punto y coma al final igual sale true y no debería, ¿cómo podría corregir eso?
package dtejemplo;
public class DTEjemplo {
public static boolean esCaracter(char c)
{
switch(c){
case 'a':
case 'A':
case 'b':
case 'B':
case 'c':
case 'd':
case 'D':
case 'e':
case 'E':
case 'f':
case 'F':
case 'g':
case 'G':
case 'h':
case 'H':
case 'i':
case 'I':
case 'j':
case 'J':
case 'que':
case 'QUE':
case 'l':
case 'L':
case 'm':
case 'M':
case 'n':
case 'N':
case 'ñ':
case 'Ñ':
case 'o':
case 'O':
case 'p':
case 'P':
case 'que':
case 'QUE':
case 'r':
case 'R':
case 'es':
case 'S':
case 't':
case 'T':
case 'u':
case 'U':
case 'v':
case 'V':
case 'w':
case 'W':
case 'x':
case 'X':
case 'y':
case 'Y':
case 'z':
case 'Z':
return true;
default:
return false;
}
}
public static boolean esDigito(char c)
{
switch(c){
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
return true;
default:
return false;
}
}
public static boolean validar(String str) {
//boolean admitio=false;
int estado = 0;
for (int i = 0; i < str.length() ; i++)
{ char c = str.charAt(i);
switch (estado) {
case 0:
if (esCaracter(c) )
estado = 1;
else
return false;
break;
case 1:
if (esCaracter(c))
estado = 1;
else if (esDigito(c))
estado = 1;
else if (c == ';')
estado = 2;
else
return false;
break;
default:
return false;
}
}
return true;
}
public static void main(String[] args) {
System.out.println(DTEjemplo.validar("abgz1")); //me permite sin punto y coma!!
}
}