public ComponenteLexico DevolverComponente() { ComponenteLexico componente = null; int estadoActual = 0; int nroBS = 0; bool continuarAnalisis = true; string lexema = ""; while (continuarAnalisis) { if (estadoActual == 0) { LeerSiguienteCaracter(); while (" ".Equals(caracterActual)) { LeerSiguienteCaracter(); } if (Char.IsLetter(caracterActual.ToCharArray()[0])) { estadoActual = 4; lexema += caracterActual; } else if (Char.IsDigit(caracterActual.ToCharArray()[0])) { estadoActual = 1; lexema += caracterActual; } else if ("+".Equals(caracterActual)) { estadoActual = 5; lexema += caracterActual; } else if ("-".Equals(caracterActual)) { estadoActual = 8; lexema += caracterActual; } else if ("*".Equals(caracterActual)) { estadoActual = 7; lexema += caracterActual; } else if ("/".Equals(caracterActual)) { estadoActual = 6; lexema += caracterActual; } else if ("%".Equals(caracterActual)) { estadoActual = 9; lexema += caracterActual; } else if ("(".Equals(caracterActual)) { estadoActual = 10; lexema += caracterActual; } else if (")".Equals(caracterActual)) { estadoActual = 11; lexema += caracterActual; } else if ("#".Equals(caracterActual)) { estadoActual = 22; lexema += caracterActual; } else if ("@EOF@".Equals(caracterActual)) { estadoActual = 12; lexema += caracterActual; } else if ("=".Equals(caracterActual)) { estadoActual = 19; lexema += caracterActual; } else if ("<".Equals(caracterActual)) { estadoActual = 20; lexema += caracterActual; } else if (">".Equals(caracterActual)) { estadoActual = 21; lexema += caracterActual; } else if ("'".Equals(caracterActual)) { estadoActual = 23; lexema += caracterActual; Console.WriteLine("Entro ad estaod comillads"); } else if ("@FL@".Equals(caracterActual)) { estadoActual = 13; } else { estadoActual = 18; } } else if (estadoActual == 1) { LeerSiguienteCaracter(); if (Char.IsDigit(caracterActual.ToCharArray()[0])) { estadoActual = 1; lexema += caracterActual; } else if (".".Equals(caracterActual)) { estadoActual = 2; lexema += caracterActual; } else { estadoActual = 14; } } else if (estadoActual == 2) { LeerSiguienteCaracter(); if (Char.IsDigit(caracterActual.ToCharArray()[0])) { estadoActual = 3; lexema += caracterActual; } else { estadoActual = 17; lexema += caracterActual; } } else if (estadoActual == 3) { LeerSiguienteCaracter(); if (Char.IsDigit(caracterActual.ToCharArray()[0])) { estadoActual = 3; } else { estadoActual = 15; } } else if (estadoActual == 4) { LeerSiguienteCaracter(); if (Char.IsLetter(caracterActual.ToCharArray()[0])) { estadoActual = 4; lexema += caracterActual; } else { estadoActual = 16; } } else if (estadoActual == 5) { continuarAnalisis = false; componente = ComponenteLexico.CrearComponenteLexico(lexema, "SUMA", lineaActual.Numero, puntero, puntero); } else if (estadoActual == 6) { continuarAnalisis = false; componente = ComponenteLexico.CrearComponenteLexico(lexema, "DIVISION", lineaActual.Numero, puntero, puntero); } else if (estadoActual == 7) { continuarAnalisis = false; componente = ComponenteLexico.CrearComponenteLexico(lexema, "MULTIPLICACION", lineaActual.Numero, puntero, puntero); } else if (estadoActual == 8) { LeerSiguienteCaracter(); if ("-".Equals(caracterActual)) { estadoActual = 36; lexema += caracterActual; } else { estadoActual = 33; } } else if (estadoActual == 9) { continuarAnalisis = false; componente = ComponenteLexico.CrearComponenteLexico(lexema, "MODULO", lineaActual.Numero, puntero, puntero); } else if (estadoActual == 10) { continuarAnalisis = false; componente = ComponenteLexico.CrearComponenteLexico(lexema, "PARENTESIS ABRE", lineaActual.Numero, puntero, puntero); } else if (estadoActual == 11) { continuarAnalisis = false; componente = ComponenteLexico.CrearComponenteLexico(lexema, "PARENTESIS CIERRA", lineaActual.Numero, puntero, puntero); } else if (estadoActual == 12) { continuarAnalisis = false; componente = ComponenteLexico.CrearComponenteLexico(lexema, "@EOF@", lineaActual.Numero, puntero, puntero); } else if (estadoActual == 13) { CargarNuevaLinea(); estadoActual = 0; } else if (estadoActual == 14) { continuarAnalisis = false; DevolverPuntero(); componente = ComponenteLexico.CrearLiteral(lexema, "ENTERO", lineaActual.Numero, puntero - lexema.Length + 1, puntero); } else if (estadoActual == 15) { continuarAnalisis = false; DevolverPuntero(); componente = ComponenteLexico.CrearLiteral(lexema, "DECIMAL", lineaActual.Numero, puntero - lexema.Length + 1, puntero); } else if (estadoActual == 16) { continuarAnalisis = false; DevolverPuntero(); componente = ComponenteLexico.CrearComponenteLexico(lexema, "IDENTIFICADOR", lineaActual.Numero, puntero - lexema.Length + 1, puntero); } else if (estadoActual == 17) { DevolverPuntero(); continuarAnalisis = false; ManejadorErrores.ObtenerManejadorErrores().Agregar(Error.CrearErrorLexico(lexema, "Se esperaba un número y se recibió: " + caracterActual, "Numero decimal no valido", "Asegurese de que el número decimal sea válido", lineaActual.Numero, puntero - lexema.Length, puntero )); componente = ComponenteLexico.CrearDummy(lexema, "DECIMAL", lineaActual.Numero, puntero - lexema.Length + 1, puntero); } else if (estadoActual == 18) { ManejadorErrores.ObtenerManejadorErrores().Agregar(Error.CrearErrorLexico(caracterActual, "Caracter no aceptado por el lenguaje: " + caracterActual, "No es posible continuar con el analisis por caracter no valido", "Asegurese de utilizar caracteres aceptados por el lenguaje", lineaActual.Numero, puntero - lexema.Length, puntero )); throw new Exception("Se ha presentado un error tipo Stopper que no permite continuar con el análisis, verifique la consola de errores"); } else if (estadoActual == 19) { continuarAnalisis = false; componente = ComponenteLexico.CrearComponenteLexico(lexema, "ASIGNACION", lineaActual.Numero, puntero, puntero); } else if (estadoActual == 20) { continuarAnalisis = false; componente = ComponenteLexico.CrearComponenteLexico(lexema, "LECTURA", lineaActual.Numero, puntero - lexema.Length, puntero); } else if (estadoActual == 21) { continuarAnalisis = false; componente = ComponenteLexico.CrearComponenteLexico(lexema, "ESCRITURA", lineaActual.Numero, puntero - lexema.Length, puntero); } else if (estadoActual == 22) { continuarAnalisis = false; componente = ComponenteLexico.CrearComponenteLexico(lexema, "CONCATENACION", lineaActual.Numero, puntero, puntero); } else if (estadoActual == 23) { LeerSiguienteCaracter(); if ("\\".Equals(caracterActual)) { estadoActual = 24; Console.WriteLine("Leido un BS"); nroBS += 1; } else if ("'".Equals(caracterActual)) { estadoActual = 25; lexema += caracterActual; } else if ("@FL@".Equals(caracterActual)) { estadoActual = 26; //lexema += caracterActual; } else { estadoActual = 23; lexema += caracterActual; } } else if (estadoActual == 24) { LeerSiguienteCaracter(); if ("@FL@".Equals(caracterActual)) { estadoActual = 26; } else { estadoActual = 23; lexema += caracterActual; } } else if (estadoActual == 25) { continuarAnalisis = false; //DevolverPuntero(); componente = ComponenteLexico.CrearLiteral(lexema, "CADENA", lineaActual.Numero, puntero - lexema.Length, puntero); } else if (estadoActual == 26) { continuarAnalisis = false; ManejadorErrores.ObtenerManejadorErrores().Agregar(Error.CrearErrorLexico(lexema, "Se esperaba una comilla ['] y se recibió: " + caracterActual, "Cadena no valida", "Asegurese de que la estructura de cerrar la cadena con un ['].", lineaActual.Numero, puntero - lexema.Length - nroBS, puntero )); componente = ComponenteLexico.CrearDummy(lexema, "CADENA_INVALIDA", lineaActual.Numero, puntero - lexema.Length - nroBS, puntero); } else if (estadoActual == 33) { continuarAnalisis = false; DevolverPuntero(); componente = ComponenteLexico.CrearComponenteLexico(lexema, "RESTA", lineaActual.Numero, puntero - lexema.Length, puntero); } else if (estadoActual == 36) { LeerSiguienteCaracter(); if ("@FL@".Equals(caracterActual)) { estadoActual = 13; lexema = ""; } else { estadoActual = 36; lexema += caracterActual; } } } if (caracterActual != "@EOF@") { TablaMaestra.ObtenerTablaMaestra().Sincronizar(componente); } return(componente); }