예제 #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 Alternancia(AFN operando1, AFN operando2)
        {
            Estado     estadoInicial = new Estado(0);
            Transicion Opcion1       = new Transicion(estadoInicial, operando1.Inicial, "epsilon");
            Transicion Opcion2       = new Transicion(estadoInicial, operando2.Inicial, "epsilon");

            //Metiendo las transiciones
            estadoInicial.SetTransicionDer(Opcion2);
            estadoInicial.SetTransicionIzq(Opcion1);
            Estado     estadoFinal = new Estado(6); //6 -> si fuera el mas simple existente
            Transicion Opcion1F    = new Transicion(operando1.Final, estadoFinal, "epsilon");
            Transicion Opcion2F    = new Transicion(operando2.Final, estadoFinal, "epsilon");

            //Metiendo las transiciones
            operando1.Final.SetTransicionIzq(Opcion1F);
            operando2.Final.SetTransicionIzq(Opcion2F);

            AFN alternancia = new AFN();

            alternancia.Inicial = estadoInicial;
            alternancia.Final   = estadoFinal;
            alternancia.Meter_EstNormales(operando1);
            alternancia.Meter_EstNormales(operando2);

            return(alternancia);
        }
예제 #3
0
        private AFN CerraduraPositiva(AFN operando)
        {
            //Operando(operando.);
            //CerraduraKleen(operando);
            Estado     estadoInicial = new Estado(0);
            Estado     estadoFinal   = new Estado(3); //3 -> si fuera el mas simple existente
            Transicion transicion    = new Transicion(estadoInicial, operando.Inicial, "epsilon");

            estadoInicial.SetTransicionIzq(transicion);
            //REPETICION
            Transicion repeticion = new Transicion(operando.Final, operando.Inicial, "epsilon");
            //UNIENDO OPERANDO CON EL FINAL
            Transicion unionFinal = new Transicion(operando.Final, estadoFinal, "epsilon");

            operando.Final.SetTransicionIzq(unionFinal);
            operando.Final.SetTransicionDer(repeticion);
            //CREANDO AFN
            AFN cerraduraPositiva = new AFN();

            cerraduraPositiva.Inicial = estadoInicial;
            cerraduraPositiva.Final   = estadoFinal;
            cerraduraPositiva.Meter_EstNormales(operando);

            return(cerraduraPositiva);
        }
예제 #4
0
 public Estado(int no)  //LO PONE COMO UN ESTADO DEL TIPO NORMAL
 {
     noEstado    = no;
     tipoEstado  = Tipo.NORMAL;
     T_derecha   = null;
     T_izquierda = null;
 }
예제 #5
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);
        }
예제 #6
0
        //ESTE SE VUELVE UNA HOJA
        private AFN Operando(string simbolo) // S1 --- transicion(simbolo) --- >> S2
        {
            //ELEMENTOS DEL AFN
            Estado     estado1    = new Estado(0);
            Estado     estado2    = new Estado(1);
            Transicion transicion = new Transicion(estado1, estado2, simbolo);

            //LLENANDO LISTA DE TERMINALES

            estado1.SetTransicionIzq(transicion); //el primero debe saber a donde jodidos va
            //CREANDO EL AFN
            AFN operando = new AFN();

            operando.Inicial = estado1;
            operando.Final   = estado2;
            //operando.conjuntoEst_Aceptacion.Add(estado2);

            return(operando);
        }
예제 #7
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);
        }
예제 #8
0
        private AFN Aparicion(AFN operando)
        {
            Estado     estadoInicial = new Estado(0);
            Estado     estadoFinal   = new Estado(3); //3 -> si fuera el mas simple existente
            Transicion transicion    = new Transicion(estadoInicial, operando.Inicial, "epsilon");
            //QUE NO APAREZCA NADA
            Transicion inicial_final = new Transicion(estadoInicial, estadoFinal, "epsilon");

            estadoInicial.SetTransicionIzq(transicion);
            estadoInicial.SetTransicionDer(inicial_final);
            //UNIENDO OPERANDO CON EL FINAL
            Transicion unionFinal = new Transicion(operando.Final, estadoFinal, "epsilon");

            operando.Final.SetTransicionIzq(unionFinal);
            //CREANDO AFN
            AFN aparicion = new AFN();

            aparicion.Inicial = estadoInicial;
            aparicion.Final   = estadoFinal;
            aparicion.Meter_EstNormales(operando);

            return(aparicion);
        }
예제 #9
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());
                }
            }
        }
예제 #10
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);
        }
예제 #11
0
 public void SetTransicionDer(Transicion transicion)
 {
     T_derecha = transicion;
 }
예제 #12
0
 public void SetTransicionIzq(Transicion transicion)
 {
     T_izquierda = transicion;
 }