Beispiel #1
0
        //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);
        }
Beispiel #2
0
        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);
        }