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