string escribirArbol(nodo n) { string nodos; if (n.getIzquierda() == null && n.getDerecha() == null) { nodos = "nodo" + n.getId() + " [ label =\"" + n.getValor() + "\"];\n"; } else { nodos = "nodo" + n.getId() + " [ label =\"" + n.getValor() + "\"];\n"; } if (n.getIzquierda() != null) { nodos = nodos + escribirArbol(n.getIzquierda()) + "nodo" + n.getId() + "->nodo" + n.getIzquierda().getId() + "\n"; } if (n.getDerecha() != null) { nodos = nodos + escribirArbol(n.getDerecha()) + "nodo" + n.getId() + "->nodo" + n.getDerecha().getId() + "\n"; } nodos += "nodo" + raiz.getId() + " [ label =\"" + raiz.getValor() + "\"];\n"; return(nodos); }
nodo duplicar(nodo dupl) { if (dupl == null) { return(dupl); } nodo n = dupl; dupl = new nodo("", false, false, false); dupl.setValor(n.getValor()); dupl.setEsTerminal(n.getEsTerminal()); dupl.setUnitario(n.getUnitario()); dupl.setAnulable(n.getAnulable()); dupl.setIzquierda(duplicar(n.getIzquierda())); dupl.setDerecha(duplicar(n.getDerecha())); return(dupl); }
private void preOrder(nodo n) { if (n == null) { return; } preOrder(n.getIzquierda()); preOrder(n.getDerecha()); if (n.getEsTerminal() == false && n.getUnitario() == false) // | o . o { if (n.getValor().Equals(".")) { Console.WriteLine(n.getIzquierda().getEsTerminal()); Console.WriteLine(n.getDerecha().getEsTerminal()); if (iniciales.FirstOrDefault() != null) { /**/ if (n.getIzquierda().getEsTerminal() == true && n.getDerecha().getEsTerminal() == false) { Console.WriteLine("izquierda t ."); nodoThompson c1 = terminales.Pop(); nodoThompson c2 = iniciales.Pop(); /**/ Console.WriteLine(c1.getValorTransicion()); Console.WriteLine(c2.getValorTransicion()); this.raiz = c1; c1.setArriba(c2); iniciales.Push(c1); if (this.raiz == null) { this.raiz = c1; } } else if (n.getDerecha().getEsTerminal() == true && n.getIzquierda().getEsTerminal() == false) { Console.WriteLine("derecha t ."); nodoThompson c2 = terminales.Pop(); nodoThompson c1 = iniciales.Pop(); /**/ Console.WriteLine(c2.getValorTransicion()); Console.WriteLine(c1.getValorTransicion()); this.raiz = c1; iniciales.Push(c1); while (c1.getArriba() != null || c1.getValorTransicion() != null) { c1 = c1.getArriba(); } c1.setArriba(c2); c1.setValorTransicion(c2.getValorTransicion()); c2.setValorTransicion(null); } else if (n.getIzquierda().getEsTerminal() == false && n.getDerecha().getEsTerminal() == false) { Console.WriteLine("ninguno t ."); nodoThompson c2 = iniciales.Pop(); nodoThompson c1 = iniciales.Pop(); /**/ this.raiz = c1; iniciales.Push(c1); Console.WriteLine(c2.getValorTransicion()); Console.WriteLine(c1.getValorTransicion()); while (c1.getArriba() != null || c1.getValorTransicion() != null) { c1 = c1.getArriba(); } c1.setValorTransicion(c2.getValorTransicion()); c1.setArriba(c2.getArriba()); if (c2.getAbajo() != null) { c1.setAbajo(c2.getAbajo()); } c2.setValorTransicion(null); } else { Console.WriteLine("ambos t ."); nodoThompson c2 = terminales.Pop(); nodoThompson c1 = terminales.Pop(); /**/ Console.WriteLine(c2.getValorTransicion()); Console.WriteLine(c1.getValorTransicion()); nodoThompson c3 = new nodoThompson(null, contadorNodos); contadorNodos++; if (this.raiz == null) { this.raiz = c1; } c1.setArriba(c2); c2.setArriba(c3); iniciales.Push(c1); } } else { Console.WriteLine("ambos t ."); nodoThompson c2 = terminales.Pop(); nodoThompson c1 = terminales.Pop(); /**/ Console.WriteLine(c2.getValorTransicion()); Console.WriteLine(c1.getValorTransicion()); nodoThompson c3 = new nodoThompson(null, contadorNodos); contadorNodos++; if (this.raiz == null) { this.raiz = c1; } c1.setArriba(c2); c2.setArriba(c3); iniciales.Push(c1); } } else if (n.getValor().Equals("|")) { if (iniciales.FirstOrDefault() != null) { if (n.getIzquierda().getEsTerminal() == true && n.getDerecha().getEsTerminal() == false) { nodoThompson c2 = iniciales.Pop(); nodoThompson c1 = terminales.Pop(); nodoThompson c3 = new nodoThompson("ε", contadorNodos); contadorNodos++; c1.setId(contadorNodos); contadorNodos++; nodoThompson c4 = new nodoThompson("ε", contadorNodos); contadorNodos++; nodoThompson c6 = new nodoThompson(null, contadorNodos); contadorNodos++; c3.setArriba(c1); c1.setArriba(c4); c4.setArriba(c6); c3.setAbajo(c2); while (c2.getArriba() != null || c2.getValorTransicion() != null) { c2 = c2.getArriba(); } c2.setValorTransicion("ε"); c2.setArriba(c6); /**/ Console.WriteLine("izquierda t |"); Console.WriteLine(c2.getValorTransicion()); Console.WriteLine(c1.getValorTransicion()); iniciales.Push(c3); this.raiz = c3; } else if (n.getDerecha().getEsTerminal() == true && n.getIzquierda().getEsTerminal() == false) { nodoThompson c1 = iniciales.Pop(); nodoThompson c2 = terminales.Pop(); nodoThompson c3 = new nodoThompson("ε", contadorNodos); contadorNodos++; c2.setId(contadorNodos); contadorNodos++; nodoThompson c5 = new nodoThompson("ε", contadorNodos); contadorNodos++; nodoThompson c6 = new nodoThompson(null, contadorNodos); contadorNodos++; c3.setAbajo(c2); c2.setArriba(c5); c5.setArriba(c6); c3.setArriba(c1); while (c1.getArriba() != null || c1.getValorTransicion() != null) { c1 = c1.getArriba(); } c1.setValorTransicion("ε"); c1.setArriba(c6); /**/ Console.WriteLine("derecha t |"); Console.WriteLine(c2.getValorTransicion()); Console.WriteLine(c1.getValorTransicion()); iniciales.Push(c3); this.raiz = c3; } else if (n.getIzquierda().getEsTerminal() == false && n.getDerecha().getEsTerminal() == false) { nodoThompson c2 = iniciales.Pop(); nodoThompson c1 = iniciales.Pop(); nodoThompson c3 = new nodoThompson("ε", contadorNodos); contadorNodos++; nodoThompson c6 = new nodoThompson(null, contadorNodos); contadorNodos++; c3.setArriba(c1); while (c1.getArriba() != null || c1.getValorTransicion() != null) { c1 = c1.getArriba(); } c1.setValorTransicion("ε"); c1.setArriba(c6); c3.setAbajo(c2); while (c2.getArriba() != null || c2.getValorTransicion() != null) { c2 = c2.getArriba(); } c2.setValorTransicion("ε"); c2.setArriba(c6); /**/ Console.WriteLine("ninguno t |"); Console.WriteLine(c2.getValorTransicion()); Console.WriteLine(c1.getValorTransicion()); iniciales.Push(c3); this.raiz = c3; } else { nodoThompson c2 = terminales.Pop(); nodoThompson c1 = terminales.Pop(); contadorNodos = c1.getId(); nodoThompson c3 = new nodoThompson("ε", contadorNodos); contadorNodos++; c1.setId(contadorNodos); contadorNodos++; nodoThompson c4 = new nodoThompson("ε", contadorNodos); contadorNodos++; nodoThompson c6 = new nodoThompson(null, contadorNodos); contadorNodos++; c2.setId(contadorNodos); contadorNodos++; nodoThompson c5 = new nodoThompson("ε", contadorNodos); contadorNodos++; c3.setArriba(c1); c1.setArriba(c4); c4.setArriba(c6); c3.setAbajo(c2); c2.setArriba(c5); c5.setArriba(c6); /**/ Console.WriteLine("ambos t |"); Console.WriteLine(c2.getValorTransicion()); Console.WriteLine(c1.getValorTransicion()); iniciales.Push(c3); if (this.raiz == null) { this.raiz = c3; } } } else { nodoThompson c2 = terminales.Pop(); nodoThompson c1 = terminales.Pop(); contadorNodos = c1.getId(); nodoThompson c3 = new nodoThompson("ε", contadorNodos); contadorNodos++; c1.setId(contadorNodos); contadorNodos++; nodoThompson c4 = new nodoThompson("ε", contadorNodos); contadorNodos++; nodoThompson c6 = new nodoThompson(null, contadorNodos); contadorNodos++; c2.setId(contadorNodos); contadorNodos++; nodoThompson c5 = new nodoThompson("ε", contadorNodos); contadorNodos++; c3.setArriba(c1); c1.setArriba(c4); c4.setArriba(c6); c3.setAbajo(c2); c2.setArriba(c5); c5.setArriba(c6);
public void genArbol(LinkedList <nodo> nodos) { //ε nodo last = new nodo("#", true, false, false); int idt; idt = Int32.Parse(nodos.Last().getPrimeros()); last.setPrimeros((idt + 1).ToString()); last.setUltimos((idt + 1).ToString()); nodos.AddLast(last); this.raiz = new nodo(".", false, false, false); newNodos.AddFirst(this.raiz); nodo aux = this.raiz; nodo aux2 = nodos.First(); bool esDerecha = false; while ((nodos.FirstOrDefault() != null)) { if (esDerecha == false) { if (aux.getEsTerminal() == false) { aux.setIzquierda(aux2); aux.getIzquierda().setPrevio(aux); aux = aux.getIzquierda(); nodos.RemoveFirst(); if (!(nodos.FirstOrDefault() == null)) { aux2 = nodos.First(); } } else { while (aux.getPrevio().getUnitario() || aux.getPrevio().getDerecha() != null) { aux = aux.getPrevio(); } aux.getPrevio().setDerecha(aux2); aux.getPrevio().getDerecha().setPrevio(aux.getPrevio()); aux = aux.getPrevio().getDerecha(); nodos.RemoveFirst(); if (!(nodos.FirstOrDefault() == null)) { aux2 = nodos.First(); } esDerecha = true; } } else { if (aux.getEsTerminal() == true) { do { aux = aux.getPrevio(); } while ((aux.getDerecha() != null && aux.getUnitario() == false) || (aux.getDerecha() == null && aux.getUnitario() == true)); esDerecha = false; aux.setDerecha(aux2); aux.getDerecha().setPrevio(aux); aux = aux.getDerecha(); nodos.RemoveFirst(); if (!(nodos.FirstOrDefault() == null)) { aux2 = nodos.First(); } } else { aux.setIzquierda(aux2); aux.getIzquierda().setPrevio(aux); aux = aux.getIzquierda(); nodos.RemoveFirst(); if (!(nodos.FirstOrDefault() == null)) { aux2 = nodos.First(); } esDerecha = false; } } } }
private void transform(nodo n) { if (n == null) { return; } //Console.WriteLine(n.getValor() + n.getUnitario() + n.getEsTerminal()); if (n.getEsTerminal() == false && n.getUnitario() == true) // * o + o ? { nodo izquierdaT = n.getIzquierda(); nodo cabezaT = n.getPrevio(); Console.WriteLine(cabezaT.getValor()); Console.WriteLine(izquierdaT.getValor()); if (n.getValor().Equals("?")) { nodo nuevo = new nodo("|", false, false, false); nodo derecha = new nodo("epsilon", true, false, false); nuevo.setIzquierda(izquierdaT); nuevo.setDerecha(derecha); if (cabezaT.getIzquierda() == n) { cabezaT.setIzquierda(nuevo); } else if (cabezaT.getDerecha() == n) { cabezaT.setDerecha(nuevo); } n.setIzquierda(null); } else if (n.getValor().Equals("+")) { nodo nuevo1 = new nodo(".", false, false, false); nodo nuevo2 = new nodo("*", false, true, false); nuevo1.setIzquierda(izquierdaT); nuevo1.setDerecha(nuevo2); nuevo2.setIzquierda(duplicar(n.getIzquierda())); if (cabezaT.getIzquierda() == n) { cabezaT.setIzquierda(nuevo1); } else if (cabezaT.getDerecha() == n) { cabezaT.setDerecha(nuevo1); } n.setIzquierda(null); } } transform(n.getIzquierda()); transform(n.getDerecha()); }