Esempio n. 1
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. 2
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. 3
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. 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);
        }
Esempio n. 5
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. 6
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");
                }
            }
        }