public void analizeTokens() { for (int i = 0; i < ListaTokens.Count; i++) { //DETERMINA CONJUNTOS, EXPRESIONES REGULARES Y PALABRAS A EVALUAR if (ListaTokens.ElementAt(i).getTipo() == Token.TipoToken.ID) { i++; //PARA CONJUNTOS Y PALABRAS A EVALUAR if (ListaTokens.ElementAt(i).getTipo() == Token.TipoToken.DOS_PUNTOS) { i++; // PARA PALABRAS A EVALUAR if (ListaTokens.ElementAt(i).getTipo() == Token.TipoToken.CADENA) { Palabra TempPalabra = new Palabra(); TempPalabra.setID(ListaTokens.ElementAt(i - 2).getLexema()); TempPalabra.setLexema(ListaTokens.ElementAt(i).getLexema()); TempPalabra.Fila = ListaTokens.ElementAt(i).Fila; TempPalabra.Columna = ListaTokens.ElementAt(i).Columna; Palabras.AddLast(TempPalabra); } // PARA CONJUNTOS TIPO RANGO else if (ListaTokens.ElementAt(i + 4).getTipo() == Token.TipoToken.GUION_CURVO) { Conjunto TempConjunto = new Conjunto(); TempConjunto.setID(ListaTokens.ElementAt(i).getLexema()); i += 3; TempConjunto.setBeginInterval(ListaTokens.ElementAt(i).getLexema()); TempConjunto.setEndInterval(ListaTokens.ElementAt(i + 2).getLexema()); Conjuntos.AddLast(TempConjunto); } //PARA CONJUNTOS TIPO LISTA else if (ListaTokens.ElementAt(i + 4).getTipo() == Token.TipoToken.COMA) { Conjunto TempConjunto = new Conjunto(); TempConjunto.setID(ListaTokens.ElementAt(i).getLexema()); i += 3; // ADVERTENCIA -- CICLO CON NECESIDAD DE BREAK for (int j = i; j > 0; j += 2) { TempConjunto.addCharToList(ListaTokens.ElementAt(j).getLexema()[0]); if (ListaTokens.ElementAt(j + 1).getTipo() == Token.TipoToken.PUNTO_COMA) { i = j + 1; break; } } Conjuntos.AddLast(TempConjunto); } } //PARA EXPRESIONES REGULARES else if (ListaTokens.ElementAt(i).getTipo() == Token.TipoToken.GUION) { Regex TempRegex = new Regex(); Nodo TempNodo = new Nodo(); TempRegex.setID(ListaTokens.ElementAt(i - 1).getLexema()); //ADELANTA POSICION i += 2; for (int j = i; j > 0; j++) { TempNodo = new Nodo(); if (ListaTokens.ElementAt(j).getTipo() == Token.TipoToken.PUNTO) { TempNodo.setTipo(Nodo.TipoNodo.CONCATENACION); TempNodo.setID2(Nodo.Contador2); TempRegex.addNodo(TempNodo); } else if (ListaTokens.ElementAt(j).getTipo() == Token.TipoToken.CADENA) { TempNodo.setTipo(Nodo.TipoNodo.TERMINAL); TempNodo.setID(Nodo.Contador); TempNodo.setTerminal(ListaTokens.ElementAt(j).getLexema()); TempNodo.setID2(Nodo.Contador2); TempRegex.addNodo(TempNodo); } else if (ListaTokens.ElementAt(j).getTipo() == Token.TipoToken.SIGNO_ASTERISCO) { TempNodo.setTipo(Nodo.TipoNodo.KLEENE); TempNodo.setID2(Nodo.Contador2); TempRegex.addNodo(TempNodo); } else if (ListaTokens.ElementAt(j).getTipo() == Token.TipoToken.SIGNO_MAS) { TempNodo.setTipo(Nodo.TipoNodo.POSITIVA); TempNodo.setID2(Nodo.Contador2); TempRegex.addNodo(TempNodo); } else if (ListaTokens.ElementAt(j).getTipo() == Token.TipoToken.SIGNO_ALTERNANCIA) { TempNodo.setTipo(Nodo.TipoNodo.ALTERNANCIA); TempNodo.setID2(Nodo.Contador2); TempRegex.addNodo(TempNodo); } else if (ListaTokens.ElementAt(j).getTipo() == Token.TipoToken.SIGNO_INTERROGACION) { TempNodo.setTipo(Nodo.TipoNodo.UNAOCERO); TempNodo.setID2(Nodo.Contador2); TempRegex.addNodo(TempNodo); } else if (ListaTokens.ElementAt(j).getTipo() == Token.TipoToken.ABRE_LLAVE) { j++; TempNodo.setTipo(Nodo.TipoNodo.TERMINAL); TempNodo.setID(Nodo.Contador); TempNodo.setTerminal(ListaTokens.ElementAt(j).getLexema()); TempNodo.setConjunto(ListaTokens.ElementAt(j).getLexema(), Conjuntos); j++; TempNodo.setID2(Nodo.Contador2); TempRegex.addNodo(TempNodo); } else if (ListaTokens.ElementAt(j).getTipo() == Token.TipoToken.PUNTO_COMA) { Expresiones.AddLast(TempRegex); i = j; break; } } Nodo.Contador = 1; Nodo.Contador2 = 1; } } } }
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(); }