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 createSubConjuntos() { Estado NewEstadoAFD = new Estado(); Alfabeto = new LinkedList <String>(); LinkedList <Estado> AuxList; cerradura(RegexAFN.getEstadoInicial(), NewEstadoAFD.getEstadosAFN()); NewEstadoAFD.setID(Estado.Contador++); foreach (Estado AuxEstado in NewEstadoAFD.getEstadosAFN()) { if (AuxEstado == RegexAFN.getEstadoFinal()) { NewEstadoAFD.setAceptacion(); break; } } EstadosAFD.AddLast(NewEstadoAFD); //SE OBTIENE ALFABETO DE EXPRESION REGULAR foreach (Nodo TempNodo in Nodos) { if (TempNodo.getTipo() == Nodo.TipoNodo.AFN) { if (!Alfabeto.Contains(TempNodo.getTerminal())) { Alfabeto.AddLast(TempNodo.getTerminal()); } } } Estado TempEstado; int SizeEstadoAFD = EstadosAFD.Count(); for (int i = 0; i < SizeEstadoAFD; i++) { TempEstado = EstadosAFD.ElementAt(i); foreach (String Terminal in Alfabeto) { AuxList = new LinkedList <Estado>(); NewEstadoAFD = new Estado(); Transicion TempTransicion = new Transicion(); //SE CREA TRANSICION CON EL TERMINAL TempTransicion.setTerminalAFD(Terminal); //SE HACEN OPERACIONES DE CERRADURA mover(TempEstado.getEstadosAFN(), Terminal, AuxList); cerradura(AuxList, NewEstadoAFD.getEstadosAFN()); //SE COMPRUEBA SI SE GENERO UN ESTADO NUEVO Boolean ControlNuevoEstado = false; foreach (Estado AuxEstado in EstadosAFD) { ControlNuevoEstado = AuxEstado.compareEstadosAFN(NewEstadoAFD); //SI ES UN ESTADO VACIO if (NewEstadoAFD.getEstadosAFN().Count == 0) { ControlNuevoEstado = true; break; } //SI EL ESTADO YA EXISTE SE PONE COMO DESTINO PARA TRANSICION else if (ControlNuevoEstado) { TempTransicion.setDestino(AuxEstado); //SE AGREGA LA TRANSICION A TEMPESTADO TempEstado.addTransicion(TempTransicion); break; } } //SI EL ESTADO NO EXISTE SE AGREGA A LA LISTA DE ESTADOS Y SE ESTABLECE DESTINO PARA LA TRANSICION if (!ControlNuevoEstado) { NewEstadoAFD.setID(Estado.Contador++); foreach (Estado AuxEstado in NewEstadoAFD.getEstadosAFN()) { if (AuxEstado == RegexAFN.getEstadoFinal()) { NewEstadoAFD.setAceptacion(); break; } } EstadosAFD.AddLast(NewEstadoAFD); TempTransicion.setDestino(NewEstadoAFD); //SE AGREGA LA TRANSICION A TEMPESTADO TempEstado.addTransicion(TempTransicion); } } SizeEstadoAFD = EstadosAFD.Count(); } Console.Write("SALIO"); }