private AFN Concatenacion(AFN operando1, AFN operando2) // S1 ---tran1_2--->> S2 ---tran2_3--->> S3
        {
            //MODIFICAR TRANSICION: LOS QUE APUNTAN A ULTIMO YA NO LO HACEN
            Transicion cambioIzq = operando1.GetEstadoInicial().GetTransicionIzq();
            Transicion cambioDer = operando1.GetEstadoInicial().GetTransicionDer();

            if (cambioIzq != null && cambioIzq.GetSegundo() == operando1.GetEstadoFinal())
            {
                cambioIzq.SetSegundoEstado(operando2.GetEstadoInicial());
            }
            if (cambioDer != null && cambioDer.GetSegundo() == operando1.GetEstadoFinal())
            {
                cambioDer.SetSegundoEstado(operando2.GetEstadoInicial());
            }
            foreach (var estado in operando1.GetListaEstados())
            {
                cambioIzq = estado.GetTransicionIzq();
                cambioDer = estado.GetTransicionDer();
                if (cambioIzq != null && cambioIzq.GetSegundo() == operando1.GetEstadoFinal())
                {
                    cambioIzq.SetSegundoEstado(operando2.GetEstadoInicial());
                }
                if (cambioDer != null && cambioDer.GetSegundo() == operando1.GetEstadoFinal())
                {
                    cambioDer.SetSegundoEstado(operando2.GetEstadoInicial());
                }
            }
            //LO UNICO QUE HAY QUE HACER ES UNIR EL ULTIMO DEL PRIMERO CON EL PRIMERO DEL ULTIMO
            operando1.Final = operando2.Inicial;
            AFN concatenacion = new AFN();

            concatenacion.Inicial = operando1.Inicial;
            concatenacion.Final   = operando2.Final;

            //METIENDO EL RESTO DE ESTADOS AFN NUMERO 1
            foreach (var estado in operando1.GetListaEstados())
            {
                concatenacion.GetListaEstados().Add(estado);
            }
            concatenacion.GetListaEstados().Add(operando1.Final);
            //METIENDO EL RESTO DE ESTADOS AFN NUMERO 2
            foreach (var estado in operando2.GetListaEstados())
            {
                concatenacion.GetListaEstados().Add(estado);
            }
            return(concatenacion);
        }
        public void GenerarAFN(Expresiones_Regulares expresion)
        {
            this.expresion = expresion;
            bool         suma = true;
            Token        token1;
            List <Token> nuevaER  = expresion.GetTokens().ToList();
            List <Token> auxiliar = new List <Token>();

            foreach (var item in nuevaER)
            {
                if (item.GetTipoToken() == Token.Tipo.LLAVE_APERTURA || item.GetTipoToken() == Token.Tipo.LLAVE_CIERRE)
                {
                }
                else
                {
                    auxiliar.Add(item);
                }
            }
            nuevaER = auxiliar;
            while (suma)
            {
                for (int i = 0; i < nuevaER.Count; i++)
                {
                    token1 = nuevaER.ElementAt(i);
                    if (token1.GetTipoToken() == Token.Tipo.OP_SUMA)
                    {
                        suma = true;
                        break;
                    }
                    else
                    {
                        suma = false;
                    }
                }
                if (suma)
                {
                    nuevaER = SustituirCerraduraPositiva(nuevaER);
                }
            }
            foreach (var item in nuevaER)
            {
                Console.WriteLine(item.GetValorToken());
            }
            //AFN inicial = Operando("epsilon");
            for (int i = nuevaER.Count - 1; i >= 0; i--)
            {
                GenerarThompson(nuevaER.ElementAt(i));
            }
            //ORDENANDO LOS ESTADOS
            AFN final       = stackAFN.Pop();
            int contadorEst = 1;

            //final = Concatenacion(inicial, final);
            //stackAFN.Push(final);
            final.Inicial.SetNumeroEstado(0);
            foreach (var item in final.GetListaEstados())
            {
                item.SetNumeroEstado(contadorEst);
                contadorEst++;
            }
            final.Final.SetNumeroEstado(contadorEst);
            stackAFN.Push(final);
            foreach (var token in nuevaER)
            {
                switch (token.GetTipoToken())
                {
                case Token.Tipo.PUNTO:     //CONCATENACION
                {
                    break;
                }

                case Token.Tipo.PALITO_OR:      //ALTERNANCIA
                {
                    break;
                }

                case Token.Tipo.ASTERISCO:     //CERRADURA DE KLEEN
                {
                    break;
                }

                case Token.Tipo.OP_SUMA:     //CERRADURA POSITIVA
                {
                    break;
                }

                case Token.Tipo.PREGUNTA_CIERRE:     //APARICION
                {
                    break;
                }

                default:
                {         //operando
                    if (!final.listaTerminales.Contains(token.GetValorToken()))
                    {
                        final.listaTerminales.Add(token.GetValorToken());
                    }
                    break;
                }
                }
            }
        }