Exemple #1
0
        public string GraphvizAFN(Stack <AFN> stackAFN)
        {
            AFN Thompson = stackAFN.Peek();

            EnOrder(Thompson.GetEstadoInicial().GetTransicionIzq());
            EnOrder(Thompson.GetEstadoInicial().GetTransicionDer());
            //  EnOrderDer(Thompson.GetEstadoInicial().GetTransicionIzq());
            return(Graficar(text));
        }
        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);
        }
Exemple #3
0
        public void CrearAFD()
        {
            estVacio.SetNombreEstadoAFD(-1);
            nombreEstadoAFD = 0;
            Queue <EstadoAFD> colaEstadosAFD = new Queue <EstadoAFD>();
            List <Estado>     estados1       = new List <Estado>();

            estados1.Add(automataND.GetEstadoInicial());
            EstadoAFD cerradura = Cerradura(estados1);

            listaGeneralEstados.Add(cerradura);
            //  List<Estado> listaCerradura = cerradura.GetEstadosAlcanzados();
            List <EstadoAFD> listaEstadosAFD = new List <EstadoAFD>();

            listaEstadosAFD.Add(cerradura);
            colaEstadosAFD.Enqueue(cerradura);

            Mueve mueve;

            while (colaEstadosAFD.Count > 0)
            {
                EstadoAFD temp = colaEstadosAFD.Dequeue();
                foreach (var terminal in listaTerminales)
                {
                    List <Estado> estados = Mueve(temp.GetEstadosAlcanzados(), terminal);
                    //ida y simbolo
                    mueve = new Mueve(temp, terminal);
                    bool      entrar          = true;
                    EstadoAFD estadoAFD_nuevo = Cerradura(estados);
                    Console.WriteLine("estados mueves");
                    Console.WriteLine("ESTADO " + estadoAFD_nuevo.GetNombreEstadoAFD());
                    string hola = "";
                    foreach (var item in estadoAFD_nuevo.GetEstadosAlcanzados())
                    {
                        hola += item.GetNoEstado().ToString() + ", ";
                    }
                    Console.WriteLine(hola);
                    foreach (var estado in estados)
                    {
                        entrar = true;

                        Console.WriteLine("estado act: " + temp.GetNombreEstadoAFD() + " estAFD: " + estadoAFD_nuevo.GetNombreEstadoAFD() + " simbolo: " + terminal);
                        for (int i = 0; i < listaEstadosAFD.Count; i++)
                        {
                            if (CompararEstadosAFD(listaEstadosAFD.ElementAt(i).GetEstadosAlcanzados(), estadoAFD_nuevo.GetEstadosAlcanzados()) == false)
                            {
                                entrar = false;
                                mueve.SetLlegada(listaEstadosAFD.ElementAt(i));
                                mueves.Add(mueve);
                                nombreEstadoAFD = listaGeneralEstados.Last().GetNombreEstadoAFD() + 1;
                                break;
                            }
                        }
                        if (entrar)
                        {
                            //llegada
                            mueve.SetLlegada(estadoAFD_nuevo);
                            mueves.Add(mueve);
                            listaGeneralEstados.Add(estadoAFD_nuevo);
                            colaEstadosAFD.Enqueue(estadoAFD_nuevo);
                            listaEstadosAFD.Add(estadoAFD_nuevo);
                        }
                    }
                    //if (agregar)
                    //{
                    //    char a = estadoSal;
                    //    mueve.SetLlegada(a.ToString());
                    //    mueves.Add(mueve);
                    //    agregar = false;
                    //}
                    if (estados.Count == 0)
                    {
                        mueve.SetLlegada(estVacio);
                        mueves.Add(mueve);
                        nombreEstadoAFD = listaGeneralEstados.Last().GetNombreEstadoAFD() + 1;
                    }
                    //else if (entrar == false)
                    //{
                    //    nombreEstadoAFD--;
                    //}
                    //llegada vacia
                }
            }
            string estadosS;

            foreach (var item in listaGeneralEstados)
            {
                estadosS = "";
                Console.WriteLine("ESTADO " + item.GetNombreEstadoAFD());
                foreach (var item2 in item.GetEstadosAlcanzados())
                {
                    estadosS += item2.GetNoEstado().ToString() + ", ";
                }
                Console.WriteLine(estadosS);
            }
            foreach (var item in mueves)
            {
                Console.WriteLine("inicio: " + item.GetInicialString() + " llegada: " + item.GetLlegadaString() + " simbolo: " + item.GetSimbolo());
            }
            //GenerarGraphivizAFDTabla();
            //GenerarGraphvizAFD();
        }