private List <Terminal> Siguientes(NoTerminal nt) { //if (nt.Nombre == "NUMERO") //{ // Debugger.Break(); //} List <Terminal> terminales = new List <Terminal>(); List <NoTerminal> listaIteracion = new List <NoTerminal>(); List <ElementoGramatica> subLista = this.ObtenerProximoEnParteDerechaDe(nt); bool primerVuelta = true; while (primerVuelta || (listaIteracion.Count > 0)) { if (primerVuelta) { primerVuelta = false; } else { subLista = new List <ElementoGramatica>(); foreach (NoTerminal noTerminales in listaIteracion) { subLista.AddRange(this.ObtenerProximoEnParteDerechaDe(noTerminales)); } } listaIteracion = new List <NoTerminal>(); foreach (ElementoGramatica elem in subLista) { if (elem.GetType() == typeof(Terminal)) { if (!terminales.Contains((Terminal)elem)) { terminales.Add((Terminal)elem); } //terminales.Add((Terminal)elem); } else { foreach (Produccion prod in this.ObtenerListaProduccionesParaUnNoTerminal((NoTerminal)elem)) { if (prod.Der != null) { //terminales.AddRange(this.Primeros((NoTerminal)elem, prod)); RetornoPrimeros retorno = (this.tablaPrimeros.Primeros((NoTerminal)elem, prod, true)); //RetornoPrimeros retorno = (this.tablaPrimeros.Primeros((NoTerminal)elem, prod, false)); //terminales.AddRange(retorno.Terminales); foreach (Terminal t in retorno.Terminales) { if (!terminales.Contains(t)) { terminales.Add(t); } } if (retorno.EsNecesarioSiguiente) { if (!listaIteracion.Contains((NoTerminal)retorno.NoTerminal)) { listaIteracion.Add(retorno.NoTerminal); } } } } } } } //Saco todos los lambda terminales.RemoveAll( delegate(Terminal _t) { return(_t.Equals(Terminal.ElementoVacio())); } ); return(terminales); }
internal bool ProduceElementoVacio() { return(this.Der[0].Equals(Terminal.ElementoVacio())); }