Esempio n. 1
0
        private Mover makeMove(ArrayList estado, Nodo n)
        {
            Mover nuevo = new Mover();

            foreach (Nodo item in estado)
            {
                if (item.getDato() == n.getDato())
                {
                    nuevo.addEstado(item.getIzquierda().Index);
                }
            }
            for (int i = 0; i < mueves.Count; i++)
            {
                if (mueves.ElementAt(i).getEstados().Count == nuevo.getEstados().Count)
                {
                    bool iguales = true;
                    foreach (int el in mueves.ElementAt(i).getEstados())
                    {
                        if (!nuevo.getEstados().Contains(el))
                        {
                            iguales = false;
                            break;
                        }
                    }
                    if (iguales)
                    {
                        return(mueves.ElementAt(i));
                    }
                }
            }
            return(nuevo);
        }
Esempio n. 2
0
        private ArrayList transicionesEpsilon(ArrayList actual, Nodo n)
        {
            Nodo aux = n;

            if (n != null)
            {
                if (aux.getDato() == "epsilon")
                {
                    if (!actual.Contains(aux))
                    {
                        actual.Add(aux);
                    }
                    if (aux.visitaThompson == true)
                    {
                        return(actual);
                    }

                    if (aux.getIzquierda() != null)
                    {
                        actual.Add(aux.getIzquierda());
                        aux.visitaThompson = true;
                        actual             = transicionesEpsilon(actual, aux.getIzquierda());
                    }
                    if (aux.getDerecha() != null)
                    {
                        actual.Add(aux.getDerecha());
                        aux.visitaThompson = true;

                        actual = transicionesEpsilon(actual, aux.getDerecha());
                    }
                }
            }

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