public bool InsertRuleWithANewSymbol(Grammar grammar) { for (var i = 0; i < NumberOfRetries; i++) { var existingLHSNonTerminal = grammar.GetRandomRule().Name.NonTerminal; if (existingLHSNonTerminal == grammar.StartSymbol) continue; var newLHSNonTerminal = grammar.GetNextAvailableProjectionName(); var typeOfExistingLHS = grammar.NonTerminalsTypeDictionary[existingLHSNonTerminal]; grammar.AddProjectionTypeToTypeDictionary(newLHSNonTerminal, typeOfExistingLHS); //grammar.AddRule(new Rule(0, grammar.StartSymbol, new[] { newLHSNonTerminal, grammar.StartSymbol }, 0, 1)); // grammar.AddRule(new Rule(0, grammar.StartSymbol, new[] { newLHSNonTerminal }, 0, 0)); grammar.AddRule(new Rule(0, newLHSNonTerminal, new[] {existingLHSNonTerminal}, 0, 0)); return true; } return false; }
public bool ChangeHeadOfRule(Grammar grammar) { for (var i = 0; i < NumberOfRetries; i++) { var rule = grammar.GetRandomRule(); if (!rule.IsInitialRule()) continue; //do not change complements of schematic rules. (push/pop) if (rule.Production.Length > 1) { var newRule = new Rule(rule); newRule.HeadPosition = (rule.HeadPosition + 1)%rule.Production.Length; if (grammar.AreHeadRelationsConsistent(newRule)) { grammar.DeleteRule(rule); grammar.AddRule(newRule); return true; } } } return false; }
public bool AddMoveable(Grammar grammar) { for (var i = 0; i < NumberOfRetries; i++) { var rule = grammar.GetRandomRule(); //if movement symbol is LHS for some rule.. if (!grammar.Moveables.Contains(rule.Name.NonTerminal)) { grammar.AddMoveable(rule.Name.NonTerminal); return true; } } return false; }
public bool AddRuleToLandingSites(Grammar grammar) { for (var i = 0; i < NumberOfRetries; i++) { var rule = grammar.GetRandomRule(); //var movementSymbol = rule.NonComplementTerm; //if movement symbol is LHS for some rule.. if (!grammar.LandingSites.Contains(rule.Name.NonTerminal)) { grammar.AddNonTerminalToLandingSites(rule.Name.NonTerminal); return true; } } return false; }
public bool ChangeComplementOfRule(Grammar grammar) { for (var i = 0; i < NumberOfRetries; i++) { var rule = grammar.GetRandomRule(); if (!rule.IsInitialRule()) continue; //do not change complements of schematic rules. (push/pop) if (rule.Production.Length > 1) { rule.ComplementPosition = (rule.ComplementPosition + 1)%rule.Production.Length; return true; } } return false; }
public bool DeleteRule(Grammar grammar) { var rule = grammar.GetRandomRule(); grammar.DeleteRule(rule); return true; }