public LinkedList <string> validarExpresiones(LinkedList <Token> lTokens, LinkedList <LinkedList <Mueve> > lMueves,
                                                      LinkedList <Conjunto> lConjuntos, int fin, LinkedList <string> nombres)
        {
            expresiones = new LinkedList <string>();

            for (int i = fin; i < lTokens.Count; i++)
            {
                Token token = lTokens.ElementAt(i);
                if (token.getTipo() == Token.Tipo.ID)
                {
                    string nombre = token.getValor();
                    i     = i + 3;
                    token = lTokens.ElementAt(i);
                    bool agrego = false;
                    for (int j = 0; j < lMueves.Count; j++)
                    {
                        string cadena        = token.getValor();
                        string cadenaInicial = cadena;
                        if (lMueves.ElementAt(j).Count != 0 && nombres.ElementAt(j).Equals(nombre))
                        {
                            string estado           = lMueves.ElementAt(j).ElementAt(0).getEstado();;
                            bool   aceptacion       = false;
                            bool   aceptacionInicio = lMueves.ElementAt(j).ElementAt(0).getCerradura().getTransiciones().Contains("L");
                            for (int k = 0; k < lMueves.ElementAt(j).Count; k++)
                            {
                                Mueve  mueve    = lMueves.ElementAt(j).ElementAt(k);
                                int    size     = mueve.getEntrada().Length;
                                string caracter = "";
                                if (cadena.Length > 0)
                                {
                                    caracter = cadena[0].ToString();
                                }

                                if (estado == mueve.getEstado() && existeConjunto(lConjuntos, mueve.getEntrada(), caracter))
                                {
                                    string temporal = cadena;
                                    cadena = "";
                                    for (int r = 1; r < temporal.Length; r++)
                                    {
                                        cadena += temporal[r];
                                    }
                                    estado = mueve.getCerradura().getNombre();
                                    if (mueve.getCerradura().getTransiciones().Contains("L"))
                                    {
                                        aceptacion = true;
                                    }
                                    else
                                    {
                                        aceptacion = false;
                                    }
                                    k = 0;
                                }
                                else if (size <= cadena.Length && estado == mueve.getEstado())
                                {
                                    string comparacion = "";
                                    for (int t = 0; t < size; t++)
                                    {
                                        comparacion += cadena[t];
                                    }
                                    if (mueve.getEntrada() == comparacion)
                                    {
                                        estado = mueve.getCerradura().getNombre();
                                        string temporal = cadena;
                                        cadena = "";
                                        for (int x = size; x < temporal.Length; x++)
                                        {
                                            cadena += temporal[x];
                                        }
                                        k = 0;
                                        if (mueve.getCerradura().getTransiciones().Contains("L"))
                                        {
                                            aceptacion = true;
                                        }
                                        else
                                        {
                                            aceptacion = false;
                                        }
                                    }
                                }
                            }
                            if ((cadena == "" && aceptacion) || (cadenaInicial == "" && aceptacionInicio))
                            {
                                expresiones.AddLast(nombre + " es valida");
                                Console.WriteLine(nombre + " es valida");
                                agrego = true;
                            }
                        }
                    }
                    if (!agrego)
                    {
                        expresiones.AddLast(nombre + " no es valida");
                        Console.WriteLine(nombre + " no es valida");
                    }
                }
            }
            return(expresiones);
        }
예제 #2
0
        public LinkedList <Mueve> generarAFD(LinkedList <Transicion> transiciones)
        {
            cerraduras = new LinkedList <Cerradura>();
            mueves     = new LinkedList <Mueve>();

            Cerradura cerradura0 = new Cerradura();

            cerradura0.getEstados().AddLast("F");
            cerradura0.setTransiciones(generarCerradura(transiciones, cerradura0.getEstados()));
            cerradura0.getTransiciones().AddLast("F");
            cerraduras.AddLast(cerradura0);
            cerradura0.setNombre("0");
            int estado = 1;

            for (int i = 0; i < cerradura0.getTransiciones().Count(); i++)
            {
                Console.WriteLine(cerradura0.getTransiciones().ElementAt(i));
            }

            for (int i = 0; i < cerraduras.Count(); i++)
            {
                for (int j = 0; j < ArbolBinario.entradas.Count(); j++)
                {
                    LinkedList <string> m = new LinkedList <string>();
                    for (int k = 0; k < cerraduras.ElementAt(i).getTransiciones().Count(); k++)
                    {
                        m = generarMueve(transiciones, ArbolBinario.entradas.ElementAt(j),
                                         cerraduras.ElementAt(i).getTransiciones().ElementAt(k), m);
                    }

                    LinkedList <string> x = new LinkedList <string>();
                    x = generarCerradura(transiciones, m);
                    for (int o = 0; o < m.Count(); o++)
                    {
                        x.AddLast(m.ElementAt(o));
                    }
                    Cerradura cerradura = new Cerradura(m, x);
                    if (x.Count() != 0)
                    {
                        bool      bandera = true;
                        Cerradura temp    = new Cerradura();
                        for (int y = 0; y < cerraduras.Count(); y++)
                        {
                            HashSet <string> a1 = new HashSet <string>();
                            HashSet <string> a2 = new HashSet <string>();
                            for (int t = 0; t < cerraduras.ElementAt(y).getTransiciones().Count(); t++)
                            {
                                a1.Add(cerraduras.ElementAt(y).getTransiciones().ElementAt(t));
                            }

                            for (int t = 0; t < x.Count(); t++)
                            {
                                a2.Add(x.ElementAt(t));
                            }

                            if (a1.SetEquals(a2))
                            {
                                bandera = false;
                                temp    = cerraduras.ElementAt(y);
                            }
                        }
                        if (bandera)
                        {
                            Console.WriteLine("entro");
                            cerradura.setNombre("" + estado);
                            cerraduras.AddLast(cerradura);

                            Mueve mueve = new Mueve(cerradura, cerraduras.ElementAt(i).getNombre(), cerraduras.ElementAt(i).getNombre(), ArbolBinario.entradas.ElementAt(j));
                            estado++;
                            mueves.AddLast(mueve);
                        }
                        else
                        {
                            Console.WriteLine("salio");
                            Mueve mueve = new Mueve(temp, cerraduras.ElementAt(i).getNombre(), cerraduras.ElementAt(i).getNombre(), ArbolBinario.entradas.ElementAt(j));
                            mueves.AddLast(mueve);
                        }
                    }
                }
            }



            Console.WriteLine("-------------------------------------------------");
            cadena  = "";
            cadena += "digraph g{\n";
            cadena += "Graph" + "[label = \"AFD\"] ;\n";
            cadena += "rankdir=LR\n;";
            cadena += "N [shape = doublecircle, fontsize = 1; style = filled fillcolor=white,  fontcolor = white, color = white]; \n";
            cadena += "node [shape = circle; style = filled fillcolor=aquamarine, color = aquamarine]\n";
            if (cerraduras.ElementAt(0).getTransiciones().Contains("L"))
            {
                cadena += "0 [shape = doublecircle; style = filled fillcolor=aquamarine, color = aquamarine];";
            }
            else
            {
                cadena += "0 [shape = circle; style = filled fillcolor=aquamarine]; N->0;\n";
            }
            foreach (var item in mueves)
            {
                Console.WriteLine("Mueve de: " + item.getEstado() + " con: " + item.getEntrada() + " hacia: " + item.getCerradura().getNombre());

                if (item.getEntrada().Equals("\n"))
                {
                    cadena += item.getEstado() + "->" + item.getCerradura().getNombre() + "[label = \"\\\\n\" ];\n";
                }
                else if (item.getEntrada().Equals("\t"))
                {
                    cadena += item.getEstado() + "->" + item.getCerradura().getNombre() + "[label = \"\\\\t\" ];\n";
                }
                else if (item.getEntrada().Equals("\""))
                {
                    cadena += item.getEstado() + "->" + item.getCerradura().getNombre() + "[label = \"\\\"\" ];\n";
                }
                else
                {
                    cadena += item.getEstado() + "->" + item.getCerradura().getNombre() + "[label = \"" + item.getEntrada() + "\" ];\n";
                }
                if (item.getCerradura().getTransiciones().Contains("L"))
                {
                    cadena += item.getCerradura().getNombre() + " [shape = doublecircle; style = filled fillcolor=aquamarine, color = aquamarine];";
                }
            }
            Console.WriteLine("-------------------------------------------------");
            cadena += "}";
            Console.WriteLine(cadena);
            Console.WriteLine("-------------------------------------------------");
            Console.WriteLine("-------------------------------------------------");
            Console.WriteLine("-------------------------------------------------");
            tablaDeTransiciones();
            Console.WriteLine("-------------------------------------------------");
            Console.WriteLine("-------------------------------------------------");
            Console.WriteLine("-------------------------------------------------");

            return(mueves);
        }