private RetornoPrimeros PrimerosIzquierda(NoTerminal nt, Produccion prod) { RetornoPrimeros retorno = new RetornoPrimeros(); if (prod.Der != null) { retorno.Terminales.AddRange(this.PrimerosDe(nt, prod)); } else { retorno.Terminales.Add(Terminal.ElementoVacio()); } return(retorno); }
//Metodo publico, que se fija el primero del NoTerminal elegido en la parte derecha produccion private RetornoPrimeros PrimerosDerecha(NoTerminal nt, Produccion prod) { RetornoPrimeros retorno = new RetornoPrimeros(); List <Terminal> terminales = new List <Terminal>(); int i = prod.Der.IndexOf(nt); Debug.Assert(i >= 0, "El indice del metodo Primeros en TablePrimeros era menor a 0", "el terminal " + nt.ToString() + " no figura en la derecha de la prod " + prod.ToString()); bool parar = false; while (i < prod.Der.Count && !parar) { if (prod.Der[i].GetType() == typeof(NoTerminal)) { List <Terminal> terminalesAux = new List <Terminal>(); terminalesAux = this.PrimerosDe((NoTerminal)prod.Der[i]); terminales.AddRange(terminalesAux); if (!terminales.Contains(Terminal.ElementoVacio())) { parar = true; } } else { terminales.Add((Terminal)prod.Der[i]); parar = true; } i++; } if (!parar) { retorno.EsNecesarioSiguiente = true; retorno.NoTerminal = prod.Izq; } retorno.Terminales = terminales; return(retorno); }
private RetornoPrimeros PrimerosParaSiguientes(NoTerminal nt, Produccion prod) { RetornoPrimeros retorno = new RetornoPrimeros(); if (prod.Der != null) { retorno.Terminales.AddRange(this.PrimerosDe(nt)); } else { retorno.Terminales.Add(Terminal.ElementoVacio()); } if (retorno.Terminales.Contains(Terminal.ElementoVacio())) { retorno.EsNecesarioSiguiente = true; retorno.NoTerminal = nt; } return(retorno); }