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); }
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); }
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(); }