public TablaAnalisisGramatica ArmarTablaAnalisis() { try { TablaAnalisisGramatica tabla = new TablaAnalisisGramatica(); List <Terminal> termsPrim = new List <Terminal>(); List <Terminal> termsSig = new List <Terminal>(); foreach (NoTerminal nt in noTerminales) { foreach (Produccion prod in this.ObtenerListaProduccionesParaUnNoTerminal(nt)) { termsPrim = new List <Terminal>(); termsSig = new List <Terminal>(); //if (nt.Nombre == "CONSTANTES") //{ // Debugger.Break(); //} //termsPrim.AddRange(this.Primeros(nt,prod)); RetornoPrimeros rt = this.tablaPrimeros.Primeros(nt, prod, false); termsPrim.AddRange(rt.Terminales); tabla.AgregarPrimeros(nt, termsPrim, prod); bool existeLamba = termsPrim.Exists( delegate(Terminal _t) { if (_t.Componente.Token == ComponenteLexico.TokenType.Ninguno) { return(true); } else { return(false); } } ); if (existeLamba) { termsSig.AddRange(this.Siguientes(nt)); tabla.AgregarSiguientes(nt, termsSig); } } //if (nt.Nombre == "CON") //{ // if (Debugger.IsAttached) // { // Debugger.Break(); // } //} termsSig = new List <Terminal>(); termsSig.AddRange(this.Siguientes(nt)); tabla.AgregarSincronizacion(nt, termsSig); } return(tabla); } catch (Exception ex) { Utils.Log.AddError(ex.Message); throw new Exception("Error al crear la tabla de analisis"); } }
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); }