コード例 #1
0
        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);
        }
コード例 #2
0
        private EstadoAFD Cerradura(List <Estado> estados)
        {
            Stack <Estado> pilaEstados = new Stack <Estado>();
            Estado         actual;
            //estado AFD
            List <Estado> listaEstados  = new List <Estado>();
            List <int>    numeroEstados = new List <int>();

            foreach (var estado in estados)
            {
                actual = estado;
                pilaEstados.Push(actual);
                numeroEstados.Add(estado.GetNoEstado());

                while (pilaEstados.Count > 0)
                {
                    actual = pilaEstados.Pop();
                    if (actual != null)
                    {
                        Transicion transicion = actual.GetTransicionDer();
                        if (transicion != null &&
                            transicion.GetTransicionSimbolo().Equals("epsilon") &&
                            !listaEstados.Contains(transicion.GetSegundo()))
                        {
                            listaEstados.Add(transicion.GetSegundo());
                            numeroEstados.Add(transicion.GetSegundo().GetNoEstado());
                            pilaEstados.Push(transicion.GetSegundo());
                        }
                        transicion = actual.GetTransicionIzq();
                        if (transicion != null &&
                            transicion.GetTransicionSimbolo().Equals("epsilon") &&
                            !listaEstados.Contains(transicion.GetSegundo()))
                        {
                            listaEstados.Add(transicion.GetSegundo());
                            numeroEstados.Add(transicion.GetSegundo().GetNoEstado());
                            pilaEstados.Push(transicion.GetSegundo());
                        }
                    }
                }
                listaEstados.Add(estado);
            }

            EstadoAFD estadoAFD = new EstadoAFD(nombreEstadoAFD++, numeroEstados, listaEstados);

            if (listaEstados.Contains(automataND.GetEstadoFinal()))
            {
                estadoAFD.SetTipoEstado(EstadoAFD.Tipo.FINAL);
            }
            else
            {
                estadoAFD.SetTipoEstado(EstadoAFD.Tipo.NORMAL);
            }
            //Console.WriteLine("PRUEBA ESTADOS POR " + "epsilon");
            //string alv = "";
            //foreach (Estado est in listaEstados)
            //{
            //    alv += est.GetNoEstado();
            //}

            return(estadoAFD);
        }