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; } }
private Boolean perteneceATodo(Char silaba) { Boolean respuesta = true; if (silaba.CompareTo('\'') == 0 || silaba.CompareTo('{') == 0) respuesta = false; return respuesta; }