Esempio n. 1
0
        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);
        }
Esempio n. 2
0
 internal bool ProduceElementoVacio()
 {
     return(this.Der[0].Equals(Terminal.ElementoVacio()));
 }