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