Exemplo n.º 1
0
        public TablaAnalisisGramatica ArmarTablaAnalisis()
        {
            try
            {
                TablaAnalisisGramatica tabla = new TablaAnalisisGramatica();



                List <Terminal> termsPrim = new List <Terminal>();
                List <Terminal> termsSig  = new List <Terminal>();

                foreach (NoTerminal nt in noTerminales)
                {
                    foreach (Produccion prod in this.ObtenerListaProduccionesParaUnNoTerminal(nt))
                    {
                        termsPrim = new List <Terminal>();
                        termsSig  = new List <Terminal>();

                        //if (nt.Nombre == "CONSTANTES")
                        //{
                        //    Debugger.Break();
                        //}

                        //termsPrim.AddRange(this.Primeros(nt,prod));
                        RetornoPrimeros rt = this.tablaPrimeros.Primeros(nt, prod, false);
                        termsPrim.AddRange(rt.Terminales);
                        tabla.AgregarPrimeros(nt, termsPrim, prod);

                        bool existeLamba = termsPrim.Exists(

                            delegate(Terminal _t)
                        {
                            if (_t.Componente.Token == ComponenteLexico.TokenType.Ninguno)
                            {
                                return(true);
                            }
                            else
                            {
                                return(false);
                            }
                        }
                            );

                        if (existeLamba)
                        {
                            termsSig.AddRange(this.Siguientes(nt));
                            tabla.AgregarSiguientes(nt, termsSig);
                        }
                    }

                    //if (nt.Nombre == "CON")
                    //{
                    //    if (Debugger.IsAttached)
                    //    {
                    //        Debugger.Break();
                    //    }
                    //}

                    termsSig = new List <Terminal>();
                    termsSig.AddRange(this.Siguientes(nt));
                    tabla.AgregarSincronizacion(nt, termsSig);
                }
                return(tabla);
            }
            catch (Exception ex)
            {
                Utils.Log.AddError(ex.Message);
                throw new Exception("Error al crear la tabla de analisis");
            }
        }
Exemplo n.º 2
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);
        }