public int ChooseMatch(int totalMatchExecute, SequenceSomeFromSet seq) { return totalMatchExecute; }
/// <summary> /// returns the maybe user altered rule to execute next for the sequence given /// the randomly chosen rule is supplied; the object with all available rules is supplied /// a list of all found matches is supplied, too /// </summary> public int ChooseMatch(int totalMatchToExecute, SequenceSomeFromSet seq) { if(seq.NumTotalMatches <= 1 && lazyChoice) { context.workaround.PrintHighlighted("Skipping choicepoint ", HighlightingMode.Choicepoint); Console.WriteLine("as no choice needed (use the (l) command to toggle this behaviour)."); return totalMatchToExecute; } ycompClient.UpdateDisplay(); ycompClient.Sync(); context.workaround.PrintHighlighted("Please choose: Which match to execute?", HighlightingMode.Choicepoint); Console.WriteLine(" Pre-selecting match " + totalMatchToExecute + " chosen by random."); Console.WriteLine("Press (0)...(9) to pre-select the corresponding match or (e) to enter the number of the match to show." + " Press (s) or (n) to commit to the pre-selected match and continue."); while(true) { int rule; int match; seq.FromTotalMatch(totalMatchToExecute, out rule, out match); Mark(rule, match, seq); ycompClient.UpdateDisplay(); ycompClient.Sync(); context.highlightSeq = seq.Sequences[rule]; context.choice = true; context.sequences = seq.Sequences; context.matches = seq.Matches; PrintSequence(debugSequences.Peek(), context, debugSequences.Count); Console.WriteLine(); context.choice = false; context.sequences = null; context.matches = null; ConsoleKeyInfo key = ReadKeyWithCancel(); switch(key.KeyChar) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': int num = key.KeyChar - '0'; if(num >= seq.NumTotalMatches) { Console.WriteLine("You must specify a number between 0 and " + (seq.NumTotalMatches - 1) + "!"); break; } Unmark(rule, match, seq); totalMatchToExecute = num; break; case 'e': Console.Write("Enter number of rule to show: "); String numStr = Console.ReadLine(); if(int.TryParse(numStr, out num)) { if(num < 0 || num >= seq.NumTotalMatches) { Console.WriteLine("You must specify a number between 0 and " + (seq.NumTotalMatches - 1) + "!"); break; } Unmark(rule, match, seq); totalMatchToExecute = num; break; } Console.WriteLine("You must enter a valid integer number!"); break; case 's': case 'n': Unmark(rule, match, seq); return totalMatchToExecute; default: Console.WriteLine("Illegal choice (Key = " + key.Key + ")! Only (0)...(9), (e)nter number, (s)/(n) to commit and continue allowed! "); break; } } }
void Mark(int rule, int match, SequenceSomeFromSet seq) { if(seq.NonRandomAll(rule)) { MarkMatches(seq.Matches[rule], realizers.MatchedNodeRealizer, realizers.MatchedEdgeRealizer); AnnotateMatches(seq.Matches[rule], true); } else { MarkMatch(seq.Matches[rule].GetMatch(match), realizers.MatchedNodeRealizer, realizers.MatchedEdgeRealizer); AnnotateMatch(seq.Matches[rule].GetMatch(match), true); } }
void Unmark(int rule, int match, SequenceSomeFromSet seq) { if(seq.NonRandomAll(rule)) { MarkMatches(seq.Matches[rule], null, null); AnnotateMatches(seq.Matches[rule], false); } else { MarkMatch(seq.Matches[rule].GetMatch(match), null, null); AnnotateMatch(seq.Matches[rule].GetMatch(match), false); } }
void EmitSequenceSome(SequenceSomeFromSet seqSome, SourceBuilder source) { source.AppendFront(SetResultVar(seqSome, "false")); // emit code for matching all the contained rules for (int i = 0; i < seqSome.Sequences.Count; ++i) { SequenceRuleCall seqRule = (SequenceRuleCall)seqSome.Sequences[i]; RuleInvocationParameterBindings paramBindings = seqRule.ParamBindings; String specialStr = seqRule.Special ? "true" : "false"; String parameters = BuildParameters(paramBindings); String matchingPatternClassName = TypesHelper.GetPackagePrefixDot(paramBindings.Package) + "Rule_" + paramBindings.Name; String patternName = paramBindings.Name; String matchType = matchingPatternClassName + "." + NamesOfEntities.MatchInterfaceName(patternName); String matchesType = "GRGEN_LIBGR.IMatchesExact<" + matchType + ">"; String matchesName = "matches_" + seqRule.Id; source.AppendFront(matchesType + " " + matchesName + " = rule_" + TypesHelper.PackagePrefixedNameUnderscore(paramBindings.Package, paramBindings.Name) + ".Match(procEnv, " + (seqRule.SequenceType == SequenceType.RuleCall ? "1" : "procEnv.MaxMatches") + parameters + ");\n"); for(int j=0; j<seqRule.Filters.Count; ++j) { EmitFilterCall(source, seqRule.Filters[j], patternName, matchesName); } source.AppendFront("procEnv.PerformanceInfo.MatchesFound += " + matchesName + ".Count;\n"); source.AppendFront("if(" + matchesName + ".Count!=0) {\n"); source.Indent(); source.AppendFront(SetResultVar(seqSome, "true")); source.Unindent(); source.AppendFront("}\n"); } // emit code for deciding on the match to rewrite String totalMatchToApply = "total_match_to_apply_" + seqSome.Id; String curTotalMatch = "cur_total_match_" + seqSome.Id; if (seqSome.Random) { source.AppendFront("int " + totalMatchToApply + " = 0;\n"); for (int i = 0; i < seqSome.Sequences.Count; ++i) { SequenceRuleCall seqRule = (SequenceRuleCall)seqSome.Sequences[i]; String matchesName = "matches_" + seqRule.Id; if (seqRule.SequenceType == SequenceType.RuleCall) source.AppendFront(totalMatchToApply + " += " + matchesName + ".Count;\n"); else if (seqRule.SequenceType == SequenceType.RuleCountAllCall || !((SequenceRuleAllCall)seqRule).ChooseRandom) // seq.SequenceType == SequenceType.RuleAll source.AppendFront("if(" + matchesName + ".Count>0) ++" + totalMatchToApply + ";\n"); else // seq.SequenceType == SequenceType.RuleAll && ((SequenceRuleAll)seqRule).ChooseRandom source.AppendFront(totalMatchToApply + " += " + matchesName + ".Count;\n"); } source.AppendFront(totalMatchToApply + " = GRGEN_LIBGR.Sequence.randomGenerator.Next(" + totalMatchToApply + ");\n"); source.AppendFront("int " + curTotalMatch + " = 0;\n"); } // code to handle the rewrite next match String firstRewrite = "first_rewrite_" + seqSome.Id; source.AppendFront("bool " + firstRewrite + " = true;\n"); // emit code for rewriting all the contained rules which got matched for (int i = 0; i < seqSome.Sequences.Count; ++i) { SequenceRuleCall seqRule = (SequenceRuleCall)seqSome.Sequences[i]; RuleInvocationParameterBindings paramBindings = seqRule.ParamBindings; String specialStr = seqRule.Special ? "true" : "false"; String matchingPatternClassName = "Rule_" + paramBindings.Name; String patternName = paramBindings.Name; String matchType = matchingPatternClassName + "." + NamesOfEntities.MatchInterfaceName(patternName); String matchName = "match_" + seqRule.Id; String matchesType = "GRGEN_LIBGR.IMatchesExact<" + matchType + ">"; String matchesName = "matches_" + seqRule.Id; if(seqSome.Random) source.AppendFront("if(" + matchesName + ".Count!=0 && " + curTotalMatch + "<=" + totalMatchToApply + ") {\n"); else source.AppendFront("if(" + matchesName + ".Count!=0) {\n"); source.Indent(); String returnParameterDeclarations; String returnArguments; String returnAssignments; String returnParameterDeclarationsAllCall; String intermediateReturnAssignmentsAllCall; String returnAssignmentsAllCall; BuildReturnParameters(paramBindings, out returnParameterDeclarations, out returnArguments, out returnAssignments, out returnParameterDeclarationsAllCall, out intermediateReturnAssignmentsAllCall, out returnAssignmentsAllCall); if (seqRule.SequenceType == SequenceType.RuleCall) { if (seqSome.Random) { source.AppendFront("if(" + curTotalMatch + "==" + totalMatchToApply + ") {\n"); source.Indent(); } source.AppendFront(matchType + " " + matchName + " = " + matchesName + ".FirstExact;\n"); if (gen.FireDebugEvents) source.AppendFront("procEnv.Matched(" + matchesName + ", null, " + specialStr + ");\n"); if (gen.FireDebugEvents) source.AppendFront("procEnv.Finishing(" + matchesName + ", " + specialStr + ");\n"); source.AppendFront("if(!" + firstRewrite + ") procEnv.RewritingNextMatch();\n"); if (returnParameterDeclarations.Length != 0) source.AppendFront(returnParameterDeclarations + "\n"); source.AppendFront("rule_" + TypesHelper.PackagePrefixedNameUnderscore(paramBindings.Package, paramBindings.Name) + ".Modify(procEnv, " + matchName + returnArguments + ");\n"); if (returnAssignments.Length != 0) source.AppendFront(returnAssignments + "\n"); source.AppendFront("procEnv.PerformanceInfo.RewritesPerformed++;\n"); source.AppendFront(firstRewrite + " = false;\n"); if (seqSome.Random) { source.Unindent(); source.AppendFront("}\n"); source.AppendFront("++" + curTotalMatch + ";\n"); } } else if (seqRule.SequenceType == SequenceType.RuleCountAllCall || !((SequenceRuleAllCall)seqRule).ChooseRandom) // seq.SequenceType == SequenceType.RuleAll { if (seqSome.Random) { source.AppendFront("if(" + curTotalMatch + "==" + totalMatchToApply + ") {\n"); source.Indent(); } // iterate through matches, use Modify on each, fire the next match event after the first if(returnParameterDeclarations.Length != 0) source.AppendFront(returnParameterDeclarationsAllCall + "\n"); String enumeratorName = "enum_" + seqRule.Id; source.AppendFront("IEnumerator<" + matchType + "> " + enumeratorName + " = " + matchesName + ".GetEnumeratorExact();\n"); source.AppendFront("while(" + enumeratorName + ".MoveNext())\n"); source.AppendFront("{\n"); source.Indent(); source.AppendFront(matchType + " " + matchName + " = " + enumeratorName + ".Current;\n"); if (gen.FireDebugEvents) source.AppendFront("procEnv.Matched(" + matchesName + ", null, " + specialStr + ");\n"); if (gen.FireDebugEvents) source.AppendFront("procEnv.Finishing(" + matchesName + ", " + specialStr + ");\n"); source.AppendFront("if(!" + firstRewrite + ") procEnv.RewritingNextMatch();\n"); if (returnParameterDeclarations.Length != 0) source.AppendFront(returnParameterDeclarations + "\n"); source.AppendFront("rule_" + TypesHelper.PackagePrefixedNameUnderscore(paramBindings.Package, paramBindings.Name) + ".Modify(procEnv, " + matchName + returnArguments + ");\n"); if(returnAssignments.Length != 0) source.AppendFront(intermediateReturnAssignmentsAllCall + "\n"); source.AppendFront("procEnv.PerformanceInfo.RewritesPerformed++;\n"); source.AppendFront(firstRewrite + " = false;\n"); source.Unindent(); source.AppendFront("}\n"); if(returnAssignments.Length != 0) source.AppendFront(returnAssignmentsAllCall + "\n"); if(seqRule.SequenceType == SequenceType.RuleCountAllCall) { SequenceRuleCountAllCall ruleCountAll = (SequenceRuleCountAllCall)seqRule; source.AppendFront(SetVar(ruleCountAll.CountResult, matchesName + ".Count")); } if (seqSome.Random) { source.Unindent(); source.AppendFront("}\n"); source.AppendFront("++" + curTotalMatch + ";\n"); } } else // seq.SequenceType == SequenceType.RuleAll && ((SequenceRuleAll)seqRule).ChooseRandom { if (seqSome.Random) { // for the match selected: rewrite it String enumeratorName = "enum_" + seqRule.Id; source.AppendFront("IEnumerator<" + matchType + "> " + enumeratorName + " = " + matchesName + ".GetEnumeratorExact();\n"); source.AppendFront("while(" + enumeratorName + ".MoveNext())\n"); source.AppendFront("{\n"); source.Indent(); source.AppendFront("if(" + curTotalMatch + "==" + totalMatchToApply + ") {\n"); source.Indent(); source.AppendFront(matchType + " " + matchName + " = " + enumeratorName + ".Current;\n"); if (gen.FireDebugEvents) source.AppendFront("procEnv.Matched(" + matchesName + ", null, " + specialStr + ");\n"); if (gen.FireDebugEvents) source.AppendFront("procEnv.Finishing(" + matchesName + ", " + specialStr + ");\n"); source.AppendFront("if(!" + firstRewrite + ") procEnv.RewritingNextMatch();\n"); if (returnParameterDeclarations.Length != 0) source.AppendFront(returnParameterDeclarations + "\n"); source.AppendFront("rule_" + TypesHelper.PackagePrefixedNameUnderscore(paramBindings.Package, paramBindings.Name) + ".Modify(procEnv, " + matchName + returnArguments + ");\n"); if (returnAssignments.Length != 0) source.AppendFront(returnAssignments + "\n"); source.AppendFront("procEnv.PerformanceInfo.RewritesPerformed++;\n"); source.AppendFront(firstRewrite + " = false;\n"); source.Unindent(); source.AppendFront("}\n"); source.AppendFront("++" + curTotalMatch + ";\n"); source.Unindent(); source.AppendFront("}\n"); } else { // randomly choose match, rewrite it and remove it from available matches source.AppendFront(matchType + " " + matchName + " = " + matchesName + ".GetMatchExact(GRGEN_LIBGR.Sequence.randomGenerator.Next(" + matchesName + ".Count));\n"); if (gen.FireDebugEvents) source.AppendFront("procEnv.Matched(" + matchesName + ", null, " + specialStr + ");\n"); if (gen.FireDebugEvents) source.AppendFront("procEnv.Finishing(" + matchesName + ", " + specialStr + ");\n"); source.AppendFront("if(!" + firstRewrite + ") procEnv.RewritingNextMatch();\n"); if (returnParameterDeclarations.Length != 0) source.AppendFront(returnParameterDeclarations + "\n"); source.AppendFront("rule_" + TypesHelper.PackagePrefixedNameUnderscore(paramBindings.Package, paramBindings.Name) + ".Modify(procEnv, " + matchName + returnArguments + ");\n"); if (returnAssignments.Length != 0) source.AppendFront(returnAssignments + "\n"); source.AppendFront("procEnv.PerformanceInfo.RewritesPerformed++;\n"); source.AppendFront(firstRewrite + " = false;\n"); } } if (gen.FireDebugEvents) source.AppendFront("procEnv.Finished(" + matchesName + ", " + specialStr + ");\n"); source.Unindent(); source.AppendFront("}\n"); } }