示例#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);
                    }
                }
            }
        }
示例#2
0
        private void FillClosures()
        {
            Fasteners       = new Dictionary <Symbol, SymbolList>();
            FastenersString = new List <string>();

            for (int i = 0; i < GrammarNoEmpty.Rules.Count; i++)
            {
                RuleProduction rgAtual = GrammarNoEmpty.Rules[i];
                if (rgAtual.IsUnityVariable())
                {
                    if (Fasteners.ContainsKey(rgAtual.Source))
                    {
                        if (!Fasteners[rgAtual.Source].Contains(rgAtual.Destiny[0]))
                        {
                            Fasteners[rgAtual.Source].Add(rgAtual.Destiny[0]);
                        }
                    }
                    else
                    {
                        Fasteners.Add(rgAtual.Source, new SymbolList());
                        Fasteners[rgAtual.Source].Add(rgAtual.Destiny[0]);
                    }
                }
            }

            foreach (var item in Fasteners)
            {
                string fecho = "{";
                foreach (var charItem in item.Value)
                {
                    fecho += charItem.Name + ",";
                }
                FastenersString.Add(string.Format("Fecho({0}) = {1}}}", item.Key.Name, fecho.Trim(',')));
            }
        }