private void AgregarSiguienteNoTerminal(int i, Produccion produccion, string ladoIzquierdo)
        {
            string[] nuevosPrimeros = BuscarPrimeros(produccion.LadoDerecho[i].Nombre).LadoDerecho.Split(',');

            if (Pertenece(produccion.LadoDerecho[i].Nombre, terminales))
            {
                AgregarLista(siguientes, produccion.LadoDerecho[i].Nombre, ladoIzquierdo);
            }
            else
            {
                for (int j = 0; j < nuevosPrimeros.Length; j++)
                {
                    if (nuevosPrimeros[j].Equals("€"))
                    {
                        if (i + 1 < produccion.LadoDerecho.Length)
                        {
                            AgregarSiguienteNoTerminal(i + 1, produccion, ladoIzquierdo);
                        }
                        else
                        {
                            Conjunto siguiente = BuscarSiguientes(produccion.LadoIzquierdo);

                            if (siguiente.LadoIzquierdo.Equals(""))
                            {
                                AgregarLista(siguientes, "S(" + produccion.LadoIzquierdo + ")", ladoIzquierdo);
                            }
                            else
                            {
                                string[] listaSiguientes = siguiente.LadoDerecho.Split(',');
                                for (int k = 0; k < listaSiguientes.Length; k++)
                                {
                                    AgregarLista(siguientes, listaSiguientes[k], ladoIzquierdo);
                                }
                            }
                        }
                    }
                    else
                    {
                        AgregarLista(siguientes, nuevosPrimeros[j], ladoIzquierdo);
                    }
                }
            }
        }
        private void CalcularPrimeros()
        {
            List <Produccion> proximasProducciones = new List <Produccion>();
            List <bool>       calculados           = new List <bool>();

            foreach (Produccion produccion in listaProducciones)
            {
                string primerElementoLadoDerecho = produccion.LadoDerecho[0].Nombre;

                if (Pertenece(primerElementoLadoDerecho, terminales))
                {
                    if (!primerElementoLadoDerecho.Equals("€"))
                    {
                        AgregarLista(primeros, primerElementoLadoDerecho, produccion.LadoIzquierdo);
                        BuscarEpsilonPrimero(produccion.LadoIzquierdo);
                    }
                }
                else if (Pertenece(primerElementoLadoDerecho, noTerminales))
                {
                    proximasProducciones.Add(produccion);
                    calculados.Add(false);
                }
            }

            bool huboSinCalcular = true;

            while (huboSinCalcular)
            {
                huboSinCalcular = false;

                for (int j = 0; j < proximasProducciones.Count; j++)
                {
                    Produccion produccion = proximasProducciones[j];

                    string primerElementoLadoDerecho = produccion.LadoDerecho[0].Nombre;

                    for (int i = 0; i < proximasProducciones.Count; i++)
                    {
                        if (proximasProducciones[i].LadoIzquierdo.Equals(produccion.LadoDerecho[0].Nombre))
                        {
                            if (!calculados[i])
                            {
                                huboSinCalcular = true;
                                continue;
                            }
                        }
                    }

                    CalcularPrimeroNoTerminal(produccion.LadoIzquierdo, produccion.LadoDerecho, primerElementoLadoDerecho);
                    calculados[j] = true;
                }
            }

            EliminarRepetidos(primeros);

            Console.WriteLine("----------------PRIMEROS----------------");
            foreach (Conjunto primero in primeros)
            {
                Console.WriteLine(primero.ToString());
            }
            Console.WriteLine("----------------------------------------");
        }