private bool Optimizar(List <string> pila)
        {
            int terminales = 0;


            for (int i = 0; i < pila.Count; i++)
            {
                for (int j = 0; j < gramatica.GetTerminales().Count; j++)
                {
                    if (pila[i].Equals(gramatica.GetTerminales()[j]))
                    {
                        ++terminales;

                        if (cadena.Length < terminales)
                        {
                            return(false);
                        }

                        break;
                    }
                }
            }

            for (int i = 0; i < listaTerminales.Count; i++)
            {
                int conteo = 0;

                for (int j = 0; j < cadena.Length; j++)
                {
                    if (cadena[j].ToString().Equals(listaTerminales[i]))
                    {
                        conteo++;
                    }
                }

                if (conteo > listaNumeroTerminales[i])
                {
                    return(false);
                }
            }


            return(true);
        }
        public void ConvertirGramaticaAutomata()
        {
            List <string> noTerminales     = gramatica.GetNoTerminales();
            List <string> terminales       = gramatica.GetTerminales();
            string        noTerminalActual = "";

            Regla regla = new Regla("q0", "#", "Z", "q1", gramatica.GetSimboloInicial() + "Z");

            reglas.Add(regla);

            for (int i = 0; i < gramatica.GetNoTerminales().Count; i++)
            {
                noTerminalActual = noTerminales[i].ToString();

                //Para cada regla variable con no terminales
                for (int j = 0; j < gramatica.GetProducciones().Count; j++)
                {
                    if (noTerminalActual.Equals(gramatica.GetProducciones()[j].GetLadoIzquierdo().ToString()))
                    {
                        regla = new Regla("q1", "#", noTerminalActual, "q1", gramatica.GetProducciones()[j].GetLadoDerecho().ToString());
                        reglas.Add(regla);
                    }
                    else
                    {
                        continue;
                    }
                }
            }

            //Para cada terminal
            for (int i = 0; i < terminales.Count; i++)
            {
                regla = new Regla("q1", terminales[i].ToString(), terminales[i].ToString(), "q1", "#");
                reglas.Add(regla);
            }

            regla = new Regla("q1", "#", "Z", "q2", "Z");
            reglas.Add(regla);
        }