Exemple #1
0
        private void EliminarProducoesUnitarias()
        {
            GrammarNoUnitarianProductions = new Grammar();
            GrammarNoUnitarianProductions.Terminals.AddRange(GrammarNoEmpty.Terminals);
            GrammarNoUnitarianProductions.Variables.AddRange(GrammarNoEmpty.Variables);
            for (int i = 0; i < GrammarNoEmpty.Rules.Count; i++)
            {
                RuleProduction rgAtual = GrammarNoEmpty.Rules[i];
                GrammarNoUnitarianProductions.AddRule(rgAtual.Source, rgAtual.Destiny.Copy());
            }
            bool trocou = true;

            while (trocou)
            {
                trocou = false;
                for (int i = GrammarNoUnitarianProductions.Rules.Count - 1; i >= 0; i--)
                {
                    RuleProduction rgAtual = GrammarNoUnitarianProductions.Rules[i];

                    if (rgAtual.IsUnityVariable())
                    {
                        var regras = GrammarNoUnitarianProductions.GetRules(rgAtual.FirstDestiny().Name);
                        foreach (var item in regras)
                        {
                            GrammarNoUnitarianProductions.AddRule(rgAtual.Source, item.Destiny.Copy());
                        }
                        trocou = true;
                        GrammarNoUnitarianProductions.Rules.Remove(rgAtual);
                    }
                }
            }
        }
Exemple #2
0
        private void FillNewsNames()
        {
            NewNames = new Dictionary <Symbol, Symbol>();

            SymbolList visitados = new SymbolList();

            Queue <Symbol> variaveisAVisitar = new Queue <Symbol>();

            variaveisAVisitar.Enqueue(simplified.VariableStart);

            int i = 1;

            NewNames.Add(simplified.VariableStart, new Symbol(GetNewId(), string.Format("A{0:000}", i), false));
            visitados.Add(simplified.VariableStart);
            while (variaveisAVisitar.Count > 0)
            {
                var variavelAtual = variaveisAVisitar.Dequeue();

                List <RuleProduction> regrasAtuais = simplified.GetRules(variavelAtual);

                foreach (var item in regrasAtuais)
                {
                    foreach (var itemDestino in item.Destiny)
                    {
                        if (!itemDestino.Terminal && !visitados.Contains(itemDestino))
                        {
                            variaveisAVisitar.Enqueue(itemDestino);
                            i++;
                            NewNames.Add(itemDestino, new Symbol(GetNewId(), string.Format("A{0:000}", i), false));
                            visitados.Add(itemDestino);
                        }
                    }
                }
            }

            Normalized = new Grammar();
            Normalized.VariableStart = simplified.VariableStart;
            Normalized.Variables.AddRange(simplified.Variables);
            Normalized.Terminals.AddRange(simplified.Terminals);
            Normalized.VariablesEmpty = simplified.VariablesEmpty;
            for (i = 0; i < simplified.Rules.Count; i++)
            {
                Normalized.AddRule(simplified.Rules[i].Source, simplified.Rules[i].Destiny.Copy());
            }
        }
        private void EliminarProducoesUnitarias()
        {
            GrammarNoUnitarianProductions = new Grammar();
            GrammarNoUnitarianProductions.Terminals.AddRange(GrammarNoEmpty.Terminals);
            GrammarNoUnitarianProductions.Variables.AddRange(GrammarNoEmpty.Variables);
            for (int i = 0; i < GrammarNoEmpty.Rules.Count; i++)
            {
                RuleProduction rgAtual = GrammarNoEmpty.Rules[i];
                GrammarNoUnitarianProductions.AddRule(rgAtual.Source, rgAtual.Destiny.Copy());
            }
            bool trocou = true;
            while (trocou)
            {
                trocou = false;
                for (int i = GrammarNoUnitarianProductions.Rules.Count - 1; i >= 0; i--)
                {
                    RuleProduction rgAtual = GrammarNoUnitarianProductions.Rules[i];

                    if (rgAtual.IsUnityVariable())
                    {
                        var regras = GrammarNoUnitarianProductions.GetRules(rgAtual.FirstDestiny().Name);
                        foreach (var item in regras)
                        {
                            GrammarNoUnitarianProductions.AddRule(rgAtual.Source, item.Destiny.Copy());
                        }
                        trocou = true;
                        GrammarNoUnitarianProductions.Rules.Remove(rgAtual);
                    }
                }
            }
        }