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); } } } }
public void EliminarProducoesVazio() { GrammarNoEmpty = new Grammar(); GrammarNoEmpty.Terminals.AddRange(Source.Terminals); GrammarNoEmpty.Variables.AddRange(Source.Variables); for (int i = 0; i < Source.Rules.Count; i++) { RuleProduction regraAtual = Source.Rules[i]; Symbol orig = regraAtual.Source; List <SymbolList> destinos = new List <SymbolList>(); if (Source.Rules[i].Destiny.Count == 1 && Source.Rules[i].Destiny[0] == Symbol.EmptyTerminal) { //Do Nothing } else { if (regraAtual.Destiny.Count > 0) { destinos.Add(regraAtual.Destiny); for (int j = 0; j < destinos.Count; j++) { for (int k = 0; k < VariablesEmpty.Count; k++) { if (destinos[j].Contains(VariablesEmpty[k])) { var destino = regraAtual.Destiny; while (destino.Contains(VariablesEmpty[k])) { destino = destino.RemoveFirst(VariablesEmpty[k]); if (destinos.FirstOrDefault(list => list == destino) == null && !destino.IsEmpty()) { destinos.Add(destino); } } } } } } for (int j = 0; j < destinos.Count; j++) { var destino = destinos[j].Copy(); GrammarNoEmpty.AddRule(orig, destino); } } } }
private void GenerateNewVars() { Normalized = new Grammar(); NewVariables = new SymbolList(); foreach (var item in simplified.Terminals) { int newId = GetNewId(); Symbol s = new Symbol(newId, string.Empty, false); NewVariables.Add(s); NewRoles.Add(Normalized.AddRule(newId, item)); DicVariablesTerminals.Add(item, s); } }
public Simplification(Grammar source) { this.Source = source; Simplified = new Grammar(); FillTableEmpty(); EliminarProducoesVazio(); FillClosures(); EliminarProducoesUnitarias(); FillVariablesAcessibleTerminals(); FillAcessibles(GrammarNoUnitarianProductions); GenerateSimplified(); if (VariablesEmpty.Contains(Simplified.VariableStart)) { Simplified.AddRule(Simplified.VariableStart.Id, Symbol.EmptyTerminal); } }
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 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 CompilerFuzzy Compiler4() { //LR(1) //0. S //0 → S$ //1. S → V = E //2. S → E //3. E → V //4. V → x //5. V → ∗E List<RecognitionToken> recs = new List<RecognitionToken>(); var requal = new RecognitionToken(1, "equal", "=", "#7bf6b6", norm, conorm); var rast = new RecognitionToken(2, "ast", "*", "#f28686", norm, conorm); var rx = new RecognitionToken(3, "x", "x", "#fbdb65", norm, conorm); recs.Add(requal); recs.Add(rast); recs.Add(rx); Grammar grammar = new Grammar(); var x = new Symbol(1, "x", true, 'x'); x.SetCustomValue("RecToken", rx); var ast = new Symbol(2, "*", true, '*'); ast.SetCustomValue("RecToken", rast); var equal = new Symbol(3, "=", true, '='); equal.SetCustomValue("RecToken", requal); var S = new Symbol(4, "S", false); var V = new Symbol(5, "V", false); var V1 = new Symbol(7, "V1", false); var E = new Symbol(6, "E", false); grammar.Terminals.AddRange(new SymbolList(x, ast, equal)); grammar.Variables.AddRange(new SymbolList(S, V, E, V1)); grammar.VariableStart = S; grammar.AddRule(S, V, equal, E); grammar.AddRule(S, E); grammar.AddRule(E, V); grammar.AddRule(E, V1).Pertinence = 0.8; var ruleV = grammar.AddRule(V, x); grammar.AddRule(V1, equal).Parent = ruleV; grammar.AddRule(V, ast, E); return new CompilerFuzzy(recs, grammar, null, null, norm, conorm); }
public void EliminarProducoesVazio() { GrammarNoEmpty = new Grammar(); GrammarNoEmpty.Terminals.AddRange(Source.Terminals); GrammarNoEmpty.Variables.AddRange(Source.Variables); for (int i = 0; i < Source.Rules.Count; i++) { RuleProduction regraAtual = Source.Rules[i]; Symbol orig = regraAtual.Source; List<SymbolList> destinos = new List<SymbolList>(); if (Source.Rules[i].Destiny.Count == 1 && Source.Rules[i].Destiny[0] == Symbol.EmptyTerminal) { //Do Nothing } else { if (regraAtual.Destiny.Count > 0) { destinos.Add(regraAtual.Destiny); for (int j = 0; j < destinos.Count; j++) { for (int k = 0; k < VariablesEmpty.Count; k++) { if (destinos[j].Contains(VariablesEmpty[k])) { var destino = regraAtual.Destiny; while (destino.Contains(VariablesEmpty[k])) { destino = destino.RemoveFirst(VariablesEmpty[k]); if (destinos.FirstOrDefault(list => list == destino) == null && !destino.IsEmpty()) { destinos.Add(destino); } } } } } } for (int j = 0; j < destinos.Count; j++) { var destino = destinos[j].Copy(); GrammarNoEmpty.AddRule(orig, destino); } } } }