public void analizarSilaba(Char silaba, Boolean EOF)
{
switch (estado)
{
case 0:
if (aceptaTodo)
{
if (perteneceATodo(silaba))
{
estado = 6;
valorLexema = valorLexema + silaba;
}
else if (silaba.CompareTo('\'') == 0)
{
//Tener cuidado con esto, otra posiblidad es aceptarlo de un solo.
estado = 5;
}
else
{
rutinaError("No puedes empezar una etiqueta, porque hay una cadena abierta.");
}
}
else if (silaba.CompareTo('{') == 0)
{
estado = 1;
valorLexema += silaba;
}
else if (silaba.CompareTo('}') == 0)
{
estado = 2;
valorLexema += silaba;
}
else if (Char.IsLetter(silaba))
{
estado = 3;
valorLexema += silaba;
}
else if (silaba.CompareTo(',') == 0)
{
estado = 4;
valorLexema += silaba;
}
else if (silaba.CompareTo('\'') == 0)
{
estado = 5;
valorLexema += silaba;
}
else if (silaba.CompareTo('+') == 0 || silaba.CompareTo('-') == 0)
{
estado = 7;
valorLexema += silaba;
}
else if (Char.IsDigit(silaba))
{
estado = 8;
valorLexema += silaba;
}
else if (esSeparador(silaba))
{
estado = 0;
}
else
{
valorLexema = "" +silaba;
rutinaError("El símbolo no comienza ninguna ER");
lector.avanzar();
}
break;
case 1:
lector.retroceder();
rutinaAceptación(tokenLlaveAbierta);
break;
case 2:
lector.retroceder();
rutinaAceptación(tokenLlaveCerrada);
if (stringAbierto > 0)
aceptaTodo = true;
break;
case 3:
if (Char.IsLetter(silaba))
{
estado = 3;
valorLexema += silaba;
}
else if (char.IsDigit(silaba))
{
estado = 3;
valorLexema += silaba;
}
else
{
lector.retroceder();
int tokenRTmp = esReservada(valorLexema);
if (tokenRTmp != 300)
{
rutinaAceptación(tokenRTmp);
}
else
{
rutinaAceptación(tokenVariable);
}
}
break;
case 4:
lector.retroceder();
rutinaAceptación(tokenComa);
break;
case 5:
if (perteneceATodo(silaba))
{
estado = 9;
valorLexema += silaba;
}
else if (silaba.CompareTo('\'') == 0)
{
estado = 10;
}
else
{
rutinaError("Debes escribir algo antes de iniciar otra ER");
}
break;
case 6:
if (perteneceATodo(silaba))
{
estado = 6;
valorLexema += silaba;
}
else if (silaba.CompareTo('\'') == 0)
{
estado = 11;
valorLexema += silaba;
}
else
{
aceptaTodo = false;
lector.retroceder();
rutinaAceptación(tokenString);
}
break;
case 7:
if (Char.IsDigit(silaba))
{
estado = 8;
valorLexema += silaba;
}
else
{
rutinaError("Esperaba un dígito pero vino:" + silaba);
}
break;
case 8:
if (Char.IsDigit(silaba))
{
estado = 8;
valorLexema += silaba;
}
else if (silaba.CompareTo('.') == 0)
{
estado = 12;
valorLexema += silaba;
}
else
{
lector.retroceder();
rutinaAceptación(tokenEntero);
}
break;
case 9:
if (EOF)
{
lector.retroceder();
rutinaAceptación(tokenString);
}
else if (perteneceATodo(silaba))
{
estado = 9;
valorLexema += silaba;
}
else if (silaba.CompareTo('\'') == 0)
{
estado = 10;
valorLexema += silaba;
}
else
{
lector.retroceder();
rutinaAceptación(tokenString);
stringAbierto++;
}
break;
case 10:
lector.retroceder();
int tokenCTmp = esColor(valorLexema);
int tokenPTmp = esPosicion(valorLexema);
if (tokenCTmp != 600)
{
rutinaAceptación(tokenCTmp);
}
else if (tokenPTmp != 900)
{
rutinaAceptación(tokenPTmp);
}
else
{
rutinaAceptación(tokenString);
}
break;
case 11:
lector.retroceder();
rutinaAceptación(tokenString);
aceptaTodo = false;
stringAbierto--;
break;
case 12:
if (Char.IsDigit(silaba))
{
estado = 13;
valorLexema += silaba;
}
else
{
rutinaError("Esperaba un dígito pero vino: " + silaba);
}
break;
case 13:
if (Char.IsDigit(silaba))
{
estado = 13;
valorLexema += silaba;
}
else
{
lector.retroceder();
rutinaAceptación(tokenReal);
}
break;
}
}