예제 #1
0
        public void createKleeneAFN(AFN AFN1, LinkedList <Estado> Estados)
        {
            Transicion TempTransicion;

            EstadoInicial.setID(Estado.Contador++);
            EstadoFinal.setID(Estado.Contador++);
            //TRANSICION CON EPSILON DESDE ESTADO INICIAL HACIA ESTADO FINAL
            TempTransicion = new Transicion();
            TempTransicion.setIDTerminal(-1);
            TempTransicion.setDestino(EstadoFinal);
            EstadoInicial.addTransicion(TempTransicion);
            //TRANSICION CON EPSILON DESDE ESTADO INICIAL HACIA ESTADO INICIAL DE AFN1
            TempTransicion = new Transicion();
            TempTransicion.setIDTerminal(-1);
            TempTransicion.setDestino(AFN1.getEstadoInicial());
            EstadoInicial.addTransicion(TempTransicion);
            //TRANSICION CON EPSILON DESDE ESTADO FINAL DE AFN1 HACIA ESTADO INICIAL DE AFN1
            TempTransicion = new Transicion();
            TempTransicion.setIDTerminal(-1);
            TempTransicion.setDestino(AFN1.getEstadoInicial());
            AFN1.getEstadoFinal().addTransicion(TempTransicion);
            //TRANSICION CON EPSILON DESDE ESTADO FINAL DE AFN1 HACIA ESTADO FINAL
            TempTransicion = new Transicion();
            TempTransicion.setIDTerminal(-1);
            TempTransicion.setDestino(EstadoFinal);
            AFN1.getEstadoFinal().addTransicion(TempTransicion);
            //SE AGREGAN ESTADOS NUEVOS
            Estados.AddLast(EstadoInicial);
            Estados.AddLast(EstadoFinal);
        }
예제 #2
0
        public void createConcatenacionAFN(AFN AFN1, AFN AFN2, LinkedList <Estado> Estados)
        {
            EstadoInicial = AFN1.getEstadoInicial();
            EstadoFinal   = AFN2.getEstadoFinal();

            //SE COMBINAN ESTADO FINAL DE AFN1 CON ESTADO INICIAL DE AFN2
            Estado TempEstado = new Estado();

            TempEstado.setID(Estado.Contador++);
            //TRANSICIONES ENTRANTES
            foreach (Estado AuxEstado in Estados)
            {
                foreach (Transicion TempTransicion in AuxEstado.getTransiciones())
                {
                    if (TempTransicion.getDestino() == AFN1.getEstadoFinal() || TempTransicion.getDestino() == AFN2.getEstadoInicial())
                    {
                        TempTransicion.setDestino(TempEstado);
                    }
                }
            }
            //TRANSICIONES SALIENTES
            foreach (Transicion TempTransicion in AFN1.getEstadoFinal().getTransiciones())
            {
                TempEstado.addTransicion((Transicion)TempTransicion.Clone());
            }
            foreach (Transicion TempTransicion in AFN2.getEstadoInicial().getTransiciones())
            {
                TempEstado.addTransicion((Transicion)TempTransicion.Clone());
            }

            //SE AÑADE NUEVO ESTADO Y SE ELIMINAN LOS DOS USADOS PARA EL NUEVO ESTADO
            Estados.Remove(AFN1.getEstadoFinal());
            Estados.Remove(AFN2.getEstadoInicial());
            Estados.AddLast(TempEstado);
            AFN1.setEstadoFinal(TempEstado);
            AFN2.setEstadoInicial(TempEstado);
        }
예제 #3
0
 public void setAFN(AFN arg1)
 {
     this.Automata = arg1;
     this.Tipo     = TipoNodo.AFN;
 }
        public void createRegexAFN()
        {
            LinkedList <Nodo> TempNodos = new LinkedList <Nodo>(Nodos);

            // SE CREAN LOS AFN's BASICOS PARA TERMINALES
            foreach (Nodo AuxNodo in TempNodos)
            {
                if (AuxNodo.getTipo() == Nodo.TipoNodo.TERMINAL)
                {
                    AFN TempAFN = new AFN();
                    TempAFN.createBasicAFN(AuxNodo.getID(), EstadosAFN);
                    AuxNodo.setAFN(TempAFN);
                }
            }

            Nodo TempNodo;
            Nodo AuxNodo1;
            Nodo AuxNodo2;
            Nodo NewNodo;
            AFN  NewAFN;

            //SE BUSCA EL PATRON OB-AFN-AFN o OU-AFN Y SE OPERAN LOS AFN's
            Console.Write("ENTRO CON SIZE DE ");
            Console.WriteLine(TempNodos.Count);
            while (TempNodos.Count > 1)
            {
                for (int i = 0; i < TempNodos.Count; i++)
                {
                    NewNodo = new Nodo();
                    NewNodo.setTipo(Nodo.TipoNodo.AFN);
                    NewAFN   = new AFN();
                    TempNodo = TempNodos.ElementAt(i);

                    if (TempNodo.getTipo() != Nodo.TipoNodo.AFN)
                    {
                        switch (TempNodo.getTipo())
                        {
                        case Nodo.TipoNodo.ALTERNANCIA:
                            AuxNodo1 = TempNodos.ElementAt(i + 1);
                            AuxNodo2 = TempNodos.ElementAt(i + 2);
                            if (AuxNodo1.getTipo() == Nodo.TipoNodo.AFN && AuxNodo2.getTipo() == Nodo.TipoNodo.AFN)
                            {
                                NewAFN.createAlternanciaAFN(AuxNodo1.getAFN(), AuxNodo2.getAFN(), EstadosAFN);
                                NewNodo.setAFN(NewAFN);
                                TempNodos.Remove(AuxNodo1);
                                TempNodos.Remove(AuxNodo2);
                                TempNodos.Find(TempNodo).Value = NewNodo;
                                i = TempNodos.Count;
                            }
                            break;

                        case Nodo.TipoNodo.CONCATENACION:
                            AuxNodo1 = TempNodos.ElementAt(i + 1);
                            AuxNodo2 = TempNodos.ElementAt(i + 2);
                            if (AuxNodo1.getTipo() == Nodo.TipoNodo.AFN && AuxNodo2.getTipo() == Nodo.TipoNodo.AFN)
                            {
                                NewAFN.createConcatenacionAFN(AuxNodo1.getAFN(), AuxNodo2.getAFN(), EstadosAFN);
                                NewNodo.setAFN(NewAFN);
                                TempNodos.Remove(AuxNodo1);
                                TempNodos.Remove(AuxNodo2);
                                TempNodos.Find(TempNodo).Value = NewNodo;
                                i = TempNodos.Count;
                            }
                            break;

                        case Nodo.TipoNodo.KLEENE:
                            AuxNodo1 = TempNodos.ElementAt(i + 1);
                            if (AuxNodo1.getTipo() == Nodo.TipoNodo.AFN)
                            {
                                NewAFN.createKleeneAFN(AuxNodo1.getAFN(), EstadosAFN);
                                NewNodo.setAFN(NewAFN);
                                TempNodos.Remove(AuxNodo1);
                                TempNodos.Find(TempNodo).Value = NewNodo;
                                i = TempNodos.Count;
                            }
                            break;

                        case Nodo.TipoNodo.POSITIVA:
                            AuxNodo1 = TempNodos.ElementAt(i + 1);
                            if (AuxNodo1.getTipo() == Nodo.TipoNodo.AFN)
                            {
                                NewAFN.createPositivaAFN(AuxNodo1.getAFN(), EstadosAFN);
                                NewNodo.setAFN(NewAFN);
                                TempNodos.Remove(AuxNodo1);
                                TempNodos.Find(TempNodo).Value = NewNodo;
                                i = TempNodos.Count;
                            }
                            break;

                        case Nodo.TipoNodo.UNAOCERO:
                            AuxNodo1 = TempNodos.ElementAt(i + 1);
                            if (AuxNodo1.getTipo() == Nodo.TipoNodo.AFN)
                            {
                                NewAFN.createUnaOCeroAFN(AuxNodo1.getAFN(), EstadosAFN);
                                NewNodo.setAFN(NewAFN);
                                TempNodos.Remove(AuxNodo1);
                                TempNodos.Find(TempNodo).Value = NewNodo;
                                i = TempNodos.Count;
                            }
                            break;
                        }
                    }
                }
            }
            Console.Write("SALIO CON SIZE DE ");
            Console.WriteLine(TempNodos.Count);
            RegexAFN        = TempNodos.ElementAt(0).getAFN();
            Estado.Contador = 0;
            createSubConjuntos();
        }