internal bool ContieneElementoFinSentencia(NoTerminal nt) { List <ElementoGramatica> listaElementos = new List <ElementoGramatica>(); List <NoTerminal> listaIteracion = new List <NoTerminal>(); List <NoTerminal> subLista = new List <NoTerminal>(); subLista.Add(nt); bool primerVuelta = true; while (primerVuelta || (listaIteracion.Count > 0)) { if (primerVuelta) { primerVuelta = false; } else { subLista = new List <NoTerminal>(listaIteracion); } listaIteracion = new List <NoTerminal>(); foreach (NoTerminal noTerminal in subLista) { List <Produccion> listaProds = this.ObtenerListaProduccionesParaUnNoTerminal(noTerminal); if (listaProds.Count > 0) { foreach (Produccion prod in listaProds) { if (prod.Der != null) { if (prod.Der.Contains(Terminal.ElementoFinSentencia())) { return(true); } else { for (int i = 0; i < prod.Der.Count; i++) { if (prod.Der[i].GetType() == typeof(NoTerminal) && !prod.Der.Contains(noTerminal) && !prod.Der.Contains(nt)) { if (!listaIteracion.Contains((NoTerminal)prod.Der[i])) { listaIteracion.Add((NoTerminal)prod.Der[i]); } } } } } } } } } return(false); }
internal List <Produccion> ObtenerProduccionesParaSalvarError(NoTerminal nt) { List <Produccion> listaProducciones = new List <Produccion>(); List <NoTerminal> listaIteracion = new List <NoTerminal>(); List <NoTerminal> subLista = new List <NoTerminal>(); subLista.Add(nt); bool primerVuelta = true; while (primerVuelta || (listaIteracion.Count > 0)) { if (primerVuelta) { primerVuelta = false; } else { subLista = new List <NoTerminal>(listaIteracion); } listaIteracion = new List <NoTerminal>(); foreach (NoTerminal noTerminal in subLista) { bool encontrado = false; List <Produccion> listaProds = this.ObtenerListaProduccionesParaUnNoTerminal(noTerminal); if (listaProds.Count > 0) { foreach (Produccion prod in listaProds) { if (prod.Der != null) { for (int i = 0; i < prod.Der.Count; i++) { if (prod.Der[i].GetType() == typeof(NoTerminal)) { if (prod.Der.Contains(Terminal.ElementoFinSentencia()) || ContieneElementoFinSentencia((NoTerminal)prod.Der[i]) ) { listaProducciones.Add(prod); if (!prod.Der.Contains(Terminal.ElementoFinSentencia())) { listaIteracion.Add((NoTerminal)prod.Der[i]); } encontrado = true; break; } } } } if (encontrado) { break; } } } if (encontrado) { break; } } } return(listaProducciones); }