private Mover makeMove(ArrayList estado, Nodo n) { Mover nuevo = new Mover(); foreach (Nodo item in estado) { if (item.getDato() == n.getDato()) { nuevo.addEstado(item.getIzquierda().Index); } } for (int i = 0; i < mueves.Count; i++) { if (mueves.ElementAt(i).getEstados().Count == nuevo.getEstados().Count) { bool iguales = true; foreach (int el in mueves.ElementAt(i).getEstados()) { if (!nuevo.getEstados().Contains(el)) { iguales = false; break; } } if (iguales) { return(mueves.ElementAt(i)); } } } return(nuevo); }
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); }
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 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 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"); } } }