public String getTerminalString(int arg1) { foreach (Nodo TempNodo in Nodos) { if (TempNodo.getTipo() == Nodo.TipoNodo.AFN) { if (TempNodo.getID() == arg1) { return(TempNodo.getTerminal()); } } } return("Eps."); }
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(); }
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"); }