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); }
public DataTable generadorNodosAFN(String nombre) { nodo nuevaCabeza = this.raiz.getIzquierda(); thompson Thompson = new thompson(); Thompson.recorridoPreorden(nuevaCabeza); Thompson.imprimirNodos(); Thompson.graficarAFN(nombre);; Recorridos r = new Recorridos(Thompson.getRaiz()); r.obtenerTerminales(); r.graficarAFD(nombre); return(r.tablaTrans()); }
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); }
public void setPrevio(nodo previo) { this.previo = previo; }
public void setDerecha(nodo derecha) { this.derecha = derecha; }
public void setIzquierda(nodo izquierda) { this.izquierda = izquierda; }
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 recorridoPreorden(nodo n) { preOrder(n); }
public LinkedList <token> escanear(String entrada) { nErrores = 0; entrada.ToLower(); entrada += "#"; Out = new LinkedList <token>(); Errores = new LinkedList <token>(); expresiones = new LinkedList <expresion>(); arboles = new LinkedList <metodoArbol> (); nodo n; for (int i = 0; i < entrada.Length; i++) { c = entrada.ElementAt(i); switch (estado) { case 0: auxL += entrada.ElementAt(i); if (Char.IsLetter(c)) { estado = 1; } else if (Char.IsDigit(c)) { estado = 2; } else { switch (c) { case '{': addtoken(token.Tipo.S_abrirLlaves); break; case '}': addtoken(token.Tipo.S_cerrarLlaves); break; case ',': addtoken(token.Tipo.S_coma); break; case ';': esConjunto = false; addtoken(token.Tipo.S_puntoComa); break; case '/': estado = 3; break; case '%': lexemas = true; addtoken(token.Tipo.S_porcentaje); break; case ':': addtoken(token.Tipo.S_dosPuntos); break; case '"': //addtoken(token.Tipo.S_comillas); estado = 4; break; case '<': estado = 5; break; case '\\': estado = 14; break; case '[': estado = 15; break; case '-': estado = 6; break; case '~': addtoken(token.Tipo.conj); break; default: if (EsSeparador(i, c, entrada.Length)) { estado = 0; auxL = ""; } else { Console.WriteLine("Caracter no reconcido" + c.ToString()); addErrortoken(token.Tipo.ERROR, c.ToString()); error = true; estado = 0; nErrores++; } break; } } break; case 1: if (Char.IsLetter(c)) { auxL += entrada.ElementAt(i); estado = 1; } else if (Char.IsDigit(c)) { auxL += entrada.ElementAt(i); estado = 1; } else { if (entrada.ElementAt(i + 1).Equals(':') || entrada.ElementAt(i + 2).Equals(':')) { pyc = true; } token.Tipo tipoA = verificarPalabra(); addtoken(tipoA); i--; } break; case 2: if (Char.IsLetter(c)) { auxL += entrada.ElementAt(i); estado = 1; } else if (Char.IsDigit(c)) { auxL += entrada.ElementAt(i); estado = 2; } else { addtoken(token.Tipo.Numero); i--; } break; case 3: if (!(c == 10 || c == 13 || c == 11 || i == entrada.Length - 1)) { auxL += entrada.ElementAt(i); } else { addtoken(token.Tipo.Comentario); i--; } break; case 4: if (!(c == '"')) { auxL += entrada.ElementAt(i); } else { auxL += entrada.ElementAt(i); addtoken(token.Tipo.Cadena); } break; case 5: if (c == '!') { auxL += entrada.ElementAt(i); estado = 12; } else { if (EsSeparador(i, c, entrada.Length)) { estado = 0; auxL = ""; } else { Console.WriteLine("Caracter no reconcido" + c); addErrortoken(token.Tipo.ERROR, c.ToString()); error = true; estado = 0; nErrores++; } } break; case 6: if (c == '-') { auxL += entrada.ElementAt(i); estado = 6; } else if (c == '>') { auxL += entrada.ElementAt(i); addtoken(token.Tipo.flechita); primUlt = 1; estado = 6; } else { if (esConjunto == true && lexemas == false) { //Def conjuntos i--; estado = 7; } else if (esConjunto == false && lexemas == true) { //Def Lexemas i--; estado = 8; } else { //Def expresiones i--; estado = 9; } break; } break; case 7: if (Char.IsLetter(c)) { auxL += entrada.ElementAt(i); estado = 7; } else if (Char.IsDigit(c)) { auxL += entrada.ElementAt(i); estado = 7; } else { switch (c) { case ',': auxL += entrada.ElementAt(i); estado = 7; break; case '~': auxL += entrada.ElementAt(i); estado = 7; break; case ';': addtoken(token.Tipo.conjunto); auxL += entrada.ElementAt(i); addtoken(token.Tipo.S_puntoComa); esConjunto = false; primUlt = 1; estado = 0; break; default: if (EsSeparador(i, c, entrada.Length)) { estado = 7; auxL = ""; } else { Console.WriteLine("Caracter no reconcido" + c); addErrortoken(token.Tipo.ERROR, c.ToString()); error = true; estado = 0; nErrores++; } break; } } break; case 8: if ((c == '"')) { estado = 13; } else { if (EsSeparador(i, c, entrada.Length)) { estado = 8; auxL = ""; } else { Console.WriteLine("Caracter no reconcido" + c); addErrortoken(token.Tipo.ERROR, c.ToString()); error = true; estado = 0; nErrores++; } } break; case 9: switch (c) { case '.': auxL += entrada.ElementAt(i); n = new nodo(auxL, false, false, false); expresiones.Last().getLista().AddLast(n); addtoken(token.Tipo.concatenar); estado = 9; break; case '*': auxL += entrada.ElementAt(i); n = new nodo(auxL, false, true, true); expresiones.Last().getLista().AddLast(n); addtoken(token.Tipo.ceroMas); estado = 9; break; case '+': auxL += entrada.ElementAt(i); n = new nodo(auxL, false, true, false); expresiones.Last().getLista().AddLast(n); addtoken(token.Tipo.unoMas); estado = 9; break; case '|': auxL += entrada.ElementAt(i); n = new nodo(auxL, false, false, false); expresiones.Last().getLista().AddLast(n); addtoken(token.Tipo.disyun); estado = 9; break; case '?': auxL += entrada.ElementAt(i); n = new nodo(auxL, false, true, true); expresiones.Last().getLista().AddLast(n); addtoken(token.Tipo.ceroUno); estado = 9; break; case '{': auxL += entrada.ElementAt(i); addtoken(token.Tipo.S_abrirLlaves); estado = 11; break; case '}': auxL += entrada.ElementAt(i); addtoken(token.Tipo.S_cerrarLlaves); estado = 11; break; case '"': estado = 10; break; case ';': auxL += entrada.ElementAt(i); addtoken(token.Tipo.S_puntoComa); estado = 0; break; default: if (EsSeparador(i, c, entrada.Length)) { estado = 9; auxL = ""; } else { auxL += entrada.ElementAt(i); Console.WriteLine("Caracter no reconcido" + c); addErrortoken(token.Tipo.ERROR, c.ToString()); error = true; estado = 0; nErrores++; } break; } break; case 10: if (!(c == '"')) { auxL += entrada.ElementAt(i); } else { n = new nodo(auxL, true, false, false); String t = ""; t += primUlt; primUlt++; n.setPrimeros(t); n.setUltimos(t); expresiones.Last().getLista().AddLast(n); addtoken(token.Tipo.Terminal); estado = 9; } break; case 11: if (!(c == '}')) { auxL += entrada.ElementAt(i); } else { n = new nodo(auxL, true, false, false); String t = ""; t += primUlt; primUlt++; n.setPrimeros(t); n.setUltimos(t); expresiones.Last().getLista().AddLast(n); addtoken(token.Tipo.Terminal); auxL += entrada.ElementAt(i); addtoken(token.Tipo.S_cerrarLlaves); estado = 9; } break; case 12: if (!(c == '!')) { auxL += entrada.ElementAt(i); } else if (i == entrada.Length) { break; } else { auxL += entrada.ElementAt(i); auxL += entrada.ElementAt(i + 1); addtoken(token.Tipo.Comentario); i += 2; } break; case 13: if (!(c == '"')) { auxL += entrada.ElementAt(i); } else { addtoken(token.Tipo.lexema); estado = 0; } break; case 14: if (c == 'n') { auxL += entrada.ElementAt(i); addtoken(token.Tipo.saltolinea); estado = 0; } else if (c == '\'') { auxL += entrada.ElementAt(i); addtoken(token.Tipo.comillasimple); estado = 0; } else if (c == '\"') { auxL += entrada.ElementAt(i); addtoken(token.Tipo.comilladoble); estado = 0; } else if (c == '\t') { auxL += entrada.ElementAt(i); addtoken(token.Tipo.tabulacion); estado = 0; } else { addtoken(token.Tipo.ERROR); estado = 0; } break; case 15: if (!(c == ':' && entrada.ElementAt(i + 1).Equals(']'))) { auxL += entrada.ElementAt(i); } else if (c == ':') { auxL = ""; } else { addtoken(token.Tipo.todo); estado = 0; } break; default: break; } /* public void imprimir() { * System.out.print(entrada); * }*/ } return(Out); }
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()); }
//string auxiliar = ""; public metodoArbol() { raiz = null; newNodos = new LinkedList <nodo>(); }