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 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); } } } }