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("----------------------------------------"); }