private void enviarNodo(Nodo aux) { value = ""; if (aux != null) { if (!aux.isVisitado()) { if (aux.getTipo().CompareTo("transicion") == 0) { value = aux.Index + " -> " + aux.getIzquierda().Index + "[label=\"" + aux.getDato() + "\"];\n"; grafo.Append(value); aux.visitar(); enviarNodo(aux.getIzquierda()); } else if (aux.getTipo().CompareTo("transiciones") == 0) { value = aux.Index + " -> " + aux.getIzquierda().Index + "[label=\"" + aux.getDato() + "\"];\n"; grafo.Append(value); value = aux.Index + " -> " + aux.getDerecha().Index + "[label=\"" + aux.getDato() + "\"];\n"; grafo.Append(value); aux.visitar(); enviarNodo(aux.getIzquierda()); enviarNodo(aux.getDerecha()); } else if (aux.getTipo().CompareTo("asignable") == 0) { aux.visitar(); lastNode = aux; } } } }
private ArrayList transicionesEpsilon(ArrayList actual, Nodo n) { Nodo aux = n; if (n != null) { if (aux.getDato() == "epsilon") { if (!actual.Contains(aux)) { actual.Add(aux); } if (aux.visitaThompson == true) { return(actual); } if (aux.getIzquierda() != null) { actual.Add(aux.getIzquierda()); aux.visitaThompson = true; actual = transicionesEpsilon(actual, aux.getIzquierda()); } if (aux.getDerecha() != null) { actual.Add(aux.getDerecha()); aux.visitaThompson = true; actual = transicionesEpsilon(actual, aux.getDerecha()); } } } return(actual); }
private Nodo changeIndex(Nodo n) { if (n != null) { if (n.getTipo() == "transicion") { contador++; n = clonar(contador, n); n.setIzquierda(changeIndex(n.getIzquierda())); } else if (n.getTipo() == "transiciones") { contador++; n = clonar(contador, n); n.setIzquierda(changeIndex(n.getIzquierda())); n.setDerecha(changeIndex(n.getDerecha())); } else if (n.getTipo() == "asignable") { //if (!n.clonado) //{ contador++; n = clonar(contador + 5, n); //} } } return(n); }
private Nodo concatenar(Nodo n, Nodo n1) { Nodo aux1 = n; Nodo aux2 = n1; while (aux1.getTipo() != "asignable" && aux1.getTipo() != "operando") { if (aux1.getTipo() == "transiciones") { aux1 = aux1.getDerecha(); } else { aux1 = aux1.getIzquierda(); } } if (aux1.getTipo() == "operando") { aux1.setTipo("transicion"); aux1.setIzquierda(aux2); } else if (aux1.getTipo() == "asignable") { aux1.changeNodo(aux2); } contador++; Nodo n2 = new Nodo(contador, "", "asignable"); while (aux1.getTipo() != "asignable" && aux1.getTipo() != "operando") { if (aux1.getTipo() == "transiciones") { aux1 = aux1.getDerecha(); } else { aux1 = aux1.getIzquierda(); } } if (aux1.getTipo() == "operando") { aux1.setTipo("transicion"); aux1.setIzquierda(n2); } return(n); }
public Nodo clonar(int index, Nodo n) { Nodo nuevo = new Nodo(index, n.getDato(), n.getTipo()); nuevo.setIzquierda(n.getIzquierda()); nuevo.setDerecha(n.getDerecha()); nuevo.clonar(); return(nuevo); }
public void changeNodo(Nodo n) { this.dato = n.getDato(); izquierda = n.getIzquierda(); derecha = n.getDerecha(); this.tipo = n.getTipo(); visitado = n.isVisitado(); this.Index = n.Index; }
private Nodo cerraduraKleene(Nodo n) { Nodo nuevoN = n; contador++; Nodo n1 = new Nodo(contador, "epsilon", "transiciones"); n1.setIzquierda(nuevoN); if (nuevoN.getTipo() == "transiciones" || nuevoN.getTipo() == "transicion") { while (nuevoN.getTipo() != "asignable") { if (nuevoN.getTipo() == "transiciones") { nuevoN = nuevoN.getDerecha(); } else { nuevoN = nuevoN.getIzquierda(); } } } else if (nuevoN.getTipo() == "operando") { contador++; nuevoN.Index = contador; } contador++; Nodo n2 = new Nodo(contador, "epsilon", "transiciones"); contador++; Nodo n3 = new Nodo(contador, "", "asignable"); if (nuevoN.getTipo() == "operando") { nuevoN.setTipo("transicion"); nuevoN.setIzquierda(n2); n2.setIzquierda(nuevoN); n2.setDerecha(n3); } else if (nuevoN.getTipo() == "asignable") { nuevoN.changeNodo(n2); nuevoN.setIzquierda(n); nuevoN.setDerecha(n3); } n1.setDerecha(n3); return(n1); }
private Nodo findNode(Nodo aux, int index) { if (aux == null) { return(null); } else if (aux.Index == index) { aux.visitaThompson = true; return(aux); } else if (aux.getTipo().CompareTo("transicion") == 0 && !aux.visitaThompson) { aux.visitaThompson = true; return(findNode(aux.getIzquierda(), index)); } else if (aux.getTipo().CompareTo("transiciones") == 0 && !aux.visitaThompson) { Nodo aux2; Nodo aux3; aux.visitaThompson = true; aux2 = findNode(aux.getIzquierda(), index); aux3 = findNode(aux.getDerecha(), index); if (aux2 != null && aux2.Index == index) { return(aux2); } else if (aux3 != null && aux3.Index == index) { return(aux3); } else { return(null); } } else if (aux.getTipo().CompareTo("asignable") == 0) { aux.visitaThompson = true; return(null); } else { return(null); } }
private void desVisitarTodo(Nodo aux) { if (aux != null) { if (aux.visitaThompson) { if (aux.getTipo().CompareTo("transicion") == 0) { aux.visitaThompson = false; desVisitarTodo(aux.getIzquierda()); } else if (aux.getTipo().CompareTo("transiciones") == 0) { aux.visitaThompson = false; desVisitarTodo(aux.getIzquierda()); desVisitarTodo(aux.getDerecha()); } else if (aux.getTipo().CompareTo("asignable") == 0) { aux.visitaThompson = false; } } } }
private Nodo disyuncion(Nodo n, Nodo n1) { contador++; Nodo inicio = new Nodo(contador, "epsilon", "transiciones"); Nodo aux1 = n; Nodo aux2 = n1; inicio.setIzquierda(aux1); inicio.setDerecha(aux2); contador++; Nodo fin = new Nodo(contador, "", "asignable"); contador++; Nodo aux3 = new Nodo(contador, "epsilon", "transicion"); contador++; Nodo aux4 = new Nodo(contador, "epsilon", "transicion"); while (aux1.getTipo() != "asignable" && aux1.getTipo() != "operando") { if (aux1.getTipo() == "transiciones") { aux1 = aux1.getDerecha(); } else { aux1 = aux1.getIzquierda(); } } if (aux1.getTipo() == "operando") { aux1.setTipo("transicion"); aux1.setIzquierda(aux3); aux3.setIzquierda(fin); } else if (aux1.getTipo() == "asignable") { aux1.changeNodo(aux3); aux1.setIzquierda(fin); } // while (aux2.getTipo() != "asignable" && aux2.getTipo() != "operando") { if (aux2.getTipo() == "transiciones") { aux2 = aux2.getDerecha(); } else { aux2 = aux2.getIzquierda(); } } if (aux2.getTipo() == "operando") { aux2.setTipo("transicion"); aux2.setIzquierda(aux4); aux4.setIzquierda(fin); } else if (aux2.getTipo() == "asignable") { aux2.changeNodo(aux4); aux2.setIzquierda(fin); } return(inicio); }
private void metodoThompson() { if (nodos.Count > 1) { Nodo aux1 = nodos.Pop(); Nodo aux2 = nodos.Pop(); if (aux2.getTipo().CompareTo("unario") == 0) { if (aux2.getDato().CompareTo("?") == 0) { contador++; aux2 = disyuncion(aux1, new Nodo(contador, "epsilon", "operando")); nodos.Push(aux2); } else if (aux2.getDato().CompareTo("*") == 0) { aux2 = cerraduraKleene(aux1); nodos.Push(aux2); } else if (aux2.getDato().CompareTo("+") == 0) { contador++; Nodo nuevo = new Nodo(contador, aux1.getDato(), aux1.getTipo()); nuevo.setIzquierda(aux1.getIzquierda()); nuevo.setDerecha(aux1.getDerecha()); nuevo = changeIndex(nuevo); aux2 = concatenar(aux1, cerraduraKleene(nuevo)); nodos.Push(aux2); } } else if ((aux2.getTipo() != "operador") && (aux1.getTipo() != "operador")) { Nodo aux3 = nodos.Pop(); if (aux3.getTipo() == "operador") { if (aux3.getDato().CompareTo(".") == 0) { aux3 = concatenar(aux2, aux1); nodos.Push(aux3); } else if (aux3.getDato().CompareTo("|") == 0) { aux3 = disyuncion(aux2, aux1); nodos.Push(aux3); } } else if (aux3.getTipo().CompareTo("unario") == 0) { pilaAuxilar.Push(aux1); if (aux3.getDato().CompareTo("?") == 0) { contador++; aux3 = disyuncion(aux2, new Nodo(contador, "epsilon", "operando")); nodos.Push(aux3); } else if (aux3.getDato().CompareTo("*") == 0) { aux3 = cerraduraKleene(aux2); nodos.Push(aux3); } else if (aux3.getDato().CompareTo("+") == 0) { Nodo nuevo = new Nodo(contador, aux2.getDato(), aux2.getTipo()); nuevo.setIzquierda(aux2.getIzquierda()); nuevo.setDerecha(aux2.getDerecha()); nuevo = changeIndex(nuevo); aux3 = concatenar(aux2, cerraduraKleene(nuevo)); nodos.Push(aux3); } } else if (aux3.getTipo() == "transicion" || aux3.getTipo() == "transiciones" || aux3.getTipo() == "operando") { pilaAuxilar.Push(aux1); aux1 = aux2; aux2 = aux3; aux3 = nodos.Pop(); while (aux3.getTipo() != "operador" && aux3.getTipo() != "unario") { pilaAuxilar.Push(aux1); aux1 = aux2; aux2 = aux3; aux3 = nodos.Pop(); } if (aux3.getTipo() == "unario") { pilaAuxilar.Push(aux1); } if (aux3.getDato().CompareTo("?") == 0) { contador++; aux3 = disyuncion(aux2, new Nodo(contador, "epsilon", "operando")); nodos.Push(aux3); } else if (aux3.getDato().CompareTo("*") == 0) { aux3 = cerraduraKleene(aux2); nodos.Push(aux3); } else if (aux3.getDato().CompareTo("+") == 0) { Nodo nuevo = new Nodo(contador, aux2.getDato(), aux2.getTipo()); nuevo.setIzquierda(aux2.getIzquierda()); nuevo.setDerecha(aux2.getDerecha()); nuevo = changeIndex(nuevo); aux3 = concatenar(aux2, cerraduraKleene(nuevo)); nodos.Push(aux3); } else if (aux3.getDato().CompareTo(".") == 0) { aux3 = concatenar(aux2, aux1); nodos.Push(aux3); } else if (aux3.getDato().CompareTo("|") == 0) { aux3 = disyuncion(aux2, aux1); nodos.Push(aux3); } } while (pilaAuxilar.Count > 0) { nodos.Push(pilaAuxilar.Pop()); } } metodoThompson(); } else { try { raiz = nodos.Pop(); } catch (InvalidOperationException) { Console.WriteLine("error"); } } }