public void analizeTokens()
        {
            for (int i = 0; i < ListaTokens.Count; i++)
            {
                //DETERMINA CONJUNTOS, EXPRESIONES REGULARES Y PALABRAS A EVALUAR
                if (ListaTokens.ElementAt(i).getTipo() == Token.TipoToken.ID)
                {
                    i++;

                    //PARA CONJUNTOS Y PALABRAS A EVALUAR
                    if (ListaTokens.ElementAt(i).getTipo() == Token.TipoToken.DOS_PUNTOS)
                    {
                        i++;

                        // PARA PALABRAS A EVALUAR
                        if (ListaTokens.ElementAt(i).getTipo() == Token.TipoToken.CADENA)
                        {
                            Palabra TempPalabra = new Palabra();
                            TempPalabra.setID(ListaTokens.ElementAt(i - 2).getLexema());
                            TempPalabra.setLexema(ListaTokens.ElementAt(i).getLexema());
                            TempPalabra.Fila    = ListaTokens.ElementAt(i).Fila;
                            TempPalabra.Columna = ListaTokens.ElementAt(i).Columna;
                            Palabras.AddLast(TempPalabra);
                        }

                        // PARA CONJUNTOS TIPO RANGO
                        else if (ListaTokens.ElementAt(i + 4).getTipo() == Token.TipoToken.GUION_CURVO)
                        {
                            Conjunto TempConjunto = new Conjunto();
                            TempConjunto.setID(ListaTokens.ElementAt(i).getLexema());
                            i += 3;
                            TempConjunto.setBeginInterval(ListaTokens.ElementAt(i).getLexema());
                            TempConjunto.setEndInterval(ListaTokens.ElementAt(i + 2).getLexema());
                            Conjuntos.AddLast(TempConjunto);
                        }

                        //PARA CONJUNTOS TIPO LISTA
                        else if (ListaTokens.ElementAt(i + 4).getTipo() == Token.TipoToken.COMA)
                        {
                            Conjunto TempConjunto = new Conjunto();
                            TempConjunto.setID(ListaTokens.ElementAt(i).getLexema());
                            i += 3;
                            // ADVERTENCIA -- CICLO CON NECESIDAD DE BREAK
                            for (int j = i; j > 0; j += 2)
                            {
                                TempConjunto.addCharToList(ListaTokens.ElementAt(j).getLexema()[0]);
                                if (ListaTokens.ElementAt(j + 1).getTipo() == Token.TipoToken.PUNTO_COMA)
                                {
                                    i = j + 1;
                                    break;
                                }
                            }
                            Conjuntos.AddLast(TempConjunto);
                        }
                    }

                    //PARA EXPRESIONES REGULARES
                    else if (ListaTokens.ElementAt(i).getTipo() == Token.TipoToken.GUION)
                    {
                        Regex TempRegex = new Regex();
                        Nodo  TempNodo  = new Nodo();
                        TempRegex.setID(ListaTokens.ElementAt(i - 1).getLexema());
                        //ADELANTA POSICION
                        i += 2;
                        for (int j = i; j > 0; j++)
                        {
                            TempNodo = new Nodo();

                            if (ListaTokens.ElementAt(j).getTipo() == Token.TipoToken.PUNTO)
                            {
                                TempNodo.setTipo(Nodo.TipoNodo.CONCATENACION);
                                TempNodo.setID2(Nodo.Contador2);
                                TempRegex.addNodo(TempNodo);
                            }

                            else if (ListaTokens.ElementAt(j).getTipo() == Token.TipoToken.CADENA)
                            {
                                TempNodo.setTipo(Nodo.TipoNodo.TERMINAL);
                                TempNodo.setID(Nodo.Contador);
                                TempNodo.setTerminal(ListaTokens.ElementAt(j).getLexema());
                                TempNodo.setID2(Nodo.Contador2);
                                TempRegex.addNodo(TempNodo);
                            }

                            else if (ListaTokens.ElementAt(j).getTipo() == Token.TipoToken.SIGNO_ASTERISCO)
                            {
                                TempNodo.setTipo(Nodo.TipoNodo.KLEENE);
                                TempNodo.setID2(Nodo.Contador2);
                                TempRegex.addNodo(TempNodo);
                            }

                            else if (ListaTokens.ElementAt(j).getTipo() == Token.TipoToken.SIGNO_MAS)
                            {
                                TempNodo.setTipo(Nodo.TipoNodo.POSITIVA);
                                TempNodo.setID2(Nodo.Contador2);
                                TempRegex.addNodo(TempNodo);
                            }

                            else if (ListaTokens.ElementAt(j).getTipo() == Token.TipoToken.SIGNO_ALTERNANCIA)
                            {
                                TempNodo.setTipo(Nodo.TipoNodo.ALTERNANCIA);
                                TempNodo.setID2(Nodo.Contador2);
                                TempRegex.addNodo(TempNodo);
                            }

                            else if (ListaTokens.ElementAt(j).getTipo() == Token.TipoToken.SIGNO_INTERROGACION)
                            {
                                TempNodo.setTipo(Nodo.TipoNodo.UNAOCERO);
                                TempNodo.setID2(Nodo.Contador2);
                                TempRegex.addNodo(TempNodo);
                            }

                            else if (ListaTokens.ElementAt(j).getTipo() == Token.TipoToken.ABRE_LLAVE)
                            {
                                j++;
                                TempNodo.setTipo(Nodo.TipoNodo.TERMINAL);
                                TempNodo.setID(Nodo.Contador);
                                TempNodo.setTerminal(ListaTokens.ElementAt(j).getLexema());
                                TempNodo.setConjunto(ListaTokens.ElementAt(j).getLexema(), Conjuntos);
                                j++;
                                TempNodo.setID2(Nodo.Contador2);
                                TempRegex.addNodo(TempNodo);
                            }

                            else if (ListaTokens.ElementAt(j).getTipo() == Token.TipoToken.PUNTO_COMA)
                            {
                                Expresiones.AddLast(TempRegex);
                                i = j;
                                break;
                            }
                        }
                        Nodo.Contador  = 1;
                        Nodo.Contador2 = 1;
                    }
                }
            }
        }
        public void createRegexAFN()
        {
            LinkedList <Nodo> TempNodos = new LinkedList <Nodo>(Nodos);

            // SE CREAN LOS AFN's BASICOS PARA TERMINALES
            foreach (Nodo AuxNodo in TempNodos)
            {
                if (AuxNodo.getTipo() == Nodo.TipoNodo.TERMINAL)
                {
                    AFN TempAFN = new AFN();
                    TempAFN.createBasicAFN(AuxNodo.getID(), EstadosAFN);
                    AuxNodo.setAFN(TempAFN);
                }
            }

            Nodo TempNodo;
            Nodo AuxNodo1;
            Nodo AuxNodo2;
            Nodo NewNodo;
            AFN  NewAFN;

            //SE BUSCA EL PATRON OB-AFN-AFN o OU-AFN Y SE OPERAN LOS AFN's
            Console.Write("ENTRO CON SIZE DE ");
            Console.WriteLine(TempNodos.Count);
            while (TempNodos.Count > 1)
            {
                for (int i = 0; i < TempNodos.Count; i++)
                {
                    NewNodo = new Nodo();
                    NewNodo.setTipo(Nodo.TipoNodo.AFN);
                    NewAFN   = new AFN();
                    TempNodo = TempNodos.ElementAt(i);

                    if (TempNodo.getTipo() != Nodo.TipoNodo.AFN)
                    {
                        switch (TempNodo.getTipo())
                        {
                        case Nodo.TipoNodo.ALTERNANCIA:
                            AuxNodo1 = TempNodos.ElementAt(i + 1);
                            AuxNodo2 = TempNodos.ElementAt(i + 2);
                            if (AuxNodo1.getTipo() == Nodo.TipoNodo.AFN && AuxNodo2.getTipo() == Nodo.TipoNodo.AFN)
                            {
                                NewAFN.createAlternanciaAFN(AuxNodo1.getAFN(), AuxNodo2.getAFN(), EstadosAFN);
                                NewNodo.setAFN(NewAFN);
                                TempNodos.Remove(AuxNodo1);
                                TempNodos.Remove(AuxNodo2);
                                TempNodos.Find(TempNodo).Value = NewNodo;
                                i = TempNodos.Count;
                            }
                            break;

                        case Nodo.TipoNodo.CONCATENACION:
                            AuxNodo1 = TempNodos.ElementAt(i + 1);
                            AuxNodo2 = TempNodos.ElementAt(i + 2);
                            if (AuxNodo1.getTipo() == Nodo.TipoNodo.AFN && AuxNodo2.getTipo() == Nodo.TipoNodo.AFN)
                            {
                                NewAFN.createConcatenacionAFN(AuxNodo1.getAFN(), AuxNodo2.getAFN(), EstadosAFN);
                                NewNodo.setAFN(NewAFN);
                                TempNodos.Remove(AuxNodo1);
                                TempNodos.Remove(AuxNodo2);
                                TempNodos.Find(TempNodo).Value = NewNodo;
                                i = TempNodos.Count;
                            }
                            break;

                        case Nodo.TipoNodo.KLEENE:
                            AuxNodo1 = TempNodos.ElementAt(i + 1);
                            if (AuxNodo1.getTipo() == Nodo.TipoNodo.AFN)
                            {
                                NewAFN.createKleeneAFN(AuxNodo1.getAFN(), EstadosAFN);
                                NewNodo.setAFN(NewAFN);
                                TempNodos.Remove(AuxNodo1);
                                TempNodos.Find(TempNodo).Value = NewNodo;
                                i = TempNodos.Count;
                            }
                            break;

                        case Nodo.TipoNodo.POSITIVA:
                            AuxNodo1 = TempNodos.ElementAt(i + 1);
                            if (AuxNodo1.getTipo() == Nodo.TipoNodo.AFN)
                            {
                                NewAFN.createPositivaAFN(AuxNodo1.getAFN(), EstadosAFN);
                                NewNodo.setAFN(NewAFN);
                                TempNodos.Remove(AuxNodo1);
                                TempNodos.Find(TempNodo).Value = NewNodo;
                                i = TempNodos.Count;
                            }
                            break;

                        case Nodo.TipoNodo.UNAOCERO:
                            AuxNodo1 = TempNodos.ElementAt(i + 1);
                            if (AuxNodo1.getTipo() == Nodo.TipoNodo.AFN)
                            {
                                NewAFN.createUnaOCeroAFN(AuxNodo1.getAFN(), EstadosAFN);
                                NewNodo.setAFN(NewAFN);
                                TempNodos.Remove(AuxNodo1);
                                TempNodos.Find(TempNodo).Value = NewNodo;
                                i = TempNodos.Count;
                            }
                            break;
                        }
                    }
                }
            }
            Console.Write("SALIO CON SIZE DE ");
            Console.WriteLine(TempNodos.Count);
            RegexAFN        = TempNodos.ElementAt(0).getAFN();
            Estado.Contador = 0;
            createSubConjuntos();
        }