예제 #1
0
        public void EnOrderDer(Transicion transicion)
        {
            Transicion transicionDerecha, transicion1;
            string     textDerecha;

            while (transicion != null)
            {
                transicionDerecha = transicion.GetPrimero().GetTransicionDer();
                if (transicionDerecha != null)
                {
                    transicion1 = transicionDerecha.GetSegundo().GetTransicionIzq();
                    text       += transicionDerecha.GetPrimero().GetNoEstado() + " -> " + transicionDerecha.GetSegundo().GetNoEstado() + "[label=\"" + transicionDerecha.GetTransicionSimbolo() + "\"]";
                    while (transicion1 != null)
                    {
                        textDerecha = transicion1.GetPrimero().GetNoEstado() + " -> " + transicion1.GetSegundo().GetNoEstado() + "[label=\"" + transicion1.GetTransicionSimbolo() + "\"]";
                        if (text.Contains(textDerecha))
                        {
                            break;
                        }
                        else
                        {
                            text += textDerecha;
                        }
                        transicion1 = transicion1.GetSegundo().GetTransicionIzq();
                    }
                }
                transicion = transicion.GetSegundo().GetTransicionIzq();
            }
        }
예제 #2
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);
        }
예제 #3
0
        //ESTE METODO DEVUELVE UNA LISTA DE ESTADOS QUE HAY QUE MANDAR A CERRADURA
        private List <Estado> Mueve(List <Estado> estados, string terminal)
        {
            List <Estado> estadosAlcanzados = new List <Estado>();

            foreach (var actual in estados)
            {
                Transicion transicion = actual.GetTransicionDer();
                if (transicion != null &&
                    transicion.GetTransicionSimbolo().Equals(terminal) &&
                    !estadosAlcanzados.Contains(transicion.GetSegundo()))
                {
                    estadosAlcanzados.Add(transicion.GetSegundo());
                }
                transicion = actual.GetTransicionIzq();
                if (transicion != null &&
                    transicion.GetTransicionSimbolo().Equals(terminal) &&
                    !estadosAlcanzados.Contains(transicion.GetSegundo()))
                {
                    estadosAlcanzados.Add(transicion.GetSegundo());
                }
            }
            return(estadosAlcanzados);
        }
예제 #4
0
        public void EnOrder(Transicion transicion)
        {
            bool   repeticion = false;
            string textoAlt;

            if (transicion != null)
            {
                textoAlt = transicion.GetPrimero().GetNoEstado() + " -> " + transicion.GetSegundo().GetNoEstado() + "[label=\"" + transicion.GetTransicionSimbolo() + "\"]";

                if (text.Contains(textoAlt))
                {
                    repeticion = true;
                }
                else
                {
                    text += textoAlt;
                }
                EnOrder(transicion.GetSegundo().GetTransicionIzq());
                if (!repeticion)
                {
                    EnOrder(transicion.GetSegundo().GetTransicionDer());
                }
            }
        }
예제 #5
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);
        }