Exemple #1
0
        internal bool ContieneElementoFinSentencia(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 = new List <NoTerminal>(listaIteracion);
                }

                listaIteracion = new List <NoTerminal>();

                foreach (NoTerminal noTerminal in subLista)
                {
                    List <Produccion> listaProds = this.ObtenerListaProduccionesParaUnNoTerminal(noTerminal);

                    if (listaProds.Count > 0)
                    {
                        foreach (Produccion prod in listaProds)
                        {
                            if (prod.Der != null)
                            {
                                if (prod.Der.Contains(Terminal.ElementoFinSentencia()))
                                {
                                    return(true);
                                }
                                else
                                {
                                    for (int i = 0; i < prod.Der.Count; i++)
                                    {
                                        if (prod.Der[i].GetType() == typeof(NoTerminal) && !prod.Der.Contains(noTerminal) && !prod.Der.Contains(nt))
                                        {
                                            if (!listaIteracion.Contains((NoTerminal)prod.Der[i]))
                                            {
                                                listaIteracion.Add((NoTerminal)prod.Der[i]);
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }

            return(false);
        }
Exemple #2
0
        internal List <Produccion> ObtenerProduccionesParaSalvarError(NoTerminal nt)
        {
            List <Produccion> listaProducciones = new List <Produccion>();

            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 = new List <NoTerminal>(listaIteracion);
                }

                listaIteracion = new List <NoTerminal>();

                foreach (NoTerminal noTerminal in subLista)
                {
                    bool encontrado = false;

                    List <Produccion> listaProds = this.ObtenerListaProduccionesParaUnNoTerminal(noTerminal);

                    if (listaProds.Count > 0)
                    {
                        foreach (Produccion prod in listaProds)
                        {
                            if (prod.Der != null)
                            {
                                for (int i = 0; i < prod.Der.Count; i++)
                                {
                                    if (prod.Der[i].GetType() == typeof(NoTerminal))
                                    {
                                        if (prod.Der.Contains(Terminal.ElementoFinSentencia())
                                            ||
                                            ContieneElementoFinSentencia((NoTerminal)prod.Der[i])
                                            )
                                        {
                                            listaProducciones.Add(prod);
                                            if (!prod.Der.Contains(Terminal.ElementoFinSentencia()))
                                            {
                                                listaIteracion.Add((NoTerminal)prod.Der[i]);
                                            }
                                            encontrado = true;
                                            break;
                                        }
                                    }
                                }
                            }
                            if (encontrado)
                            {
                                break;
                            }
                        }
                    }
                    if (encontrado)
                    {
                        break;
                    }
                }
            }

            return(listaProducciones);
        }