Esempio n. 1
0
 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;
             }
         }
     }
 }
Esempio n. 2
0
 private Nodo changeIndex(Nodo n)
 {
     if (n != null)
     {
         if (n.getTipo() == "transicion")
         {
             contador++;
             n = clonar(contador, n);
             n.setIzquierda(changeIndex(n.getIzquierda()));
         }
         else if (n.getTipo() == "transiciones")
         {
             contador++;
             n = clonar(contador, n);
             n.setIzquierda(changeIndex(n.getIzquierda()));
             n.setDerecha(changeIndex(n.getDerecha()));
         }
         else if (n.getTipo() == "asignable")
         {
             //if (!n.clonado)
             //{
             contador++;
             n = clonar(contador + 5, n);
             //}
         }
     }
     return(n);
 }
Esempio n. 3
0
 private Nodo findNode(Nodo aux, int index)
 {
     if (aux == null)
     {
         return(null);
     }
     else if (aux.Index == index)
     {
         aux.visitaThompson = true;
         return(aux);
     }
     else if (aux.getTipo().CompareTo("transicion") == 0 && !aux.visitaThompson)
     {
         aux.visitaThompson = true;
         return(findNode(aux.getIzquierda(), index));
     }
     else if (aux.getTipo().CompareTo("transiciones") == 0 && !aux.visitaThompson)
     {
         Nodo aux2;
         Nodo aux3;
         aux.visitaThompson = true;
         aux2 = findNode(aux.getIzquierda(), index);
         aux3 = findNode(aux.getDerecha(), index);
         if (aux2 != null && aux2.Index == index)
         {
             return(aux2);
         }
         else if (aux3 != null && aux3.Index == index)
         {
             return(aux3);
         }
         else
         {
             return(null);
         }
     }
     else if (aux.getTipo().CompareTo("asignable") == 0)
     {
         aux.visitaThompson = true;
         return(null);
     }
     else
     {
         return(null);
     }
 }
Esempio n. 4
0
        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;
 }
Esempio n. 6
0
        private Nodo concatenar(Nodo n, Nodo n1)
        {
            Nodo aux1 = n;
            Nodo aux2 = n1;

            while (aux1.getTipo() != "asignable" && aux1.getTipo() != "operando")
            {
                if (aux1.getTipo() == "transiciones")
                {
                    aux1 = aux1.getDerecha();
                }
                else
                {
                    aux1 = aux1.getIzquierda();
                }
            }
            if (aux1.getTipo() == "operando")
            {
                aux1.setTipo("transicion");
                aux1.setIzquierda(aux2);
            }
            else if (aux1.getTipo() == "asignable")
            {
                aux1.changeNodo(aux2);
            }
            contador++;
            Nodo n2 = new Nodo(contador, "", "asignable");

            while (aux1.getTipo() != "asignable" && aux1.getTipo() != "operando")
            {
                if (aux1.getTipo() == "transiciones")
                {
                    aux1 = aux1.getDerecha();
                }
                else
                {
                    aux1 = aux1.getIzquierda();
                }
            }
            if (aux1.getTipo() == "operando")
            {
                aux1.setTipo("transicion");
                aux1.setIzquierda(n2);
            }
            return(n);
        }
Esempio n. 7
0
        private Nodo cerraduraKleene(Nodo n)
        {
            Nodo nuevoN = n;

            contador++;
            Nodo n1 = new Nodo(contador, "epsilon", "transiciones");

            n1.setIzquierda(nuevoN);
            if (nuevoN.getTipo() == "transiciones" || nuevoN.getTipo() == "transicion")
            {
                while (nuevoN.getTipo() != "asignable")
                {
                    if (nuevoN.getTipo() == "transiciones")
                    {
                        nuevoN = nuevoN.getDerecha();
                    }
                    else
                    {
                        nuevoN = nuevoN.getIzquierda();
                    }
                }
            }
            else if (nuevoN.getTipo() == "operando")
            {
                contador++;
                nuevoN.Index = contador;
            }

            contador++;
            Nodo n2 = new Nodo(contador, "epsilon", "transiciones");

            contador++;
            Nodo n3 = new Nodo(contador, "", "asignable");

            if (nuevoN.getTipo() == "operando")
            {
                nuevoN.setTipo("transicion");
                nuevoN.setIzquierda(n2);
                n2.setIzquierda(nuevoN);
                n2.setDerecha(n3);
            }
            else if (nuevoN.getTipo() == "asignable")
            {
                nuevoN.changeNodo(n2);
                nuevoN.setIzquierda(n);
                nuevoN.setDerecha(n3);
            }

            n1.setDerecha(n3);

            return(n1);
        }
Esempio n. 8
0
 private void desVisitarTodo(Nodo aux)
 {
     if (aux != null)
     {
         if (aux.visitaThompson)
         {
             if (aux.getTipo().CompareTo("transicion") == 0)
             {
                 aux.visitaThompson = false;
                 desVisitarTodo(aux.getIzquierda());
             }
             else if (aux.getTipo().CompareTo("transiciones") == 0)
             {
                 aux.visitaThompson = false;
                 desVisitarTodo(aux.getIzquierda());
                 desVisitarTodo(aux.getDerecha());
             }
             else if (aux.getTipo().CompareTo("asignable") == 0)
             {
                 aux.visitaThompson = false;
             }
         }
     }
 }
Esempio n. 9
0
        private Nodo disyuncion(Nodo n, Nodo n1)
        {
            contador++;
            Nodo inicio = new Nodo(contador, "epsilon", "transiciones");
            Nodo aux1   = n;
            Nodo aux2   = n1;

            inicio.setIzquierda(aux1);
            inicio.setDerecha(aux2);

            contador++;
            Nodo fin = new Nodo(contador, "", "asignable");

            contador++;
            Nodo aux3 = new Nodo(contador, "epsilon", "transicion");

            contador++;
            Nodo aux4 = new Nodo(contador, "epsilon", "transicion");

            while (aux1.getTipo() != "asignable" && aux1.getTipo() != "operando")
            {
                if (aux1.getTipo() == "transiciones")
                {
                    aux1 = aux1.getDerecha();
                }
                else
                {
                    aux1 = aux1.getIzquierda();
                }
            }
            if (aux1.getTipo() == "operando")
            {
                aux1.setTipo("transicion");
                aux1.setIzquierda(aux3);
                aux3.setIzquierda(fin);
            }
            else if (aux1.getTipo() == "asignable")
            {
                aux1.changeNodo(aux3);
                aux1.setIzquierda(fin);
            }
            //

            while (aux2.getTipo() != "asignable" && aux2.getTipo() != "operando")
            {
                if (aux2.getTipo() == "transiciones")
                {
                    aux2 = aux2.getDerecha();
                }
                else
                {
                    aux2 = aux2.getIzquierda();
                }
            }
            if (aux2.getTipo() == "operando")
            {
                aux2.setTipo("transicion");
                aux2.setIzquierda(aux4);
                aux4.setIzquierda(fin);
            }
            else if (aux2.getTipo() == "asignable")
            {
                aux2.changeNodo(aux4);
                aux2.setIzquierda(fin);
            }

            return(inicio);
        }
Esempio n. 10
0
        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");
                }
            }
        }