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);
        }
Esempio n. 3
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);
        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());
        }