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;
 }
예제 #7
0
        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);
예제 #8
0
 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>();
        }