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); } } } }
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(','))); } }