//private List<Terminal> Primeros(NoTerminal nt) //{ // List<Terminal> terminales = new List<Terminal>(); // List<Produccion> listaIteracion = new List<Produccion>(); // List<Produccion> subLista = this.ObtenerListaProduccionesParaUnNoTerminal(nt); // bool primerVuelta = true; // while (primerVuelta || (listaIteracion.Count > 0)) // { // if (primerVuelta) // { // primerVuelta = false; // } // else // { // subLista = new List<Produccion>(listaIteracion); // } // foreach (Produccion prod in subLista) // { // listaIteracion = new List<Produccion>(); // if (prod.Der != null) // { // ElementoGramatica elem = prod.Der.First(); // if (elem.GetType() == typeof(Terminal)) // { // terminales.Add((Terminal)elem); // } // else // { // listaIteracion.AddRange(this.ObtenerListaProduccionesParaUnNoTerminal((NoTerminal)elem)); // } // } // else // { // Terminal t = new Terminal(); // t.Componente = new ComponenteLexico(); // t.Componente.Token = ComponenteLexico.TokenType.Ninguno; // terminales.Add(t); // } // } // } // return terminales; //} private List <Terminal> Primeros(NoTerminal nt, Produccion p) { List <Terminal> terminales = new List <Terminal>(); List <Produccion> listaIteracion = new List <Produccion>(); List <Produccion> subLista = new List <Produccion>(); subLista.Add(p); bool primerVuelta = true; while (primerVuelta || (listaIteracion.Count > 0)) { if (primerVuelta) { primerVuelta = false; } else { subLista = new List <Produccion>(listaIteracion); } foreach (Produccion prod in subLista) { listaIteracion = new List <Produccion>(); if (prod.Der != null) { ElementoGramatica elem = prod.Der.First(); if (elem.GetType() == typeof(Terminal)) { terminales.Add((Terminal)elem); } else { listaIteracion.AddRange(this.ObtenerListaProduccionesParaUnNoTerminal((NoTerminal)elem)); } } else { Terminal t = new Terminal(); t.Componente = new ComponenteLexico(); t.Componente.Token = ComponenteLexico.TokenType.Ninguno; terminales.Add(t); } } } return(terminales); }
private List <ElementoGramatica> ObtenerProximoEnParteDerechaDe(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 = listaIteracion; } foreach (NoTerminal noTerminal in subLista) { listaIteracion = new List <NoTerminal>(); //Si es el simbolo inicial, agrego el terminal EOF if (this.simboloInicial.Equals(noTerminal)) { listaElementos.Add(Terminal.ElementoEOF()); } List <Produccion> listaProds = ObtenerProduccionesConNoTerminalEnParteDerecha(noTerminal); if (listaProds.Count > 0) { foreach (Produccion prod in listaProds) { ElementoGramatica elem = prod.ObtenerSiguienteDe(noTerminal); if (elem != null) { if (!listaElementos.Contains(elem)) { listaElementos.Add(elem); } } else { if (prod.Der != null) { if (prod.Der.Last().GetType() == typeof(NoTerminal)) { if (!noTerminal.Equals(prod.Izq)) { if (!listaIteracion.Contains(noTerminal)) { listaIteracion.Add(prod.Izq); } } } } } } } } } return(listaElementos); }