本文整理汇总了C#中de.unika.ipd.grGen.lgsp.SourceBuilder.AppendFrontFormat方法的典型用法代码示例。如果您正苦于以下问题:C# SourceBuilder.AppendFrontFormat方法的具体用法?C# SourceBuilder.AppendFrontFormat怎么用?C# SourceBuilder.AppendFrontFormat使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类de.unika.ipd.grGen.lgsp.SourceBuilder
的用法示例。
在下文中一共展示了SourceBuilder.AppendFrontFormat方法的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C#代码示例。
示例1: EmitMatchedReset
public void EmitMatchedReset(SourceBuilder builder, bool parallel)
{
if(parallel)
builder.AppendFrontFormat("flagsPerElement{0}[candidate{0}.uniqueId] &= (ushort)~GRGEN_LGSP.LGSPElemFlagsParallel.IS_MATCHED;\n", this.Id);
else
builder.AppendFrontFormat("candidate{0}.lgspFlags &= ~((uint)GRGEN_LGSP.LGSPElemFlags.IS_MATCHED);\n", this.Id);
}
示例2: EmitMatchedCheckAndSet
public void EmitMatchedCheckAndSet(SourceBuilder builder, bool parallel)
{
if(parallel)
{
builder.AppendFrontFormat("List<ushort> flagsPerElement{0} = graph.flagsPerThreadPerElement[threadId];\n", this.Id);
builder.AppendFrontFormat("if((flagsPerElement{0}[candidate{0}.uniqueId] & (ushort)GRGEN_LGSP.LGSPElemFlagsParallel.IS_MATCHED) != 0)\n", this.Id);
builder.AppendFront("\tcontinue;\n");
builder.AppendFrontFormat("flagsPerElement{0}[candidate{0}.uniqueId] |= (ushort)GRGEN_LGSP.LGSPElemFlagsParallel.IS_MATCHED;\n", this.Id);
}
else
{
builder.AppendFrontFormat("if((candidate{0}.lgspFlags & (uint)GRGEN_LGSP.LGSPElemFlags.IS_MATCHED) != 0)\n", this.Id);
builder.AppendFront("\tcontinue;\n");
builder.AppendFrontFormat("candidate{0}.lgspFlags |= (uint)GRGEN_LGSP.LGSPElemFlags.IS_MATCHED;\n", this.Id);
}
}
示例3: GenerateMatcherClassHeadIterated
/// <summary>
/// Generates matcher class head source code for the given iterated pattern into given source builder
/// isInitialStatic tells whether the initial static version or a dynamic version after analyze is to be generated.
/// </summary>
public void GenerateMatcherClassHeadIterated(SourceBuilder sb, LGSPMatchingPattern matchingPattern,
PatternGraph iter, bool isInitialStatic)
{
PatternGraph patternGraph = (PatternGraph)matchingPattern.PatternGraph;
String namePrefix = (isInitialStatic ? "" : "Dyn") + "IteratedAction_";
String className = namePrefix + iter.pathPrefix + iter.name;
String matchingPatternClassName = matchingPattern.GetType().Name;
if(patternGraph.Package != null)
{
sb.AppendFrontFormat("namespace {0}\n", patternGraph.Package);
sb.AppendFront("{\n");
sb.Indent();
}
sb.AppendFront("public class " + className + " : GRGEN_LGSP.LGSPSubpatternAction\n");
sb.AppendFront("{\n");
sb.Indent(); // class level
sb.AppendFront("private " + className + "(GRGEN_LGSP.LGSPActionExecutionEnvironment actionEnv_, Stack<GRGEN_LGSP.LGSPSubpatternAction> openTasks_) {\n");
sb.Indent(); // method body level
sb.AppendFront("actionEnv = actionEnv_; openTasks = openTasks_;\n");
sb.AppendFront("patternGraph = " + matchingPatternClassName + ".Instance.patternGraph;\n");
int index = -1;
for (int i=0; i<iter.embeddingGraph.iteratedsPlusInlined.Length; ++i) {
if (iter.embeddingGraph.iteratedsPlusInlined[i].iteratedPattern == iter) index = i;
}
sb.AppendFrontFormat("minMatchesIter = {0};\n", iter.embeddingGraph.iteratedsPlusInlined[index].minMatches);
sb.AppendFrontFormat("maxMatchesIter = {0};\n", iter.embeddingGraph.iteratedsPlusInlined[index].maxMatches);
sb.AppendFront("numMatchesIter = 0;\n");
if(iter.isIterationBreaking)
sb.AppendFront("breakIteration = false;\n");
sb.Unindent(); // class level
sb.AppendFront("}\n\n");
sb.AppendFront("int minMatchesIter;\n");
sb.AppendFront("int maxMatchesIter;\n");
sb.AppendFront("int numMatchesIter;\n");
if(iter.isIterationBreaking)
sb.AppendFront("bool breakIteration;\n");
sb.Append("\n");
GenerateTasksMemoryPool(sb, className, false, iter.isIterationBreaking, matchingPattern.patternGraph.branchingFactor);
Dictionary<string, bool> neededNodes = new Dictionary<string, bool>();
Dictionary<string, bool> neededEdges = new Dictionary<string, bool>();
Dictionary<string, GrGenType> neededVariables = new Dictionary<string, GrGenType>();
foreach (KeyValuePair<string, bool> neededNode in iter.neededNodes)
neededNodes[neededNode.Key] = neededNode.Value;
foreach (KeyValuePair<string, bool> neededEdge in iter.neededEdges)
neededEdges[neededEdge.Key] = neededEdge.Value;
foreach (KeyValuePair<string, GrGenType> neededVariable in iter.neededVariables)
neededVariables[neededVariable.Key] = neededVariable.Value;
foreach (KeyValuePair<string, bool> node in neededNodes)
{
sb.AppendFront("public GRGEN_LGSP.LGSPNode " + node.Key + ";\n");
}
foreach (KeyValuePair<string, bool> edge in neededEdges)
{
sb.AppendFront("public GRGEN_LGSP.LGSPEdge " + edge.Key + ";\n");
}
foreach (KeyValuePair<string, GrGenType> variable in neededVariables)
{
sb.AppendFront("public " + TypesHelper.TypeName(variable.Value) + " " + variable.Key + ";\n");
}
GenerateIndependentsMatchObjects(sb, matchingPattern, iter);
sb.AppendFront("\n");
}
示例4: GenerateMatcherClassHeadSubpattern
/// <summary>
/// Generates matcher class head source code for the subpattern of the rulePattern into given source builder
/// isInitialStatic tells whether the initial static version or a dynamic version after analyze is to be generated.
/// </summary>
public void GenerateMatcherClassHeadSubpattern(SourceBuilder sb, LGSPMatchingPattern matchingPattern,
bool isInitialStatic)
{
Debug.Assert(!(matchingPattern is LGSPRulePattern));
PatternGraph patternGraph = (PatternGraph)matchingPattern.PatternGraph;
String namePrefix = (isInitialStatic ? "" : "Dyn") + "PatternAction_";
String className = namePrefix + matchingPattern.name;
String matchingPatternClassName = matchingPattern.GetType().Name;
if(patternGraph.Package != null)
{
sb.AppendFrontFormat("namespace {0}\n", patternGraph.Package);
sb.AppendFront("{\n");
sb.Indent();
}
sb.AppendFront("public class " + className + " : GRGEN_LGSP.LGSPSubpatternAction\n");
sb.AppendFront("{\n");
sb.Indent(); // class level
sb.AppendFront("private " + className + "(GRGEN_LGSP.LGSPActionExecutionEnvironment actionEnv_, Stack<GRGEN_LGSP.LGSPSubpatternAction> openTasks_) {\n");
sb.Indent(); // method body level
sb.AppendFront("actionEnv = actionEnv_; openTasks = openTasks_;\n");
sb.AppendFront("patternGraph = " + matchingPatternClassName + ".Instance.patternGraph;\n");
sb.Unindent(); // class level
sb.AppendFront("}\n\n");
GenerateTasksMemoryPool(sb, className, false, false, matchingPattern.patternGraph.branchingFactor);
for (int i = 0; i < patternGraph.nodesPlusInlined.Length; ++i)
{
PatternNode node = patternGraph.nodesPlusInlined[i];
if (node.PointOfDefinition == null)
{
sb.AppendFront("public GRGEN_LGSP.LGSPNode " + node.name + ";\n");
}
}
for (int i = 0; i < patternGraph.edgesPlusInlined.Length; ++i)
{
PatternEdge edge = patternGraph.edgesPlusInlined[i];
if (edge.PointOfDefinition == null)
{
sb.AppendFront("public GRGEN_LGSP.LGSPEdge " + edge.name + ";\n");
}
}
for (int i = 0; i < patternGraph.variablesPlusInlined.Length; ++i)
{
PatternVariable variable = patternGraph.variablesPlusInlined[i];
sb.AppendFront("public " +TypesHelper.TypeName(variable.type) + " " + variable.name + ";\n");
}
GenerateIndependentsMatchObjects(sb, matchingPattern, patternGraph);
sb.AppendFront("\n");
}
示例5: GenerateMatcherClassHeadAction
/// <summary>
/// Generates matcher class head source code for the pattern of the rulePattern into given source builder
/// isInitialStatic tells whether the initial static version or a dynamic version after analyze is to be generated.
/// </summary>
void GenerateMatcherClassHeadAction(SourceBuilder sb, LGSPRulePattern rulePattern,
bool isInitialStatic, SearchProgram searchProgram)
{
PatternGraph patternGraph = (PatternGraph)rulePattern.PatternGraph;
String namePrefix = (isInitialStatic ? "" : "Dyn") + "Action_";
String className = namePrefix + rulePattern.name;
String rulePatternClassName = rulePattern.GetType().Name;
String matchClassName = rulePatternClassName + "." + "Match_" + rulePattern.name;
String matchInterfaceName = rulePatternClassName + "." + "IMatch_" + rulePattern.name;
String actionInterfaceName = "IAction_" + rulePattern.name;
if(patternGraph.Package != null)
{
sb.AppendFrontFormat("namespace {0}\n", patternGraph.Package);
sb.AppendFront("{\n");
sb.Indent();
}
sb.AppendFront("public class " + className + " : GRGEN_LGSP.LGSPAction, "
+ "GRGEN_LIBGR.IAction, " + actionInterfaceName + "\n");
sb.AppendFront("{\n");
sb.Indent(); // class level
sb.AppendFront("public " + className + "() {\n");
sb.Indent(); // method body level
sb.AppendFront("_rulePattern = " + rulePatternClassName + ".Instance;\n");
sb.AppendFront("patternGraph = _rulePattern.patternGraph;\n");
if(rulePattern.patternGraph.branchingFactor < 2)
{
sb.AppendFront("DynamicMatch = myMatch;\n");
if(!isInitialStatic)
sb.AppendFrontFormat("GRGEN_ACTIONS.Action_{0}.Instance.DynamicMatch = myMatch;\n", rulePattern.name);
}
else
{
sb.AppendFront("if(Environment.ProcessorCount == 1)\n");
sb.AppendFront("{\n");
sb.AppendFront("\tDynamicMatch = myMatch;\n");
if(!isInitialStatic)
sb.AppendFrontFormat("\tGRGEN_ACTIONS.Action_{0}.Instance.DynamicMatch = myMatch;\n", rulePattern.name);
sb.AppendFront("}\n");
sb.AppendFront("else\n");
sb.AppendFront("{\n");
sb.Indent();
sb.AppendFront("DynamicMatch = myMatch_parallelized;\n");
if(!isInitialStatic)
sb.AppendFrontFormat("GRGEN_ACTIONS.Action_{0}.Instance.DynamicMatch = myMatch_parallelized;\n", rulePattern.name);
sb.AppendFrontFormat("numWorkerThreads = GRGEN_LGSP.WorkerPool.EnsurePoolSize({0});\n", rulePattern.patternGraph.branchingFactor);
sb.AppendFrontFormat("parallelTaskMatches = new GRGEN_LGSP.LGSPMatchesList<{0}, {1}>[numWorkerThreads];\n", matchClassName, matchInterfaceName);
sb.AppendFront("moveHeadAfterNodes = new List<GRGEN_LGSP.LGSPNode>[numWorkerThreads];\n");
sb.AppendFront("moveHeadAfterEdges = new List<GRGEN_LGSP.LGSPEdge>[numWorkerThreads];\n");
sb.AppendFront("moveOutHeadAfter = new List<KeyValuePair<GRGEN_LGSP.LGSPNode, GRGEN_LGSP.LGSPEdge>>[numWorkerThreads];\n");
sb.AppendFront("moveInHeadAfter = new List<KeyValuePair<GRGEN_LGSP.LGSPNode, GRGEN_LGSP.LGSPEdge>>[numWorkerThreads];\n");
sb.AppendFront("for(int i=0; i<numWorkerThreads; ++i)\n");
sb.AppendFront("{\n");
sb.Indent();
sb.AppendFront("moveHeadAfterNodes[i] = new List<GRGEN_LGSP.LGSPNode>();\n");
sb.AppendFront("moveHeadAfterEdges[i] = new List<GRGEN_LGSP.LGSPEdge>();\n");
sb.AppendFront("moveOutHeadAfter[i] = new List<KeyValuePair<GRGEN_LGSP.LGSPNode, GRGEN_LGSP.LGSPEdge>>();\n");
sb.AppendFront("moveInHeadAfter[i] = new List<KeyValuePair<GRGEN_LGSP.LGSPNode, GRGEN_LGSP.LGSPEdge>>();\n");
sb.Unindent();
sb.AppendFront("}\n");
sb.AppendFront("for(int i=0; i<parallelTaskMatches.Length; ++i)\n");
sb.AppendFrontFormat("\tparallelTaskMatches[i] = new GRGEN_LGSP.LGSPMatchesList<{0}, {1}>(this);\n", matchClassName, matchInterfaceName);
sb.Unindent();
sb.AppendFront("}\n");
}
sb.AppendFrontFormat("ReturnArray = new object[{0}];\n", rulePattern.Outputs.Length);
sb.AppendFront("matches = new GRGEN_LGSP.LGSPMatchesList<" + matchClassName +", " + matchInterfaceName + ">(this);\n");
sb.Unindent(); // class level
sb.AppendFront("}\n\n");
sb.AppendFront("public " + rulePatternClassName + " _rulePattern;\n");
sb.AppendFront("public override GRGEN_LGSP.LGSPRulePattern rulePattern { get { return _rulePattern; } }\n");
sb.AppendFront("public override string Name { get { return \"" + rulePattern.name + "\"; } }\n");
sb.AppendFront("private GRGEN_LGSP.LGSPMatchesList<" + matchClassName + ", " + matchInterfaceName + "> matches;\n\n");
if (isInitialStatic)
{
sb.AppendFront("public static " + className + " Instance { get { return instance; } set { instance = value; } }\n");
sb.AppendFront("private static " + className + " instance = new " + className + "();\n");
}
GenerateIndependentsMatchObjects(sb, rulePattern, patternGraph);
sb.AppendFront("\n");
GenerateParallelizationSetupAsNeeded(sb, rulePattern, searchProgram);
}
示例6: GenerateActionInterface
/// <summary>
// generate the exact action interface
/// </summary>
void GenerateActionInterface(SourceBuilder sb, LGSPRulePattern matchingPattern)
{
String actionInterfaceName = "IAction_"+matchingPattern.name;
String outParameters = "";
String refParameters = "";
String allParameters = "";
for(int i = 0; i < matchingPattern.Outputs.Length; ++i)
{
outParameters += ", out " + TypesHelper.TypeName(matchingPattern.Outputs[i]) + " output_"+i;
refParameters += ", ref " + TypesHelper.TypeName(matchingPattern.Outputs[i]) + " output_"+i;
allParameters += ", List<" + TypesHelper.TypeName(matchingPattern.Outputs[i]) + "> output_"+i;
}
String inParameters = "";
for(int i=0; i<matchingPattern.Inputs.Length; ++i) {
inParameters += ", " + TypesHelper.TypeName(matchingPattern.Inputs[i]) + " " + matchingPattern.InputNames[i];
}
String matchingPatternClassName = matchingPattern.GetType().Name;
String patternName = matchingPattern.name;
String matchType = matchingPatternClassName + "." + NamesOfEntities.MatchInterfaceName(patternName);
String matchesType = "GRGEN_LIBGR.IMatchesExact<" + matchType + ">" ;
if(matchingPattern.PatternGraph.Package != null)
{
sb.AppendFrontFormat("namespace {0}\n", matchingPattern.PatternGraph.Package);
sb.AppendFront("{\n");
sb.Indent();
}
sb.AppendFront("/// <summary>\n");
sb.AppendFront("/// An object representing an executable rule - same as IAction, but with exact types and distinct parameters.\n");
sb.AppendFront("/// </summary>\n");
sb.AppendFrontFormat("public interface {0}\n", actionInterfaceName);
sb.AppendFront("{\n");
sb.Indent();
sb.AppendFront("/// <summary> same as IAction.Match, but with exact types and distinct parameters. </summary>\n");
sb.AppendFrontFormat("{0} Match(GRGEN_LIBGR.IActionExecutionEnvironment actionEnv, int maxMatches{1});\n", matchesType, inParameters);
sb.AppendFront("/// <summary> same as IAction.Modify, but with exact types and distinct parameters. </summary>\n");
sb.AppendFrontFormat("void Modify(GRGEN_LIBGR.IActionExecutionEnvironment actionEnv, {0} match{1});\n", matchType, outParameters);
sb.AppendFront("/// <summary> same as IAction.ModifyAll, but with exact types and distinct parameters. </summary>\n");
sb.AppendFrontFormat("void ModifyAll(GRGEN_LIBGR.IActionExecutionEnvironment actionEnv, {0} matches{1});\n", matchesType, allParameters);
sb.AppendFront("/// <summary> same as IAction.Apply, but with exact types and distinct parameters; returns true if applied </summary>\n");
sb.AppendFrontFormat("bool Apply(GRGEN_LIBGR.IActionExecutionEnvironment actionEnv{0}{1});\n", inParameters, refParameters);
sb.AppendFront("/// <summary> same as IAction.ApplyAll, but with exact types and distinct parameters; returns the number of matches found/applied. </summary>\n");
sb.AppendFrontFormat("int ApplyAll(int maxMatches, GRGEN_LIBGR.IActionExecutionEnvironment actionEnv{0}{1});\n", inParameters, allParameters);
sb.AppendFront("/// <summary> same as IAction.ApplyStar, but with exact types and distinct parameters. </summary>\n");
sb.AppendFrontFormat("bool ApplyStar(GRGEN_LIBGR.IActionExecutionEnvironment actionEnv{0});\n", inParameters);
sb.AppendFront("/// <summary> same as IAction.ApplyPlus, but with exact types and distinct parameters. </summary>\n");
sb.AppendFrontFormat("bool ApplyPlus(GRGEN_LIBGR.IActionExecutionEnvironment actionEnv{0});\n", inParameters);
sb.AppendFront("/// <summary> same as IAction.ApplyMinMax, but with exact types and distinct parameters. </summary>\n");
sb.AppendFrontFormat("bool ApplyMinMax(GRGEN_LIBGR.IActionExecutionEnvironment actionEnv, int min, int max{0});\n", inParameters);
sb.Unindent();
sb.AppendFront("}\n");
if(matchingPattern.PatternGraph.Package != null)
{
sb.Unindent();
sb.AppendFront("}\n");
}
sb.AppendFront("\n");
}
示例7: Emit
public override void Emit(SourceBuilder sourceCode)
{
String id = fetchId().ToString();
if(ContainerType.StartsWith("List"))
{
sourceCode.AppendFrontFormat("{0} entry_{1} = ({0}) " + NamesOfEntities.Variable(Container) + ";\n", ContainerType, id);
sourceCode.AppendFrontFormat("for(int index_{0}=0; index_{0}<entry_{0}.Count; ++index_{0})\n", id);
sourceCode.AppendFront("{\n");
sourceCode.Indent();
if(Index != null)
{
sourceCode.AppendFront(IndexType + " " + NamesOfEntities.Variable(Index) + " = index_" + id + ";\n");
sourceCode.AppendFront(VariableType + " " + NamesOfEntities.Variable(Variable) + " = " + " entry_" + id + "[index_" + id + "];\n");
}
else
{
sourceCode.AppendFront(VariableType + " " + NamesOfEntities.Variable(Variable) + " = " + " entry_" + id + "[index_" + id + "];\n");
}
}
else if(ContainerType.StartsWith("GRGEN_LIBGR.Deque"))
{
sourceCode.AppendFrontFormat("{0} entry_{1} = ({0}) " + NamesOfEntities.Variable(Container) + ";\n", ContainerType, id);
sourceCode.AppendFrontFormat("for(int index_{0}=0; index_{0}<entry_{0}.Count; ++index_{0})\n", id);
sourceCode.AppendFront("{\n");
sourceCode.Indent();
if(Index != null)
{
sourceCode.AppendFront(IndexType + " " + NamesOfEntities.Variable(Index) + " = index_" + id + ";\n");
sourceCode.AppendFront(VariableType + " " + NamesOfEntities.Variable(Variable) + " = " + " entry_" + id + "[index_" + id + "];\n");
}
else
{
sourceCode.AppendFront(VariableType + " " + NamesOfEntities.Variable(Variable) + " = " + " entry_" + id + "[index_" + id + "];\n");
}
}
else if(ContainerType.StartsWith("Dictionary") && ContainerType.Contains("SetValueType"))
{
sourceCode.AppendFrontFormat("foreach(KeyValuePair<{0},GRGEN_LIBGR.SetValueType> entry_{1} in {2})\n", VariableType, id, NamesOfEntities.Variable(Container));
sourceCode.AppendFront("{\n");
sourceCode.Indent();
sourceCode.AppendFront(VariableType + " " + NamesOfEntities.Variable(Variable) + " = " + " entry_" + id + ".Key;\n");
}
else
{
sourceCode.AppendFrontFormat("foreach(KeyValuePair<{0},{1}> entry_{2} in {3})\n", IndexType, VariableType, id, NamesOfEntities.Variable(Container));
sourceCode.AppendFront("{\n");
sourceCode.Indent();
sourceCode.AppendFront(IndexType + " " + NamesOfEntities.Variable(Index) + " = entry_" + id + ".Key;\n");
sourceCode.AppendFront(VariableType + " " + NamesOfEntities.Variable(Variable) + " = " + " entry_" + id + ".Value;\n");
}
foreach(Yielding statement in Statements)
statement.Emit(sourceCode);
sourceCode.Unindent();
sourceCode.AppendFront("}\n");
}
示例8: EmitRuleOrRuleAllCall
void EmitRuleOrRuleAllCall(SequenceRuleCall seqRule, SourceBuilder source)
{
RuleInvocationParameterBindings paramBindings = seqRule.ParamBindings;
String specialStr = seqRule.Special ? "true" : "false";
String parameterDeclarations = null;
String parameters = null;
if(paramBindings.Subgraph != null)
parameters = BuildParametersInDeclarations(paramBindings, out parameterDeclarations);
else
parameters = BuildParameters(paramBindings);
String matchingPatternClassName = TypesHelper.GetPackagePrefixDot(paramBindings.Package) + "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(paramBindings.Subgraph != null)
{
source.AppendFront(parameterDeclarations + "\n");
source.AppendFront("procEnv.SwitchToSubgraph((GRGEN_LIBGR.IGraph)" + GetVar(paramBindings.Subgraph) + ");\n");
source.AppendFront("graph = ((GRGEN_LGSP.LGSPActionExecutionEnvironment)procEnv).graph;\n");
}
source.AppendFront(matchesType + " " + matchesName + " = rule_" + TypesHelper.PackagePrefixedNameUnderscore(paramBindings.Package, paramBindings.Name)
+ ".Match(procEnv, " + (seqRule.SequenceType == SequenceType.RuleCall ? "1" : "procEnv.MaxMatches")
+ parameters + ");\n");
for(int i = 0; i < seqRule.Filters.Count; ++i)
{
EmitFilterCall(source, seqRule.Filters[i], patternName, matchesName);
}
if(gen.FireDebugEvents) source.AppendFront("procEnv.Matched(" + matchesName + ", null, " + specialStr + ");\n");
if(seqRule is SequenceRuleCountAllCall)
{
SequenceRuleCountAllCall seqRuleCountAll = (SequenceRuleCountAllCall)seqRule;
source.AppendFront(SetVar(seqRuleCountAll.CountResult, matchesName + ".Count"));
}
if(seqRule is SequenceRuleAllCall
&& ((SequenceRuleAllCall)seqRule).ChooseRandom
&& ((SequenceRuleAllCall)seqRule).MinSpecified)
{
SequenceRuleAllCall seqRuleAll = (SequenceRuleAllCall)seqRule;
source.AppendFrontFormat("int minmatchesvar_{0} = (int){1};\n", seqRuleAll.Id, GetVar(seqRuleAll.MinVarChooseRandom));
source.AppendFrontFormat("if({0}.Count < minmatchesvar_{1}) {{\n", matchesName, seqRuleAll.Id);
}
else
{
source.AppendFront("if(" + matchesName + ".Count==0) {\n");
}
source.Indent();
source.AppendFront(SetResultVar(seqRule, "false"));
source.Unindent();
source.AppendFront("} else {\n");
source.Indent();
source.AppendFront(SetResultVar(seqRule, "true"));
source.AppendFront("procEnv.PerformanceInfo.MatchesFound += " + matchesName + ".Count;\n");
if(gen.FireDebugEvents) source.AppendFront("procEnv.Finishing(" + matchesName + ", " + specialStr + ");\n");
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)
{
source.AppendFront(matchType + " " + matchName + " = " + matchesName + ".FirstExact;\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");
}
else if(seqRule.SequenceType == SequenceType.RuleCountAllCall || !((SequenceRuleAllCall)seqRule).ChooseRandom) // seq.SequenceType == SequenceType.RuleAll
{
// 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");
source.AppendFront("if(" + matchName + "!=" + matchesName + ".FirstExact) 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.Unindent();
source.AppendFront("}\n");
if(returnAssignments.Length != 0) source.AppendFront(returnAssignmentsAllCall + "\n");
}
else // seq.SequenceType == SequenceType.RuleAll && ((SequenceRuleAll)seqRule).ChooseRandom
{
// as long as a further rewrite has to be selected: randomly choose next match, rewrite it and remove it from available matches; fire the next match event after the first
//.........这里部分代码省略.........
示例9: GenerateInternalDefinedSequenceApplicationMethodStub
private void GenerateInternalDefinedSequenceApplicationMethodStub(SourceBuilder source, DefinedSequenceInfo sequence, String externalActionsExtensionFilename)
{
source.AppendFrontFormat("// You must implement the following function in the same partial class in ./{0}\n", externalActionsExtensionFilename);
source.AppendFront("//public static bool ApplyXGRS_" + sequence.Name + "(GRGEN_LGSP.LGSPGraphProcessingEnvironment procEnv");
for(int i = 0; i < sequence.Parameters.Length; ++i)
{
source.Append(", " + TypesHelper.XgrsTypeToCSharpType(TypesHelper.DotNetTypeToXgrsType(sequence.ParameterTypes[i]), model) + " var_");
source.Append(sequence.Parameters[i]);
}
for(int i = 0; i < sequence.OutParameters.Length; ++i)
{
source.Append(", ref " + TypesHelper.XgrsTypeToCSharpType(TypesHelper.DotNetTypeToXgrsType(sequence.OutParameterTypes[i]), model) + " var_");
source.Append(sequence.OutParameters[i]);
}
source.Append(")\n");
}
示例10: GenerateInternalDefinedSequenceApplicationMethod
private void GenerateInternalDefinedSequenceApplicationMethod(SourceBuilder source, DefinedSequenceInfo sequence, Sequence seq)
{
source.AppendFront("public static bool ApplyXGRS_" + sequence.Name + "(GRGEN_LGSP.LGSPGraphProcessingEnvironment procEnv");
for(int i = 0; i < sequence.Parameters.Length; ++i)
{
source.Append(", " + TypesHelper.XgrsTypeToCSharpType(TypesHelper.DotNetTypeToXgrsType(sequence.ParameterTypes[i]), model) + " var_");
source.Append(sequence.Parameters[i]);
}
for(int i = 0; i < sequence.OutParameters.Length; ++i)
{
source.Append(", ref " + TypesHelper.XgrsTypeToCSharpType(TypesHelper.DotNetTypeToXgrsType(sequence.OutParameterTypes[i]), model) + " var_");
source.Append(sequence.OutParameters[i]);
}
source.Append(")\n");
source.AppendFront("{\n");
source.Indent();
source.AppendFront("GRGEN_LGSP.LGSPGraph graph = procEnv.graph;\n");
source.AppendFront("GRGEN_LGSP.LGSPActions actions = procEnv.curActions;\n");
knownRules.Clear();
if(gen.FireDebugEvents)
{
source.AppendFrontFormat("procEnv.DebugEntering(\"{0}\"", sequence.Name);
for(int i = 0; i < sequence.Parameters.Length; ++i)
{
source.Append(", var_");
source.Append(sequence.Parameters[i]);
}
source.Append(");\n");
}
EmitNeededVarAndRuleEntities(seq, source);
EmitSequence(seq, source);
if(gen.FireDebugEvents)
{
source.AppendFrontFormat("procEnv.DebugExiting(\"{0}\"", sequence.Name);
for(int i = 0; i < sequence.OutParameters.Length; ++i)
{
source.Append(", var_");
source.Append(sequence.OutParameters[i]);
}
source.Append(");\n");
}
source.AppendFront("return " + GetResultVar(seq) + ";\n");
source.Unindent();
source.AppendFront("}\n");
List<SequenceExpressionContainerConstructor> containerConstructors = new List<SequenceExpressionContainerConstructor>();
Dictionary<SequenceVariable, SetValueType> variables = new Dictionary<SequenceVariable, SetValueType>();
seq.GetLocalVariables(variables, containerConstructors, null);
foreach(SequenceExpressionContainerConstructor cc in containerConstructors)
{
GenerateContainerConstructor(cc, source);
}
}
示例11: GenerateDefinedSequence
public bool GenerateDefinedSequence(SourceBuilder source, DefinedSequenceInfo sequence)
{
Dictionary<String, String> varDecls = new Dictionary<String, String>();
for(int i = 0; i < sequence.Parameters.Length; i++)
{
varDecls.Add(sequence.Parameters[i], TypesHelper.DotNetTypeToXgrsType(sequence.ParameterTypes[i]));
}
for(int i = 0; i < sequence.OutParameters.Length; i++)
{
varDecls.Add(sequence.OutParameters[i], TypesHelper.DotNetTypeToXgrsType(sequence.OutParameterTypes[i]));
}
Sequence seq;
try
{
List<string> warnings = new List<string>();
seq = SequenceParser.ParseSequence(sequence.XGRS, sequence.Package,
ruleNames, sequenceNames, procedureNames, functionNames,
functionOutputTypes, filterFunctionNames, varDecls, model, warnings);
foreach(string warning in warnings)
{
Console.Error.WriteLine("In the defined sequence " + sequence.Name
+ " the exec part \"" + sequence.XGRS
+ "\" reported back:\n" + warning);
}
seq.Check(env);
seq.SetNeedForProfilingRecursive(gen.EmitProfiling);
}
catch(ParseException ex)
{
Console.Error.WriteLine("In the defined sequence " + sequence.Name
+ " the exec part \"" + sequence.XGRS
+ "\" caused the following error:\n" + ex.Message);
return false;
}
catch(SequenceParserException ex)
{
Console.Error.WriteLine("In the defined sequence " + sequence.Name
+ " the exec part \"" + sequence.XGRS
+ "\" caused the following error:\n");
HandleSequenceParserException(ex);
return false;
}
// exact sequence definition compiled class
source.Append("\n");
if(sequence.Package != null)
{
source.AppendFrontFormat("namespace {0}\n", sequence.Package);
source.AppendFront("{\n");
source.Indent();
}
source.AppendFront("public class Sequence_" + sequence.Name + " : GRGEN_LIBGR.SequenceDefinitionCompiled\n");
source.AppendFront("{\n");
source.Indent();
GenerateSequenceDefinedSingleton(source, sequence);
source.Append("\n");
GenerateInternalDefinedSequenceApplicationMethod(source, sequence, seq);
source.Append("\n");
GenerateExactExternalDefinedSequenceApplicationMethod(source, sequence);
source.Append("\n");
GenerateGenericExternalDefinedSequenceApplicationMethod(source, sequence);
// end of exact sequence definition compiled class
source.Unindent();
source.AppendFront("}\n");
if(sequence.Package != null)
{
source.Unindent();
source.AppendFront("}\n");
}
return true;
}
示例12: GenerateXGRSCode
public bool GenerateXGRSCode(string xgrsName, String package, String xgrsStr,
String[] paramNames, GrGenType[] paramTypes,
String[] defToBeYieldedToNames, GrGenType[] defToBeYieldedToTypes,
SourceBuilder source, int lineNr)
{
Dictionary<String, String> varDecls = new Dictionary<String, String>();
for (int i = 0; i < paramNames.Length; i++)
{
varDecls.Add(paramNames[i], TypesHelper.DotNetTypeToXgrsType(paramTypes[i]));
}
for(int i = 0; i < defToBeYieldedToNames.Length; i++)
{
varDecls.Add(defToBeYieldedToNames[i], TypesHelper.DotNetTypeToXgrsType(defToBeYieldedToTypes[i]));
}
Sequence seq;
try
{
List<string> warnings = new List<string>();
seq = SequenceParser.ParseSequence(xgrsStr, package,
ruleNames, sequenceNames, procedureNames, functionNames,
functionOutputTypes, filterFunctionNames, varDecls, model, warnings);
foreach(string warning in warnings)
{
Console.Error.WriteLine("The exec statement \"" + xgrsStr
+ "\" given on line " + lineNr + " reported back:\n" + warning);
}
seq.Check(env);
seq.SetNeedForProfilingRecursive(gen.EmitProfiling);
}
catch(ParseException ex)
{
Console.Error.WriteLine("The exec statement \"" + xgrsStr
+ "\" given on line " + lineNr + " caused the following error:\n" + ex.Message);
return false;
}
catch(SequenceParserException ex)
{
Console.Error.WriteLine("The exec statement \"" + xgrsStr
+ "\" given on line " + lineNr + " caused the following error:\n");
HandleSequenceParserException(ex);
return false;
}
source.Append("\n");
source.AppendFront("public static bool ApplyXGRS_" + xgrsName + "(GRGEN_LGSP.LGSPGraphProcessingEnvironment procEnv");
for(int i = 0; i < paramNames.Length; i++)
{
source.Append(", " + TypesHelper.XgrsTypeToCSharpType(TypesHelper.DotNetTypeToXgrsType(paramTypes[i]), model) + " var_");
source.Append(paramNames[i]);
}
for(int i = 0; i < defToBeYieldedToTypes.Length; i++)
{
source.Append(", ref " + TypesHelper.XgrsTypeToCSharpType(TypesHelper.DotNetTypeToXgrsType(defToBeYieldedToTypes[i]), model) + " var_");
source.Append(defToBeYieldedToNames[i]);
}
source.Append(")\n");
source.AppendFront("{\n");
source.Indent();
source.AppendFront("GRGEN_LGSP.LGSPGraph graph = procEnv.graph;\n");
source.AppendFront("GRGEN_LGSP.LGSPActions actions = procEnv.curActions;\n");
knownRules.Clear();
if(gen.FireDebugEvents)
{
source.AppendFrontFormat("procEnv.DebugEntering(\"{0}\", \"{1}\");\n", InjectExec(xgrsName), xgrsStr.Replace("\\", "\\\\").Replace("\"", "\\\""));
}
EmitNeededVarAndRuleEntities(seq, source);
EmitSequence(seq, source);
if(gen.FireDebugEvents)
{
source.AppendFrontFormat("procEnv.DebugExiting(\"{0}\");\n", InjectExec(xgrsName));
}
source.AppendFront("return " + GetResultVar(seq) + ";\n");
source.Unindent();
source.AppendFront("}\n");
List<SequenceExpressionContainerConstructor> containerConstructors = new List<SequenceExpressionContainerConstructor>();
Dictionary<SequenceVariable, SetValueType> variables = new Dictionary<SequenceVariable, SetValueType>();
seq.GetLocalVariables(variables, containerConstructors, null);
foreach(SequenceExpressionContainerConstructor cc in containerConstructors)
{
GenerateContainerConstructor(cc, source);
}
return true;
}
示例13: EmitSequenceComputation
//.........这里部分代码省略.........
case SequenceComputationType.GraphRetype:
{
SequenceComputationGraphRetype seqRetype = (SequenceComputationGraphRetype)seqComp;
string typeExpr = GetSequenceExpression(seqRetype.TypeExpr, source);
string elemExpr = GetSequenceExpression(seqRetype.ElemExpr, source);
source.Append("GRGEN_LIBGR.GraphHelper.RetypeGraphElement((GRGEN_LIBGR.IGraphElement)" + elemExpr + ", " + typeExpr + ", graph)");
break;
}
case SequenceComputationType.GraphAddCopy:
{
SequenceComputationGraphAddCopy seqAddCopy = (SequenceComputationGraphAddCopy)seqComp;
if(seqAddCopy.ExprSrc == null)
{
string nodeExpr = GetSequenceExpression(seqAddCopy.Expr, source);
source.Append("GRGEN_LIBGR.GraphHelper.AddCopyOfNode(" + nodeExpr + ", graph)");
}
else
{
string edgeExpr = GetSequenceExpression(seqAddCopy.Expr, source);
string srcExpr = GetSequenceExpression(seqAddCopy.ExprSrc, source);
string tgtExpr = GetSequenceExpression(seqAddCopy.ExprDst, source);
source.Append("GRGEN_LIBGR.GraphHelper.AddCopyOfEdge(" + edgeExpr + ", (GRGEN_LIBGR.INode)" + srcExpr + ", (GRGEN_LIBGR.INode)" + tgtExpr + ", graph)");
}
break;
}
case SequenceComputationType.GraphMerge:
{
SequenceComputationGraphMerge seqMrg = (SequenceComputationGraphMerge)seqComp;
string tgtNodeExpr = GetSequenceExpression(seqMrg.TargetNodeExpr, source);
string srcNodeExpr = GetSequenceExpression(seqMrg.SourceNodeExpr, source);
source.AppendFrontFormat("graph.Merge((GRGEN_LIBGR.INode){0}, (GRGEN_LIBGR.INode){1}, \"merge\");\n", tgtNodeExpr, srcNodeExpr);
source.AppendFront(SetResultVar(seqMrg, "null"));
break;
}
case SequenceComputationType.GraphRedirectSource:
{
SequenceComputationGraphRedirectSource seqRedir = (SequenceComputationGraphRedirectSource)seqComp;
string edgeExpr = GetSequenceExpression(seqRedir.EdgeExpr, source);
string srcNodeExpr = GetSequenceExpression(seqRedir.SourceNodeExpr, source);
source.AppendFrontFormat("graph.RedirectSource((GRGEN_LIBGR.IEdge){0}, (GRGEN_LIBGR.INode){1}, \"old source\");\n", edgeExpr, srcNodeExpr);
source.AppendFront(SetResultVar(seqRedir, "null"));
break;
}
case SequenceComputationType.GraphRedirectTarget:
{
SequenceComputationGraphRedirectTarget seqRedir = (SequenceComputationGraphRedirectTarget)seqComp;
string edgeExpr = GetSequenceExpression(seqRedir.EdgeExpr, source);
string tgtNodeExpr = GetSequenceExpression(seqRedir.TargetNodeExpr, source);
source.AppendFrontFormat("graph.RedirectTarget((GRGEN_LIBGR.IEdge){0}, (GRGEN_LIBGR.INode){1}, \"old target\");\n", edgeExpr, tgtNodeExpr);
source.AppendFront(SetResultVar(seqRedir, "null"));
break;
}
case SequenceComputationType.GraphRedirectSourceAndTarget:
{
SequenceComputationGraphRedirectSourceAndTarget seqRedir = (SequenceComputationGraphRedirectSourceAndTarget)seqComp;
string edgeExpr = GetSequenceExpression(seqRedir.EdgeExpr, source);
string srcNodeExpr = GetSequenceExpression(seqRedir.SourceNodeExpr, source);
string tgtNodeExpr = GetSequenceExpression(seqRedir.TargetNodeExpr, source);
source.AppendFrontFormat("graph.RedirectSourceAndTarget((GRGEN_LIBGR.IEdge){0}, (GRGEN_LIBGR.INode){1}, (GRGEN_LIBGR.INode){2}, \"old source\", \"old target\");\n", edgeExpr, srcNodeExpr, tgtNodeExpr);
source.AppendFront(SetResultVar(seqRedir, "null"));
示例14: EmitFilterCall
void EmitFilterCall(SourceBuilder source, FilterCall filterCall, string patternName, string matchesName)
{
if(filterCall.Name == "keepFirst" || filterCall.Name == "removeFirst"
|| filterCall.Name == "keepFirstFraction" || filterCall.Name == "removeFirstFraction"
|| filterCall.Name == "keepLast" || filterCall.Name == "removeLast"
|| filterCall.Name == "keepLastFraction" || filterCall.Name == "removeLastFraction")
{
switch(filterCall.Name)
{
case "keepFirst":
source.AppendFrontFormat("{0}.FilterKeepFirst((int)({1}));\n",
matchesName, GetSequenceExpression(filterCall.ArgumentExpressions[0], source));
break;
case "keepLast":
source.AppendFrontFormat("{0}.FilterKeepLast((int)({1}));\n",
matchesName, GetSequenceExpression(filterCall.ArgumentExpressions[0], source));
break;
case "keepFirstFraction":
source.AppendFrontFormat("{0}.FilterKeepFirstFraction((double)({1}));\n",
matchesName, GetSequenceExpression(filterCall.ArgumentExpressions[0], source));
break;
case "keepLastFraction":
source.AppendFrontFormat("{0}.FilterKeepLastFraction((double)({1}));\n",
matchesName, GetSequenceExpression(filterCall.ArgumentExpressions[0], source));
break;
case "removeFirst":
source.AppendFrontFormat("{0}.FilterRemoveFirst((int)({1}));\n",
matchesName, GetSequenceExpression(filterCall.ArgumentExpressions[0], source));
break;
case "removeLast":
source.AppendFrontFormat("{0}.FilterRemoveLast((int)({1}));\n",
matchesName, GetSequenceExpression(filterCall.ArgumentExpressions[0], source));
break;
case "removeFirstFraction":
source.AppendFrontFormat("{0}.FilterRemoveFirstFraction((double)({1}));\n",
matchesName, GetSequenceExpression(filterCall.ArgumentExpressions[0], source));
break;
case "removeLastFraction":
source.AppendFrontFormat("{0}.FilterRemoveLastFraction((double)({1}));\n",
matchesName, GetSequenceExpression(filterCall.ArgumentExpressions[0], source));
break;
}
}
else
{
if(filterCall.IsAutoGenerated && filterCall.Name == "auto")
source.AppendFrontFormat("GRGEN_ACTIONS.{0}MatchFilters.Filter_{1}_{2}(procEnv, {3});\n",
TypesHelper.GetPackagePrefixDot(filterCall.Package), patternName, filterCall.Name, matchesName);
else if(filterCall.IsAutoGenerated)
source.AppendFrontFormat("GRGEN_ACTIONS.{0}MatchFilters.Filter_{1}_{2}_{3}(procEnv, {4});\n",
TypesHelper.GetPackagePrefixDot(filterCall.Package), patternName, filterCall.Name, filterCall.Entity, matchesName);
else
{
source.AppendFrontFormat("GRGEN_ACTIONS.{0}MatchFilters.Filter_{1}(procEnv, {2}",
TypesHelper.GetPackagePrefixDot(filterCall.Package), filterCall.Name, matchesName);
for(int i = 0; i < filterCall.ArgumentExpressions.Length; ++i)
{
source.AppendFormat(", ({0})({1})",
TypesHelper.XgrsTypeToCSharpType(filterFunctionsToInputTypes[filterCall.Name][i], model),
GetSequenceExpression(filterCall.ArgumentExpressions[i], source));
}
source.Append(");\n");
}
}
}
示例15: GenerateContainerConstructor
void GenerateContainerConstructor(SequenceExpressionContainerConstructor cc, SourceBuilder source)
{
string containerType = TypesHelper.XgrsTypeToCSharpType(GetContainerType(cc), model);
string valueType = TypesHelper.XgrsTypeToCSharpType(cc.ValueType, model);
string keyType = null;
if(cc is SequenceExpressionMapConstructor)
keyType = TypesHelper.XgrsTypeToCSharpType(((SequenceExpressionMapConstructor)cc).KeyType, model);
source.Append("\n");
source.AppendFront("public static ");
source.Append(containerType);
source.Append(" fillFromSequence_" + cc.Id);
source.Append("(");
for(int i = 0; i < cc.ContainerItems.Length; ++i)
{
if(i > 0)
source.Append(", ");
if(keyType != null)
source.AppendFormat("{0} paramkey{1}, ", keyType, i);
source.AppendFormat("{0} param{1}", valueType, i);
}
source.Append(")\n");
source.AppendFront("{\n");
source.Indent();
source.AppendFrontFormat("{0} container = new {0}();\n", containerType);
for(int i = 0; i < cc.ContainerItems.Length; ++i)
{
if(cc is SequenceExpressionSetConstructor)
source.AppendFrontFormat("container.Add(param{0}, null);\n", i);
else if(cc is SequenceExpressionMapConstructor)
source.AppendFrontFormat("container.Add(paramkey{0}, param{0});\n", i);
else if(cc is SequenceExpressionArrayConstructor)
source.AppendFrontFormat("container.Add(param{0});\n", i);
else //if(cc is SequenceExpressionDequeConstructor)
source.AppendFrontFormat("container.Enqueue(param{0});\n", i);
}
source.AppendFront("return container;\n");
source.Unindent();
source.AppendFront("}\n");
}