public ComponenteLexico devolverComponenteLexico()
        {
            int              estadoActual      = 0;
            string           lexema            = "";
            string           lexemareserva     = "";
            bool             continuarAnalisis = true;
            ComponenteLexico componente        = null;

            while (continuarAnalisis)
            {
                switch (estadoActual)
                {
                case 0:
                    leerSiguienteCaracter();
                    while (" ".Equals(caracterActual))
                    {
                        leerSiguienteCaracter();
                    }
                    if ("A".Equals(caracterActual) || "a".Equals(caracterActual))
                    {
                        lexemareserva = caracterActual;
                        estadoActual  = 1;
                    }
                    else if ("B".Equals(caracterActual) || "b".Equals(caracterActual))
                    {
                        lexemareserva = caracterActual;
                        estadoActual  = 2;
                    }
                    else if ("C".Equals(caracterActual) || "c".Equals(caracterActual))
                    {
                        lexemareserva = caracterActual;
                        estadoActual  = 3;
                    }
                    else if ("D".Equals(caracterActual) || "d".Equals(caracterActual))
                    {
                        lexemareserva = caracterActual;
                        estadoActual  = 4;
                    }
                    else if ("E".Equals(caracterActual) || "e".Equals(caracterActual))
                    {
                        lexemareserva = caracterActual;
                        estadoActual  = 5;
                    }
                    else if ("F".Equals(caracterActual) || "f".Equals(caracterActual))
                    {
                        lexemareserva = caracterActual;
                        estadoActual  = 6;
                    }
                    else if ("G".Equals(caracterActual) || "g".Equals(caracterActual))
                    {
                        lexemareserva = caracterActual;
                        estadoActual  = 7;
                    }
                    else if ("H".Equals(caracterActual) || "h".Equals(caracterActual))
                    {
                        lexemareserva = caracterActual;
                        estadoActual  = 8;
                    }
                    else if ("I".Equals(caracterActual) || "i".Equals(caracterActual))
                    {
                        lexemareserva = caracterActual;
                        estadoActual  = 9;
                    }
                    else if ("J".Equals(caracterActual) || "j".Equals(caracterActual))
                    {
                        lexemareserva = caracterActual;
                        estadoActual  = 10;
                    }
                    else if ("K".Equals(caracterActual) || "k".Equals(caracterActual))
                    {
                        lexemareserva = caracterActual;
                        estadoActual  = 11;
                    }
                    else if ("L".Equals(caracterActual) || "l".Equals(caracterActual))
                    {
                        lexemareserva = caracterActual;
                        estadoActual  = 12;
                    }
                    else if ("M".Equals(caracterActual) || "m".Equals(caracterActual))
                    {
                        lexemareserva = caracterActual;
                        estadoActual  = 13;
                    }
                    else if ("N".Equals(caracterActual) || "n".Equals(caracterActual))
                    {
                        lexemareserva = caracterActual;
                        estadoActual  = 14;
                    }
                    else if ("O".Equals(caracterActual) || "o".Equals(caracterActual))
                    {
                        lexemareserva = caracterActual;
                        estadoActual  = 15;
                    }
                    else if ("P".Equals(caracterActual) || "p".Equals(caracterActual))
                    {
                        lexemareserva = caracterActual;
                        estadoActual  = 16;
                    }
                    else if ("Q".Equals(caracterActual) || "q".Equals(caracterActual))
                    {
                        lexemareserva = caracterActual;
                        estadoActual  = 17;
                    }
                    else if ("R".Equals(caracterActual) || "r".Equals(caracterActual))
                    {
                        lexemareserva = caracterActual;
                        estadoActual  = 18;
                    }
                    else if ("@EOF@".Equals(caracterActual))
                    {
                        estadoActual = 20;
                    }
                    else if ("@FL@".Equals(caracterActual))
                    {
                        lexemareserva = lexemareserva + caracterActual;
                        estadoActual  = 21;
                    }
                    else if ("S".Equals(caracterActual) || "s".Equals(caracterActual))
                    {
                        lexemareserva = caracterActual;
                        estadoActual  = 22;
                    }
                    else if ("T".Equals(caracterActual) || "t".Equals(caracterActual))
                    {
                        lexemareserva = caracterActual;
                        estadoActual  = 23;
                    }
                    else if ("U".Equals(caracterActual) || "u".Equals(caracterActual))
                    {
                        lexemareserva = caracterActual;
                        estadoActual  = 24;
                    }
                    else if ("V".Equals(caracterActual) || "v".Equals(caracterActual))
                    {
                        lexemareserva = caracterActual;
                        estadoActual  = 25;
                    }
                    else if ("W".Equals(caracterActual) || "w".Equals(caracterActual))
                    {
                        lexemareserva = caracterActual;
                        estadoActual  = 26;
                    }
                    else if ("X".Equals(caracterActual) || "x".Equals(caracterActual))
                    {
                        lexemareserva = caracterActual;
                        estadoActual  = 27;
                    }
                    else if ("Y".Equals(caracterActual) || "y".Equals(caracterActual))
                    {
                        lexemareserva = caracterActual;
                        estadoActual  = 28;
                    }
                    else if ("Z".Equals(caracterActual) || "z".Equals(caracterActual))
                    {
                        lexemareserva = caracterActual;
                        estadoActual  = 29;
                    }
                    else if ("0".Equals(caracterActual))
                    {
                        lexemareserva = caracterActual;
                        estadoActual  = 30;
                    }
                    else if ("1".Equals(caracterActual))
                    {
                        lexemareserva = caracterActual;
                        estadoActual  = 31;
                    }
                    else if ("2".Equals(caracterActual))
                    {
                        lexemareserva = caracterActual;
                        estadoActual  = 32;
                    }
                    else if ("3".Equals(caracterActual))
                    {
                        lexemareserva = caracterActual;
                        estadoActual  = 33;
                    }
                    else if ("4".Equals(caracterActual))
                    {
                        lexemareserva = caracterActual;
                        estadoActual  = 34;
                    }
                    else if ("5".Equals(caracterActual))
                    {
                        lexemareserva = caracterActual;
                        estadoActual  = 35;
                    }
                    else if ("6".Equals(caracterActual))
                    {
                        lexemareserva = caracterActual;
                        estadoActual  = 36;
                    }
                    else if ("7".Equals(caracterActual))
                    {
                        lexemareserva = caracterActual;
                        estadoActual  = 37;
                    }
                    else if ("8".Equals(caracterActual))
                    {
                        lexemareserva = caracterActual;
                        estadoActual  = 38;
                    }
                    else if ("9".Equals(caracterActual))
                    {
                        lexemareserva = caracterActual;
                        estadoActual  = 39;
                    }
                    else
                    {
                        lexemareserva = caracterActual;
                        estadoActual  = 19;
                    }
                    break;

                case 1:
                    //leerSiguienteCaracter();
                    lexema            = TablaPalabrasReservadas.ObtenerInstancia().obtenerPalabraReservada(lexemareserva);
                    continuarAnalisis = false;
                    componente        = ComponenteLexico.crear(lexemareserva, lexema, "Letra", numeroLineaActual, puntero - lexemareserva.Length, puntero - 1);
                    AgregarComponente(componente);
                    break;

                case 2:
                    //leerSiguienteCaracter();
                    lexema            = TablaPalabrasReservadas.ObtenerInstancia().obtenerPalabraReservada(lexemareserva);
                    continuarAnalisis = false;
                    componente        = ComponenteLexico.crear(lexemareserva, lexema, "Letra", numeroLineaActual, puntero - lexemareserva.Length, puntero - 1);
                    AgregarComponente(componente);
                    break;

                case 3:
                    //leerSiguienteCaracter();
                    lexema            = TablaPalabrasReservadas.ObtenerInstancia().obtenerPalabraReservada(lexemareserva);
                    continuarAnalisis = false;
                    componente        = ComponenteLexico.crear(lexemareserva, lexema, "Letra", numeroLineaActual, puntero - lexemareserva.Length, puntero - 1);
                    AgregarComponente(componente);
                    break;

                case 4:
                    //leerSiguienteCaracter();
                    lexema            = TablaPalabrasReservadas.ObtenerInstancia().obtenerPalabraReservada(lexemareserva);
                    continuarAnalisis = false;
                    componente        = ComponenteLexico.crear(lexemareserva, lexema, "Letra", numeroLineaActual, puntero - lexemareserva.Length, puntero - 1);
                    AgregarComponente(componente);
                    break;

                case 5:
                    //leerSiguienteCaracter();
                    lexema            = TablaPalabrasReservadas.ObtenerInstancia().obtenerPalabraReservada(lexemareserva);
                    continuarAnalisis = false;
                    componente        = ComponenteLexico.crear(lexemareserva, lexema, "Letra", numeroLineaActual, puntero - lexemareserva.Length, puntero - 1);
                    AgregarComponente(componente);
                    break;

                case 6:
                    //leerSiguienteCaracter();
                    lexema            = TablaPalabrasReservadas.ObtenerInstancia().obtenerPalabraReservada(lexemareserva);
                    continuarAnalisis = false;
                    componente        = ComponenteLexico.crear(lexemareserva, lexema, "Letra", numeroLineaActual, puntero - lexemareserva.Length, puntero - 1);
                    AgregarComponente(componente);
                    break;

                case 7:
                    //leerSiguienteCaracter();
                    lexema            = TablaPalabrasReservadas.ObtenerInstancia().obtenerPalabraReservada(lexemareserva);
                    continuarAnalisis = false;
                    componente        = ComponenteLexico.crear(lexemareserva, lexema, "Letra", numeroLineaActual, puntero - lexemareserva.Length, puntero - 1);
                    AgregarComponente(componente);
                    break;

                case 8:
                    //leerSiguienteCaracter();
                    lexema            = TablaPalabrasReservadas.ObtenerInstancia().obtenerPalabraReservada(lexemareserva);
                    continuarAnalisis = false;
                    componente        = ComponenteLexico.crear(lexemareserva, lexema, "Letra", numeroLineaActual, puntero - lexemareserva.Length, puntero - 1);
                    AgregarComponente(componente);
                    break;

                case 9:
                    //leerSiguienteCaracter();
                    lexema            = TablaPalabrasReservadas.ObtenerInstancia().obtenerPalabraReservada(lexemareserva);
                    continuarAnalisis = false;
                    componente        = ComponenteLexico.crear(lexemareserva, lexema, "Letra", numeroLineaActual, puntero - lexemareserva.Length, puntero - 1);
                    AgregarComponente(componente);
                    break;

                case 10:
                    //leerSiguienteCaracter();
                    lexema            = TablaPalabrasReservadas.ObtenerInstancia().obtenerPalabraReservada(lexemareserva);
                    continuarAnalisis = false;
                    componente        = ComponenteLexico.crear(lexemareserva, lexema, "Letra", numeroLineaActual, puntero - lexemareserva.Length, puntero - 1);
                    AgregarComponente(componente);
                    break;

                case 11:
                    //leerSiguienteCaracter();
                    lexema            = TablaPalabrasReservadas.ObtenerInstancia().obtenerPalabraReservada(lexemareserva);
                    continuarAnalisis = false;
                    componente        = ComponenteLexico.crear(lexemareserva, lexema, "Letra", numeroLineaActual, puntero - lexemareserva.Length, puntero - 1);
                    AgregarComponente(componente);
                    break;

                case 12:
                    //leerSiguienteCaracter();
                    lexema            = TablaPalabrasReservadas.ObtenerInstancia().obtenerPalabraReservada(lexemareserva);
                    continuarAnalisis = false;
                    componente        = ComponenteLexico.crear(lexemareserva, lexema, "Letra", numeroLineaActual, puntero - lexemareserva.Length, puntero - 1);
                    AgregarComponente(componente);
                    break;

                case 13:
                    //leerSiguienteCaracter();
                    lexema            = TablaPalabrasReservadas.ObtenerInstancia().obtenerPalabraReservada(lexemareserva);
                    continuarAnalisis = false;
                    componente        = ComponenteLexico.crear(lexemareserva, lexema, "Letra", numeroLineaActual, puntero - lexemareserva.Length, puntero - 1);
                    AgregarComponente(componente);
                    break;

                case 14:
                    //leerSiguienteCaracter();
                    lexema            = TablaPalabrasReservadas.ObtenerInstancia().obtenerPalabraReservada(lexemareserva);
                    continuarAnalisis = false;
                    componente        = ComponenteLexico.crear(lexemareserva, lexema, "Letra", numeroLineaActual, puntero - lexemareserva.Length, puntero - 1);
                    AgregarComponente(componente);
                    break;

                case 15:
                    //leerSiguienteCaracter();
                    lexema            = TablaPalabrasReservadas.ObtenerInstancia().obtenerPalabraReservada(lexemareserva);
                    continuarAnalisis = false;
                    componente        = ComponenteLexico.crear(lexemareserva, lexema, "Letra", numeroLineaActual, puntero - lexemareserva.Length, puntero - 1);
                    AgregarComponente(componente);
                    break;

                case 16:
                    //leerSiguienteCaracter();
                    lexema            = TablaPalabrasReservadas.ObtenerInstancia().obtenerPalabraReservada(lexemareserva);
                    continuarAnalisis = false;
                    componente        = ComponenteLexico.crear(lexemareserva, lexema, "Letra", numeroLineaActual, puntero - lexemareserva.Length, puntero - 1);
                    AgregarComponente(componente);
                    break;

                case 17:
                    //leerSiguienteCaracter();
                    lexema            = TablaPalabrasReservadas.ObtenerInstancia().obtenerPalabraReservada(lexemareserva);
                    continuarAnalisis = false;
                    componente        = ComponenteLexico.crear(lexemareserva, lexema, "Letra", numeroLineaActual, puntero - lexemareserva.Length, puntero - 1);
                    AgregarComponente(componente);
                    break;

                case 18:
                    //leerSiguienteCaracter();
                    lexema            = TablaPalabrasReservadas.ObtenerInstancia().obtenerPalabraReservada(lexemareserva);
                    continuarAnalisis = false;
                    componente        = ComponenteLexico.crear(lexemareserva, lexema, "Letra", numeroLineaActual, puntero - lexemareserva.Length, puntero - 1);
                    AgregarComponente(componente);
                    break;

                case 19:
                    continuarAnalisis = false;
                    Error r = Error.crear(lexemareserva, "LEXICOS", "Caracter no valido.", "Ingrese una letra o un numero.", numeroLineaActual, puntero - lexemareserva.Length, (puntero - 1));
                    ManejadorErrores.obtenerManejadorErrores().reportarError(r);
                    componente = ComponenteLexico.crear(lexemareserva, lexema, "ERROR SINTACTICO", numeroLineaActual, puntero - lexemareserva.Length, (puntero - 1));
                    //TablaSimbolos.ObtenerInstancia().agregar(componente);
                    TablaErrores.ObtenerInstancia().agregar(r);
                    break;

                case 20:
                    continuarAnalisis = false;
                    estadoActual      = 0;
                    lexemareserva     = "";
                    lexema            = "";
                    //Console.WriteLine("FIN DE ARCHIVO");
                    componente = ComponenteLexico.crear(lexemareserva, lexema, "FIN DE ARCHIVO", numeroLineaActual, puntero - lexemareserva.Length, puntero - 1);
                    AgregarComponente(componente);
                    break;

                case 21:
                    // Salto de linea
                    continuarAnalisis = true;
                    estadoActual      = 0;
                    lexema            = lexema + " ";
                    cargarNuevaLinea();
                    break;

                case 22:
                    //leerSiguienteCaracter();
                    lexema            = TablaPalabrasReservadas.ObtenerInstancia().obtenerPalabraReservada(lexemareserva);
                    continuarAnalisis = false;
                    componente        = ComponenteLexico.crear(lexemareserva, lexema, "Letra", numeroLineaActual, puntero - lexemareserva.Length, puntero - 1);
                    AgregarComponente(componente);
                    break;

                case 23:
                    //leerSiguienteCaracter();
                    lexema            = TablaPalabrasReservadas.ObtenerInstancia().obtenerPalabraReservada(lexemareserva);
                    continuarAnalisis = false;
                    componente        = ComponenteLexico.crear(lexemareserva, lexema, "Letra", numeroLineaActual, puntero - lexemareserva.Length, puntero - 1);
                    AgregarComponente(componente);
                    break;

                case 24:
                    //leerSiguienteCaracter();
                    lexema            = TablaPalabrasReservadas.ObtenerInstancia().obtenerPalabraReservada(lexemareserva);
                    continuarAnalisis = false;
                    componente        = ComponenteLexico.crear(lexemareserva, lexema, "Letra", numeroLineaActual, puntero - lexemareserva.Length, puntero - 1);
                    AgregarComponente(componente);
                    break;

                case 25:
                    //leerSiguienteCaracter();
                    lexema            = TablaPalabrasReservadas.ObtenerInstancia().obtenerPalabraReservada(lexemareserva);
                    continuarAnalisis = false;
                    componente        = ComponenteLexico.crear(lexemareserva, lexema, "Letra", numeroLineaActual, puntero - lexemareserva.Length, puntero - 1);
                    AgregarComponente(componente);
                    break;

                case 26:
                    //leerSiguienteCaracter();
                    lexema            = TablaPalabrasReservadas.ObtenerInstancia().obtenerPalabraReservada(lexemareserva);
                    continuarAnalisis = false;
                    componente        = ComponenteLexico.crear(lexemareserva, lexema, "Letra", numeroLineaActual, puntero - lexemareserva.Length, puntero - 1);
                    AgregarComponente(componente);
                    break;

                case 27:
                    //leerSiguienteCaracter();
                    lexema            = TablaPalabrasReservadas.ObtenerInstancia().obtenerPalabraReservada(lexemareserva);
                    continuarAnalisis = false;
                    componente        = ComponenteLexico.crear(lexemareserva, lexema, "Letra", numeroLineaActual, puntero - lexemareserva.Length, puntero - 1);
                    AgregarComponente(componente);
                    break;

                case 28:
                    //leerSiguienteCaracter();
                    lexema            = TablaPalabrasReservadas.ObtenerInstancia().obtenerPalabraReservada(lexemareserva);
                    continuarAnalisis = false;
                    componente        = ComponenteLexico.crear(lexemareserva, lexema, "Letra", numeroLineaActual, puntero - lexemareserva.Length, puntero - 1);
                    AgregarComponente(componente);
                    break;

                case 29:
                    //leerSiguienteCaracter();
                    lexema            = TablaPalabrasReservadas.ObtenerInstancia().obtenerPalabraReservada(lexemareserva);
                    continuarAnalisis = false;
                    componente        = ComponenteLexico.crear(lexemareserva, lexema, "Letra", numeroLineaActual, puntero - lexemareserva.Length, puntero - 1);
                    AgregarComponente(componente);
                    break;

                case 30:
                    //leerSiguienteCaracter();
                    lexema            = TablaPalabrasReservadas.ObtenerInstancia().obtenerPalabraReservada(lexemareserva);
                    continuarAnalisis = false;
                    componente        = ComponenteLexico.crear(lexemareserva, lexema, "Numero", numeroLineaActual, puntero - lexemareserva.Length, puntero - 1);
                    AgregarComponente(componente);
                    break;

                case 31:
                    //leerSiguienteCaracter();
                    lexema            = TablaPalabrasReservadas.ObtenerInstancia().obtenerPalabraReservada(lexemareserva);
                    continuarAnalisis = false;
                    componente        = ComponenteLexico.crear(lexemareserva, lexema, "Numero", numeroLineaActual, puntero - lexemareserva.Length, puntero - 1);
                    AgregarComponente(componente);
                    break;

                case 32:
                    //leerSiguienteCaracter();
                    lexema            = TablaPalabrasReservadas.ObtenerInstancia().obtenerPalabraReservada(lexemareserva);
                    continuarAnalisis = false;
                    componente        = ComponenteLexico.crear(lexemareserva, lexema, "Numero", numeroLineaActual, puntero - lexemareserva.Length, puntero - 1);
                    AgregarComponente(componente);
                    break;

                case 33:
                    //leerSiguienteCaracter();
                    lexema            = TablaPalabrasReservadas.ObtenerInstancia().obtenerPalabraReservada(lexemareserva);
                    continuarAnalisis = false;
                    componente        = ComponenteLexico.crear(lexemareserva, lexema, "Numero", numeroLineaActual, puntero - lexemareserva.Length, puntero - 1);
                    AgregarComponente(componente);
                    break;

                case 34:
                    //leerSiguienteCaracter();
                    lexema            = TablaPalabrasReservadas.ObtenerInstancia().obtenerPalabraReservada(lexemareserva);
                    continuarAnalisis = false;
                    componente        = ComponenteLexico.crear(lexemareserva, lexema, "Numero", numeroLineaActual, puntero - lexemareserva.Length, puntero - 1);
                    AgregarComponente(componente);
                    break;

                case 35:
                    //leerSiguienteCaracter();
                    lexema            = TablaPalabrasReservadas.ObtenerInstancia().obtenerPalabraReservada(lexemareserva);
                    continuarAnalisis = false;
                    componente        = ComponenteLexico.crear(lexemareserva, lexema, "Numero", numeroLineaActual, puntero - lexemareserva.Length, puntero - 1);
                    AgregarComponente(componente);
                    break;

                case 36:
                    //leerSiguienteCaracter();
                    lexema            = TablaPalabrasReservadas.ObtenerInstancia().obtenerPalabraReservada(lexemareserva);
                    continuarAnalisis = false;
                    componente        = ComponenteLexico.crear(lexemareserva, lexema, "Numero", numeroLineaActual, puntero - lexemareserva.Length, puntero - 1);
                    AgregarComponente(componente);
                    break;

                case 37:
                    //leerSiguienteCaracter();
                    lexema            = TablaPalabrasReservadas.ObtenerInstancia().obtenerPalabraReservada(lexemareserva);
                    continuarAnalisis = false;
                    componente        = ComponenteLexico.crear(lexemareserva, lexema, "Numero", numeroLineaActual, puntero - lexemareserva.Length, puntero - 1);
                    AgregarComponente(componente);
                    break;

                case 38:
                    //leerSiguienteCaracter();
                    lexema            = TablaPalabrasReservadas.ObtenerInstancia().obtenerPalabraReservada(lexemareserva);
                    continuarAnalisis = false;
                    componente        = ComponenteLexico.crear(lexemareserva, lexema, "Numero", numeroLineaActual, puntero - lexemareserva.Length, puntero - 1);
                    AgregarComponente(componente);
                    break;

                case 39:
                    //leerSiguienteCaracter();
                    lexema            = TablaPalabrasReservadas.ObtenerInstancia().obtenerPalabraReservada(lexemareserva);
                    continuarAnalisis = false;
                    componente        = ComponenteLexico.crear(lexemareserva, lexema, "Numero", numeroLineaActual, puntero - lexemareserva.Length, puntero - 1);
                    AgregarComponente(componente);
                    break;
                }
            }
            return(componente);
        }