コード例 #1
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);
        }
コード例 #2
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");
                }
            }
        }