public void tokenValidos(String entrada)
        {
            switch (entrada)
            {
            case "{":
                Lexema instancia = new Lexema(entrada, "Llaves abrir", filaDato, columnaDato);
                registro.AddLast(instancia);
                break;

            case "}":
                instancia = new Lexema(entrada, "Llaves cerrar", filaDato, columnaDato);
                registro.AddLast(instancia);
                break;

            case ":":
                instancia = new Lexema(entrada, "Dos puntos", filaDato, columnaDato);
                registro.AddLast(instancia);
                break;

            case ";":
                instancia = new Lexema(entrada, "Punto y coma", filaDato, columnaDato);
                registro.AddLast(instancia);
                break;

            case "->":
                instancia = new Lexema(entrada, "Definicion", filaDato, columnaDato);
                registro.AddLast(instancia);
                break;

            case "%%":
                instancia = new Lexema(entrada, "Doble porcentaje", filaDato, columnaDato);
                registro.AddLast(instancia);
                break;

            default:
                instancia = new Lexema(entrada, "error", filaDato, columnaDato);
                registro.AddLast(instancia);
                errores++;
                break;
            }
        }
        public LinkedList <Lexema> analizar(String cadena)
        {
            int    inicioEstado    = 0;
            int    estadoPrincipal = 0;
            char   cadenaConcatenar;
            String token = "";

            registro = new LinkedList <Lexema>();

            for (inicioEstado = 0; inicioEstado < cadena.Length; inicioEstado++)
            {
                cadenaConcatenar = cadena[inicioEstado];

                if (auxiliar == inicioEstado)
                {
                    columnaDato++;
                }

                if (auxiliar != inicioEstado)
                {
                    auxiliar = inicioEstado;
                }

                switch (estadoPrincipal)
                {
                case 0:
                    switch (cadenaConcatenar)
                    {
                    case ' ':
                    case '\r':
                    case '\b':
                    case '\f':
                    case '\t':
                        estadoPrincipal = 0;
                        break;

                    case '\n':
                        filaDato++;
                        columnaDato     = 0;
                        estadoPrincipal = 0;
                        break;

                    default:

                        if (alfabeto.Contains(cadenaConcatenar))
                        {
                            token          += cadenaConcatenar;
                            estadoPrincipal = 2;
                        }
                        else if (simbolos.Contains(cadenaConcatenar))
                        {
                            token          += cadenaConcatenar;
                            estadoPrincipal = 1;
                        }
                        else
                        {
                            token          += cadenaConcatenar;
                            estadoPrincipal = 6;
                        }

                        break;
                    }
                    break;

                //-----------------------------ESTADO DE SIMBOLOS----------------------//
                case 1:
                    if (token.Equals("-"))
                    {
                        if (cadenaConcatenar == '>')
                        {
                            token += cadenaConcatenar;
                            tokenValidos(token);
                            estadoPrincipal = 3;
                            token           = "";
                        }
                        else
                        {
                            tokenValidos(token);
                            estadoPrincipal = 0;
                            token           = "";
                            inicioEstado    = inicioEstado - 1;
                        }
                    }
                    else if (token.Equals("%"))
                    {
                        if (cadenaConcatenar == '%')
                        {
                            token += cadenaConcatenar;
                            tokenValidos(token);
                            estadoPrincipal = 0;
                            token           = "";
                        }
                        else
                        {
                            tokenValidos(token);
                            estadoPrincipal = 0;
                            token           = "";
                            inicioEstado    = inicioEstado - 1;
                        }
                    }
                    else if (token.Equals("/"))
                    {
                        if (cadenaConcatenar == '/')
                        {
                            token          += cadenaConcatenar;
                            estadoPrincipal = 7;
                        }
                        else
                        {
                            tokenValidos(token);
                            estadoPrincipal = 0;
                            token           = "";
                            inicioEstado    = inicioEstado - 1;
                        }
                    }
                    else if (token.Equals("<"))
                    {
                        if (cadenaConcatenar == '!')
                        {
                            token          += cadenaConcatenar;
                            estadoPrincipal = 9;
                        }
                        else
                        {
                            tokenValidos(token);
                            estadoPrincipal = 0;
                            token           = "";
                            inicioEstado    = inicioEstado - 1;
                        }
                    }
                    else if (token.Equals("\""))
                    {
                        estadoPrincipal = 4;
                        token           = "";
                        token          += cadenaConcatenar;
                        if (token.Equals("\""))
                        {
                            Lexema instancia = new Lexema("", "cadena", filaDato, columnaDato);
                            registro.AddLast(instancia);
                            token  = "";
                            token += cadenaConcatenar;
                            tokenValidos(token);
                            token           = "";
                            estadoPrincipal = 0;
                        }
                    }
                    else
                    {
                        tokenValidos(token);
                        token           = "";
                        estadoPrincipal = 0;
                        inicioEstado    = inicioEstado - 1;
                    }
                    break;

                //-----------------------------ESTADO IDENTIFICADORES----------------------//
                case 2:
                    if (espacios.Contains(cadenaConcatenar) || simbolos.Contains(cadenaConcatenar))
                    {
                        Lexema instancia;
                        if (token.Equals("CONJ"))
                        {
                            instancia = new Lexema(token, "Reservada CONJ", filaDato, columnaDato);
                        }
                        else
                        {
                            instancia = new Lexema(token, "Identificador", filaDato, columnaDato);
                        }

                        registro.AddLast(instancia);
                        token           = "";
                        estadoPrincipal = 0;
                        inicioEstado    = inicioEstado - 1;
                    }
                    else if (alfabeto.Contains(cadenaConcatenar) || numeros.Contains(cadenaConcatenar))
                    {
                        token += cadenaConcatenar;
                    }
                    else
                    {
                        token          += cadenaConcatenar;
                        estadoPrincipal = 6;
                    }
                    break;

                //--------------------------------------FILTRO-----------------------------//
                case 8:
                    if (operadores.Contains(cadenaConcatenar))
                    {
                        estadoPrincipal = 10;
                        inicioEstado--;
                    }

                    else
                    {
                        estadoPrincipal = 5;
                        inicioEstado--;
                    }

                    break;


                //--------------------------ESPERA DE DEFINICION DE CONJUNTO------------//
                case 3:
                    if (cadenaConcatenar != ' ')
                    {
                        estadoPrincipal = 8;
                        inicioEstado--;
                    }
                    break;

                //-----------------------ESTADO CADENA...expresion?----------------------//
                case 4:
                    if (cadenaConcatenar == '"')
                    {
                        Lexema instancia = new Lexema(token, "cadena", filaDato, columnaDato);
                        registro.AddLast(instancia);
                        token           = "";
                        estadoPrincipal = 0;
                    }
                    else
                    {
                        token += cadenaConcatenar;
                    }
                    break;

                //-----------------------ESTADO DEFINICION CONJUNTOS---------------------//
                case 5:
                    if (cadenaConcatenar == ';')
                    {
                        Lexema instancia = new Lexema(token, "conjunto", filaDato, columnaDato);
                        registro.AddLast(instancia);
                        token  = "";
                        token += cadenaConcatenar;
                        tokenValidos(token);
                        token           = "";
                        estadoPrincipal = 0;
                    }
                    else
                    {
                        token += cadenaConcatenar;
                    }
                    break;

                //-----------------------------ESTADO COMENTARIO SIMPLE----------------------//
                case 7:
                    if (cadenaConcatenar == '\n' || cadenaConcatenar == '\r')
                    {
                        Lexema instancia = new Lexema(token, "comentario simple", filaDato, columnaDato);
                        registro.AddLast(instancia);
                        token           = "";
                        estadoPrincipal = 0;
                    }
                    else
                    {
                        token += cadenaConcatenar;
                    }

                    break;

                //-----------------------------ESTADO COMENTARIO BLOQUE----------------------//
                case 9:
                    string substring = token.Substring(Math.Max(0, token.Length - 2));
                    if (substring.Equals("!>"))
                    {
                        Lexema instancia = new Lexema(token, "comentario bloque", filaDato, columnaDato);
                        registro.AddLast(instancia);
                        estadoPrincipal = 0;
                        token           = "";
                        inicioEstado--;
                    }
                    else
                    {
                        token += cadenaConcatenar;
                    }
                    break;

                //-----------------------------ESTADO DE ERROR----------------------//
                case 6:

                    if (espacios.Contains(cadenaConcatenar) || cadenaConcatenar == ';')
                    {
                        errores++;
                        Lexema instancia = new Lexema(token, "error", filaDato, columnaDato);
                        registro.AddLast(instancia);
                        token           = "";
                        estadoPrincipal = 0;
                        inicioEstado    = inicioEstado - 1;
                    }
                    else
                    {
                        token += cadenaConcatenar;
                    }
                    break;

                //---------------------------EXPRESION REGULAR------------------------//
                case 10:
                    if (cadenaConcatenar == ';')
                    {
                        Lexema instancia = new Lexema(token, "expresion", filaDato, columnaDato);
                        registro.AddLast(instancia);
                        token  = "";
                        token += cadenaConcatenar;
                        tokenValidos(token);
                        token           = "";
                        estadoPrincipal = 0;
                    }
                    else
                    {
                        token += cadenaConcatenar;
                    }

                    break;
                }
            }


            return(registro);
        }
        public void conjunto(Lexema lexema, string nombre)
        {
            LinkedList <string> elementos = new LinkedList <string>();

            if (!lexema.info.Equals("todo"))
            {
                int actual = 0;

                string split = lexema.info;
                int    prim  = split[0];

                string temp = "";
                temp += split[0];
                elementos.AddLast(temp);
                temp = "";

                for (int i = 1; i < split.Length; i++)
                {
                    char estado = split[i];
                    switch (actual)
                    {
                    case 0:
                        switch (estado)
                        {
                        case ',':
                            actual = 2;
                            break;

                        case '~':
                            actual = 1;
                            break;
                        }
                        break;

                    case 1:
                        elementos.Clear();
                        int sec = split[i];
                        for (int k = prim; k < sec + 1; k++)
                        {
                            temp += (char)k;
                            elementos.AddLast(temp);
                            temp = "";
                        }
                        break;

                    case 2:
                        temp += split[i];
                        elementos.AddLast(temp);
                        temp   = "";
                        actual = 0;
                        break;
                    }
                }
                Conjunto conjunto = new Conjunto(nombre, elementos);
                conjuntos.AddLast(conjunto);
            }
            else
            {
                Conjunto conjunto = new Conjunto(nombre, elementos);
                conjuntos.AddLast(conjunto);
            }
        }