Пример #1
0
        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);
        }
Пример #2
0
        //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);
        }
Пример #3
0
        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);
        }