public override void Dump(SourceBuilder builder) { builder.AppendFront("ContinueOperation "); if (Type == ContinueOperationType.ByReturn) { builder.Append("ByReturn "); if (InParallelizedBody) { builder.Append("InParallelizedBody "); } builder.AppendFormat("return matches:{0}\n", ReturnMatches); } else if (Type == ContinueOperationType.ByContinue) { builder.AppendFormat("ByContinue {0}\n", ContinueAtParallelizedLoop ? "AtParallelizedLoop" : ""); } else // Type==ContinueOperationType.ByGoto { builder.Append("ByGoto "); builder.AppendFormat("{0}\n", LabelName); } }
public override void Dump(SourceBuilder builder) { // first dump check builder.Append("CheckCandidate ForIdentity "); builder.AppendFormat("by {0} == {1}\n", PatternElementName, OtherPatternElementName); // then operations for case check failed if (CheckFailedOperations != null) { builder.Indent(); CheckFailedOperations.Dump(builder); builder.Unindent(); } }
public override void Dump(SourceBuilder builder) { // first dump check builder.AppendFront("CheckCandidate MapByUnique "); builder.AppendFormat("on {0} node:{1}\n", PatternElementName, IsNode); // then operations for case check failed if (CheckFailedOperations != null) { builder.Indent(); CheckFailedOperations.Dump(builder); builder.Unindent(); } }
public override void Dump(SourceBuilder builder) { // first dump check builder.AppendFront("CheckCandidate ForConnectedness "); builder.AppendFormat("{0}=={1}.{2}\n", PatternNodeName, PatternEdgeName, ConnectednessType.ToString()); // then operations for case check failed if (CheckFailedOperations != null) { builder.Indent(); CheckFailedOperations.Dump(builder); builder.Unindent(); } }
public override void Dump(SourceBuilder builder) { // first dump check builder.AppendFront("CheckCandidate ForIsomorphyGlobal "); builder.AppendFormat("on {0} node:{1} ", PatternElementName, IsNode); if (GloballyHomomorphElements != null) { builder.Append("but accept if "); foreach (string name in GloballyHomomorphElements) { builder.AppendFormat("{0} ", name); } } builder.Append("\n"); // then operations for case check failed if (CheckFailedOperations != null) { builder.Indent(); CheckFailedOperations.Dump(builder); builder.Unindent(); } }
public override void Dump(SourceBuilder builder) { if (Type == PushAndPopSubpatternTaskTypes.Subpattern) { builder.AppendFront("PushSubpatternTask Subpattern "); } else if (Type == PushAndPopSubpatternTaskTypes.Alternative) { builder.AppendFront("PushSubpatternTask Alternative "); } else // Type==PushAndPopSubpatternTaskTypes.Iterated { builder.AppendFront("PushSubpatternTask Iterated "); } if (Type == PushAndPopSubpatternTaskTypes.Subpattern) { builder.AppendFormat("{0} of {1} ", SubpatternElementName, SubpatternName); } else { builder.AppendFormat("{0}/{1} ", PathPrefix, AlternativeOrIteratedName); } if (Parallel) { builder.Append("Parallel "); } builder.Append("with "); for (int i = 0; i < ConnectionName.Length; ++i) { builder.AppendFormat("{0} <- {1} ", ConnectionName[i], ArgumentExpressions[i]); } builder.Append("\n"); }
public override void Dump(SourceBuilder builder) { // first dump check builder.AppendFront("CheckCandidate ForIsomorphyPatternPath "); builder.AppendFormat("on {0} node:{1} last match at previous nesting level in:{2}", PatternElementName, IsNode, LastMatchAtPreviousNestingLevel); builder.Append("\n"); // then operations for case check failed if (CheckFailedOperations != null) { builder.Indent(); CheckFailedOperations.Dump(builder); builder.Unindent(); } }
void EmitHashComputation(SourceBuilder sourceCode, int i) { if (i < 0) { sourceCode.Append("23"); } else { sourceCode.Append("("); EmitHashComputation(sourceCode, i - 1); sourceCode.AppendFormat("*17 + {0}.GetHashCode()", NamesOfEntities.CandidateVariable(NeededElements[i])); sourceCode.Append(")"); } }
public override void Dump(SourceBuilder builder) { // first dump local content builder.AppendFront("CheckPartialMatch ForDuplicate with "); foreach (string neededElement in NeededElements) { builder.AppendFormat("{0} ", neededElement); } builder.Append("\n"); // then operations for case check failed if (CheckFailedOperations != null) { builder.Indent(); CheckFailedOperations.Dump(builder); builder.Unindent(); } }
public override void Emit(SourceBuilder sourceCode) { // emit check decision string variableContainingCandidate = NamesOfEntities.CandidateVariable(PatternElementName); if (Type == CheckCandidateForTypeType.ByIsAllowedType) { string isAllowedTypeArrayMemberOfRulePattern = IsAllowedArrayName + "_IsAllowedType"; sourceCode.AppendFrontFormat("if(!{0}.{1}[{2}.lgspType.TypeID]) ", RulePatternTypeName, isAllowedTypeArrayMemberOfRulePattern, variableContainingCandidate); } else if (Type == CheckCandidateForTypeType.ByIsMyType) { sourceCode.AppendFrontFormat("if(!{0}.isMyType[{1}.lgspType.TypeID]) ", TypeName, variableContainingCandidate); } else // Type == CheckCandidateForTypeType.ByTypeID) { sourceCode.AppendFront("if("); bool first = true; foreach (string typeID in TypeIDs) { if (first) { first = false; } else { sourceCode.Append(" && "); } sourceCode.AppendFormat("{0}.lgspType.TypeID!={1}", variableContainingCandidate, typeID); } sourceCode.Append(") "); } // emit check failed code sourceCode.Append("{\n"); sourceCode.Indent(); CheckFailedOperations.Emit(sourceCode); sourceCode.Unindent(); sourceCode.AppendFront("}\n"); }
public override void Dump(SourceBuilder builder) { Debug.Assert(CheckFailedOperations == null, "check negative without direct check failed code"); // first dump local content builder.AppendFront("CheckPartialMatch ByNegative with "); foreach (string neededElement in NeededElements) { builder.AppendFormat("{0} ", neededElement); } builder.Append("\n"); // then nested content if (NestedOperationsList != null) { builder.Indent(); NestedOperationsList.Dump(builder); builder.Unindent(); } }
public static void EmitPreMatchEventFiring(SourceBuilder source, SequenceRuleCallMatcherGenerator[] ruleMatcherGenerators) { source.AppendFront("procEnv.PreMatched("); bool first = true; foreach (SequenceRuleCallMatcherGenerator ruleMatcherGenerator in ruleMatcherGenerators) { if (first) { first = false; } else { source.Append(","); } source.AppendFormat("{0}", ruleMatcherGenerator.matchesName); } source.Append(");\n"); }
private static void GenerateInternalObjectTypeAttributeInitializer(SequenceCheckingEnvironment env, IGraphModel model, SequenceExpressionNew attributeInitializer, SourceBuilder source) { if (attributeInitializer.AttributeInitializationList == null) { return; // plain constructor without attribute initialization list } string internalObjectType = "GRGEN_MODEL." + attributeInitializer.ConstructedType; source.Append("\n"); source.AppendFront("public static "); source.Append(internalObjectType); source.Append(" fillFromSequence_" + attributeInitializer.Id + "("); BaseObjectType objectType = env.Model.ObjectModel.GetType(attributeInitializer.ConstructedType); if (objectType != null) { source.Append("long uniqueId"); } for (int i = 0; i < attributeInitializer.AttributeInitializationList.Count; ++i) { KeyValuePair <string, SequenceExpression> attributeInitialization = attributeInitializer.AttributeInitializationList[i]; if (i > 0 || objectType != null) { source.Append(", "); } string valueType = TypesHelper.XgrsTypeToCSharpType(env.TypeOfMemberOrAttribute(attributeInitializer.ConstructedType, attributeInitialization.Key), model); source.AppendFormat("{0} {1}", valueType, "param" + i); } source.Append(")\n"); source.AppendFront("{\n"); source.Indent(); source.AppendFrontFormat("{0} obj = new {0}({1});\n", internalObjectType, objectType != null ? "uniqueId" : ""); for (int i = 0; i < attributeInitializer.AttributeInitializationList.Count; ++i) { KeyValuePair <string, SequenceExpression> attributeInitialization = attributeInitializer.AttributeInitializationList[i]; source.AppendFrontFormat("obj.{0} = {1};\n", attributeInitialization.Key, "param" + i); } source.AppendFront("return obj;\n"); source.Unindent(); source.AppendFront("}\n"); }
public override void Emit(SourceBuilder sourceCode) { if (sourceCode.CommentSourceCode) { sourceCode.AppendFront("// Condition \n"); } // open decision sourceCode.AppendFront("if("); // emit condition expression sourceCode.AppendFormat("!({0})", ConditionExpression); // close decision sourceCode.Append(") "); // emit check failed code sourceCode.Append("{\n"); sourceCode.Indent(); CheckFailedOperations.Emit(sourceCode); sourceCode.Unindent(); sourceCode.AppendFront("}\n"); }
public override void Dump(SourceBuilder builder) { // first dump check builder.AppendFront("CheckPartialMatch ByCondition "); builder.AppendFormat("{0} with ", ConditionExpression); foreach (string neededElement in NeededElements) { builder.Append(neededElement); builder.Append(" "); } foreach (string neededVar in NeededVariables) { builder.Append(neededVar); builder.Append(" "); } builder.Append("\n"); // then operations for case check failed if (CheckFailedOperations != null) { builder.Indent(); CheckFailedOperations.Dump(builder); builder.Unindent(); } }
private static void GenerateAutomorphyFilter(SourceBuilder source, LGSPRulePattern rulePattern) { String rulePatternClassName = TypesHelper.GetPackagePrefixDot(rulePattern.PatternGraph.Package) + rulePattern.GetType().Name; String matchInterfaceName = rulePatternClassName + "." + NamesOfEntities.MatchInterfaceName(rulePattern.name); String matchClassName = rulePatternClassName + "." + NamesOfEntities.MatchClassName(rulePattern.name); String matchesListType = "GRGEN_LIBGR.IMatchesExact<" + matchInterfaceName + ">"; String filterName = "auto"; source.AppendFrontFormat("public static void Filter_{0}_{1}(GRGEN_LGSP.LGSPGraphProcessingEnvironment procEnv, {2} matches)\n", rulePattern.name, filterName, matchesListType); source.AppendFront("{\n"); source.Indent(); source.AppendFront("if(matches.Count < 2)\n"); source.AppendFront("\treturn;\n"); source.AppendFrontFormat("List<{0}> matchesArray = matches.ToList();\n", matchInterfaceName); source.AppendFrontFormat("if(matches.Count < 5 || {0}.Instance.patternGraph.nodes.Length + {0}.Instance.patternGraph.edges.Length < 1)\n", rulePatternClassName); source.AppendFront("{\n"); source.Indent(); source.AppendFront("for(int i = 0; i < matchesArray.Count; ++i)\n"); source.AppendFront("{\n"); source.Indent(); source.AppendFront("if(matchesArray[i] == null)\n"); source.AppendFront("\tcontinue;\n"); source.AppendFront("for(int j = i + 1; j < matchesArray.Count; ++j)\n"); source.AppendFront("{\n"); source.Indent(); source.AppendFront("if(matchesArray[j] == null)\n"); source.AppendFront("\tcontinue;\n"); source.AppendFront("if(GRGEN_LIBGR.SymmetryChecker.AreSymmetric(matchesArray[i], matchesArray[j], procEnv.graph))\n"); source.AppendFront("\tmatchesArray[j] = null;\n"); source.Unindent(); source.AppendFront("}\n"); source.Unindent(); source.AppendFront("}\n"); source.Unindent(); source.AppendFront("}\n"); source.AppendFront("else\n"); source.AppendFront("{\n"); source.Indent(); source.AppendFrontFormat("Dictionary<int, {0}> foundMatchesOfSameMainPatternHash = new Dictionary<int, {0}>();\n", matchClassName); source.AppendFront("for(int i = 0; i < matchesArray.Count; ++i)\n"); source.AppendFront("{\n"); source.Indent(); source.AppendFrontFormat("{0} match = ({0})matchesArray[i];\n", matchClassName); source.AppendFront("int duplicateMatchHash = 0;\n"); source.AppendFront("for(int j = 0; j < match.NumberOfNodes; ++j) duplicateMatchHash ^= match.getNodeAt(j).GetHashCode();\n"); source.AppendFront("for(int j = 0; j < match.NumberOfEdges; ++j) duplicateMatchHash ^= match.getEdgeAt(j).GetHashCode();\n"); source.AppendFront("bool contained = foundMatchesOfSameMainPatternHash.ContainsKey(duplicateMatchHash);\n"); source.AppendFront("if(contained)\n"); source.AppendFront("{\n"); source.Indent(); source.AppendFrontFormat("{0} duplicateMatchCandidate = foundMatchesOfSameMainPatternHash[duplicateMatchHash];\n", matchClassName); source.AppendFront("do\n"); source.AppendFront("{\n"); source.Indent(); source.AppendFront("if(GRGEN_LIBGR.SymmetryChecker.AreSymmetric(match, duplicateMatchCandidate, procEnv.graph))\n"); source.AppendFront("{\n"); source.Indent(); source.AppendFront("matchesArray[i] = null;\n"); source.AppendFrontFormat("goto label_auto_{0};\n", rulePatternClassName.Replace('.', '_')); source.Unindent(); source.AppendFront("}\n"); source.Unindent(); source.AppendFront("}\n"); source.AppendFront("while((duplicateMatchCandidate = duplicateMatchCandidate.nextWithSameHash) != null);\n"); source.Unindent(); source.AppendFront("}\n"); source.AppendFront("if(!contained)\n"); source.AppendFront("\tfoundMatchesOfSameMainPatternHash[duplicateMatchHash] = match;\n"); source.AppendFront("else\n"); source.AppendFront("{\n"); source.Indent(); source.AppendFrontFormat("{0} duplicateMatchCandidate = foundMatchesOfSameMainPatternHash[duplicateMatchHash];\n", matchClassName); source.AppendFront("while(duplicateMatchCandidate.nextWithSameHash != null) duplicateMatchCandidate = duplicateMatchCandidate.nextWithSameHash;\n"); source.AppendFront("duplicateMatchCandidate.nextWithSameHash = match;\n"); source.Unindent(); source.AppendFront("}\n"); source.AppendFormat("label_auto_{0}: ;\n", rulePatternClassName.Replace('.', '_')); source.Unindent(); source.AppendFront("}\n"); source.AppendFrontFormat("foreach({0} toClean in foundMatchesOfSameMainPatternHash.Values) toClean.CleanNextWithSameHash();\n", matchClassName); source.Unindent(); source.AppendFront("}\n"); source.AppendFront("matches.FromList();\n"); source.Unindent(); source.AppendFront("}\n"); }
public void GenerateFilterStubs(SourceBuilder source, LGSPRulePattern rulePattern) { String rulePatternClassName = rulePattern.GetType().Name; String matchInterfaceName = rulePatternClassName + "." + NamesOfEntities.MatchInterfaceName(rulePattern.name); String matchesListType = "GRGEN_LIBGR.IMatchesExact<" + matchInterfaceName + ">"; foreach(IFilter filter in rulePattern.Filters) { if(filter is IFilterAutoGenerated) continue; IFilterFunction filterFunction = (IFilterFunction)filter; if(!filterFunction.IsExternal) continue; if(filter.Package != null) { source.AppendFrontFormat("namespace {0}\n", filter.Package); source.AppendFront("{\n"); source.Indent(); } source.AppendFront("public partial class MatchFilters\n"); source.AppendFront("{\n"); source.Indent(); source.AppendFrontFormat("//public static void Filter_{0}(GRGEN_LGSP.LGSPGraphProcessingEnvironment procEnv, {1} matches", filter.Name, matchesListType); for(int i = 0; i < filterFunction.Inputs.Length; ++i) { source.AppendFormat(", {0} {1}", TypesHelper.TypeName(filterFunction.Inputs[i]), filterFunction.InputNames[i]); } source.Append(")\n"); source.Unindent(); source.AppendFront("}\n"); if(filter.Package != null) { source.Unindent(); source.AppendFront("}\n"); } } }
void EmitSequenceComputation(SequenceComputation seqComp, SourceBuilder source) { // take care that the operations returning a value are emitted similarily to expressions, // whereas the operations returning no value are emitted as statements switch(seqComp.SequenceComputationType) { case SequenceComputationType.Then: { SequenceComputationThen seqThen = (SequenceComputationThen)seqComp; EmitSequenceComputation(seqThen.left, source); EmitSequenceComputation(seqThen.right, source); source.AppendFront(SetResultVar(seqThen, GetResultVar(seqThen.right))); break; } case SequenceComputationType.Assignment: { SequenceComputationAssignment seqAssign = (SequenceComputationAssignment)seqComp; if(seqAssign.SourceValueProvider is SequenceComputationAssignment) { EmitSequenceComputation(seqAssign.SourceValueProvider, source); EmitAssignment(seqAssign.Target, GetResultVar(seqAssign.SourceValueProvider), source); source.AppendFront(SetResultVar(seqAssign, GetResultVar(seqAssign.Target))); } else { string comp = GetSequenceExpression((SequenceExpression)seqAssign.SourceValueProvider, source); EmitAssignment(seqAssign.Target, comp, source); source.AppendFront(SetResultVar(seqAssign, GetResultVar(seqAssign.Target))); } break; } case SequenceComputationType.VariableDeclaration: { SequenceComputationVariableDeclaration seqVarDecl = (SequenceComputationVariableDeclaration)seqComp; source.AppendFront(SetVar(seqVarDecl.Target, TypesHelper.DefaultValueString(seqVarDecl.Target.Type, model))); source.AppendFront(SetResultVar(seqVarDecl, GetVar(seqVarDecl.Target))); break; } case SequenceComputationType.ContainerAdd: { SequenceComputationContainerAdd seqAdd = (SequenceComputationContainerAdd)seqComp; string container = GetContainerValue(seqAdd); if(seqAdd.ContainerType(env) == "") { if(seqAdd.Attribute != null) { source.AppendFront("GRGEN_LIBGR.IGraphElement elem_" + seqAdd.Id + " = (GRGEN_LIBGR.IGraphElement)" + GetVar(seqAdd.Attribute.SourceVar) + ";\n"); source.AppendFront("GRGEN_LIBGR.AttributeType attrType_" + seqAdd.Id + " = elem_" + seqAdd.Id + ".Type.GetAttributeType(\"" + seqAdd.Attribute.AttributeName + "\");\n"); } string containerVar = "tmp_eval_once_" + seqAdd.Id; source.AppendFront("object " + containerVar + " = " + container + ";\n"); string sourceValue = "srcval_" + seqAdd.Id; source.AppendFront("object " + sourceValue + " = " + GetSequenceExpression(seqAdd.Expr, source) + ";\n"); string destinationValue = seqAdd.ExprDst == null ? null : "dstval_" + seqAdd.Id; source.AppendFront("if(" + containerVar + " is IList) {\n"); source.Indent(); if(destinationValue != null && !TypesHelper.IsSameOrSubtype(seqAdd.ExprDst.Type(env), "int", model)) source.AppendFront("throw new Exception(\"Can't add non-int key to array\");\n"); else { string array = "((System.Collections.IList)" + containerVar + ")"; if(destinationValue != null) source.AppendFront("int " + destinationValue + " = (int)" + GetSequenceExpression(seqAdd.ExprDst, source) + ";\n"); if(seqAdd.Attribute != null) { if(destinationValue != null) { source.AppendFront("if(elem_" + seqAdd.Id + " is GRGEN_LIBGR.INode)\n"); source.AppendFront("\tgraph.ChangingNodeAttribute((GRGEN_LIBGR.INode)elem_" + seqAdd.Id + ", attrType_" + seqAdd.Id + ", GRGEN_LIBGR.AttributeChangeType.PutElement, " + sourceValue + ", " + destinationValue + ");\n"); source.AppendFront("else\n"); source.AppendFront("\tgraph.ChangingEdgeAttribute((GRGEN_LIBGR.IEdge)elem_" + seqAdd.Id + ", attrType_" + seqAdd.Id + ", GRGEN_LIBGR.AttributeChangeType.PutElement, " + sourceValue + ", " + destinationValue + ");\n"); } else { source.AppendFront("if(elem_" + seqAdd.Id + " is GRGEN_LIBGR.INode)\n"); source.AppendFront("\tgraph.ChangingNodeAttribute((GRGEN_LIBGR.INode)elem_" + seqAdd.Id + ", attrType_" + seqAdd.Id + ", GRGEN_LIBGR.AttributeChangeType.PutElement, " + sourceValue + ", null);\n"); source.AppendFront("else\n"); source.AppendFront("\tgraph.ChangingEdgeAttribute((GRGEN_LIBGR.IEdge)elem_" + seqAdd.Id + ", attrType_" + seqAdd.Id + ", GRGEN_LIBGR.AttributeChangeType.PutElement, " + sourceValue + ", null);\n"); } } if(destinationValue == null) source.AppendFront(array + ".Add(" + sourceValue + ");\n"); else source.AppendFront(array + ".Insert(" + destinationValue + ", " + sourceValue + ");\n"); if(seqAdd.Attribute != null) { if(gen.FireDebugEvents) { source.AppendFront("if(elem_" + seqAdd.Id + " is GRGEN_LIBGR.INode)\n"); source.AppendFront("\tgraph.ChangedNodeAttribute((GRGEN_LIBGR.INode)elem_" + seqAdd.Id + ", attrType_" + seqAdd.Id + ");\n"); source.AppendFront("else\n"); source.AppendFront("\tgraph.ChangedEdgeAttribute((GRGEN_LIBGR.IEdge)elem_" + seqAdd.Id + ", attrType_" + seqAdd.Id + ");\n"); } } } source.Unindent(); source.AppendFront("} else if(" + containerVar + " is GRGEN_LIBGR.IDeque) {\n"); source.Indent(); if(destinationValue != null && !TypesHelper.IsSameOrSubtype(seqAdd.ExprDst.Type(env), "int", model)) source.AppendFront("throw new Exception(\"Can't add non-int key to deque\");\n"); else { string deque = "((GRGEN_LIBGR.IDeque)" + containerVar + ")"; if(destinationValue != null) source.AppendFront("int " + destinationValue + " = (int)" + GetSequenceExpression(seqAdd.ExprDst, source) + ";\n"); if(seqAdd.Attribute != null) { if(destinationValue != null) { source.AppendFront("if(elem_" + seqAdd.Id + " is GRGEN_LIBGR.INode)\n"); source.AppendFront("\tgraph.ChangingNodeAttribute((GRGEN_LIBGR.INode)elem_" + seqAdd.Id + ", attrType_" + seqAdd.Id + ", GRGEN_LIBGR.AttributeChangeType.PutElement, " + sourceValue + ", " + destinationValue + ");\n"); source.AppendFront("else\n"); source.AppendFront("\tgraph.ChangingEdgeAttribute((GRGEN_LIBGR.IEdge)elem_" + seqAdd.Id + ", attrType_" + seqAdd.Id + ", GRGEN_LIBGR.AttributeChangeType.PutElement, " + sourceValue + ", " + destinationValue + ");\n"); } else { source.AppendFront("if(elem_" + seqAdd.Id + " is GRGEN_LIBGR.INode)\n"); source.AppendFront("\tgraph.ChangingNodeAttribute((GRGEN_LIBGR.INode)elem_" + seqAdd.Id + ", attrType_" + seqAdd.Id + ", GRGEN_LIBGR.AttributeChangeType.PutElement, " + sourceValue + ", null);\n"); source.AppendFront("else\n"); source.AppendFront("\tgraph.ChangingEdgeAttribute((GRGEN_LIBGR.IEdge)elem_" + seqAdd.Id + ", attrType_" + seqAdd.Id + ", GRGEN_LIBGR.AttributeChangeType.PutElement, " + sourceValue + ", null);\n"); } } if(destinationValue == null) source.AppendFront(deque + ".Enqueue(" + sourceValue + ");\n"); else source.AppendFront(deque + ".EnqueueAt(" + destinationValue + ", " + sourceValue + ");\n"); if(seqAdd.Attribute != null) { if(gen.FireDebugEvents) { source.AppendFront("if(elem_" + seqAdd.Id + " is GRGEN_LIBGR.INode)\n"); source.AppendFront("\tgraph.ChangedNodeAttribute((GRGEN_LIBGR.INode)elem_" + seqAdd.Id + ", attrType_" + seqAdd.Id + ");\n"); source.AppendFront("else\n"); source.AppendFront("\tgraph.ChangedEdgeAttribute((GRGEN_LIBGR.IEdge)elem_" + seqAdd.Id + ", attrType_" + seqAdd.Id + ");\n"); } } } source.Unindent(); source.AppendFront("} else {\n"); source.Indent(); if(destinationValue != null) source.AppendFront("object " + destinationValue + " = " + GetSequenceExpression(seqAdd.ExprDst, source) + ";\n"); string dictionary = "((System.Collections.IDictionary)" + containerVar + ")"; if(seqAdd.Attribute != null) { if(seqAdd.ExprDst != null) // must be map { source.AppendFront("if(elem_" + seqAdd.Id + " is GRGEN_LIBGR.INode)\n"); source.AppendFront("\tgraph.ChangingNodeAttribute((GRGEN_LIBGR.INode)elem_" + seqAdd.Id + ", attrType_" + seqAdd.Id + ", GRGEN_LIBGR.AttributeChangeType.PutElement, " + destinationValue + ", " + sourceValue + ");\n"); source.AppendFront("else\n"); source.AppendFront("\tgraph.ChangingEdgeAttribute((GRGEN_LIBGR.IEdge)elem_" + seqAdd.Id + ", attrType_" + seqAdd.Id + ", GRGEN_LIBGR.AttributeChangeType.PutElement, " + destinationValue + ", " + sourceValue + ");\n"); } else { source.AppendFront("if(elem_" + seqAdd.Id + " is GRGEN_LIBGR.INode)\n"); source.AppendFront("\tgraph.ChangingNodeAttribute((GRGEN_LIBGR.INode)elem_" + seqAdd.Id + ", attrType_" + seqAdd.Id + ", GRGEN_LIBGR.AttributeChangeType.PutElement, " + sourceValue + ", " + destinationValue + ");\n"); source.AppendFront("else\n"); source.AppendFront("\tgraph.ChangingEdgeAttribute((GRGEN_LIBGR.IEdge)elem_" + seqAdd.Id + ", attrType_" + seqAdd.Id + ", GRGEN_LIBGR.AttributeChangeType.PutElement, " + sourceValue + ", " + destinationValue + ");\n"); } } if(destinationValue == null) source.AppendFront(dictionary + "[" + sourceValue + "] = null;\n"); else source.AppendFront(dictionary + "[" + sourceValue + "] = " + destinationValue + ";\n"); if(seqAdd.Attribute != null) { if(gen.FireDebugEvents) { source.AppendFront("if(elem_" + seqAdd.Id + " is GRGEN_LIBGR.INode)\n"); source.AppendFront("\tgraph.ChangedNodeAttribute((GRGEN_LIBGR.INode)elem_" + seqAdd.Id + ", attrType_" + seqAdd.Id + ");\n"); source.AppendFront("else\n"); source.AppendFront("\tgraph.ChangedEdgeAttribute((GRGEN_LIBGR.IEdge)elem_" + seqAdd.Id + ", attrType_" + seqAdd.Id + ");\n"); } } source.Unindent(); source.AppendFront("}\n"); source.AppendFront(SetResultVar(seqAdd, containerVar)); } else if(seqAdd.ContainerType(env).StartsWith("array")) { string array = container; string arrayValueType = TypesHelper.XgrsTypeToCSharpType(TypesHelper.ExtractSrc(seqAdd.ContainerType(env)), model); string sourceValue = "srcval_" + seqAdd.Id; source.AppendFront(arrayValueType + " " + sourceValue + " = (" + arrayValueType + ")" + GetSequenceExpression(seqAdd.Expr, source) + ";\n"); string destinationValue = seqAdd.ExprDst == null ? null : "dstval_" + seqAdd.Id; if(destinationValue != null) source.AppendFront("int " + destinationValue + " = (int)" + GetSequenceExpression(seqAdd.ExprDst, source) + ";\n"); if(seqAdd.Attribute != null) { source.AppendFront("GRGEN_LIBGR.IGraphElement elem_" + seqAdd.Id + " = (GRGEN_LIBGR.IGraphElement)" + GetVar(seqAdd.Attribute.SourceVar) + ";\n"); source.AppendFront("GRGEN_LIBGR.AttributeType attrType_" + seqAdd.Id + " = elem_" + seqAdd.Id + ".Type.GetAttributeType(\"" + seqAdd.Attribute.AttributeName + "\");\n"); if(destinationValue != null) { source.AppendFront("if(elem_" + seqAdd.Id + " is GRGEN_LIBGR.INode)\n"); source.AppendFront("\tgraph.ChangingNodeAttribute((GRGEN_LIBGR.INode)elem_" + seqAdd.Id + ", attrType_" + seqAdd.Id + ", GRGEN_LIBGR.AttributeChangeType.PutElement, " + sourceValue + ", " + destinationValue + ");\n"); source.AppendFront("else\n"); source.AppendFront("\tgraph.ChangingEdgeAttribute((GRGEN_LIBGR.IEdge)elem_" + seqAdd.Id + ", attrType_" + seqAdd.Id + ", GRGEN_LIBGR.AttributeChangeType.PutElement, " + sourceValue + ", " + destinationValue + ");\n"); } else { source.AppendFront("if(elem_" + seqAdd.Id + " is GRGEN_LIBGR.INode)\n"); source.AppendFront("\tgraph.ChangingNodeAttribute((GRGEN_LIBGR.INode)elem_" + seqAdd.Id + ", attrType_" + seqAdd.Id + ", GRGEN_LIBGR.AttributeChangeType.PutElement, " + sourceValue + ", null);\n"); source.AppendFront("else\n"); source.AppendFront("\tgraph.ChangingEdgeAttribute((GRGEN_LIBGR.IEdge)elem_" + seqAdd.Id + ", attrType_" + seqAdd.Id + ", GRGEN_LIBGR.AttributeChangeType.PutElement, " + sourceValue + ", null);\n"); } } if(destinationValue == null) source.AppendFront(array + ".Add(" + sourceValue + ");\n"); else source.AppendFront(array + ".Insert(" + destinationValue + ", " + sourceValue + ");\n"); if(seqAdd.Attribute != null) { if(gen.FireDebugEvents) { source.AppendFront("if(elem_" + seqAdd.Id + " is GRGEN_LIBGR.INode)\n"); source.AppendFront("\tgraph.ChangedNodeAttribute((GRGEN_LIBGR.INode)elem_" + seqAdd.Id + ", attrType_" + seqAdd.Id + ");\n"); source.AppendFront("else\n"); source.AppendFront("\tgraph.ChangedEdgeAttribute((GRGEN_LIBGR.IEdge)elem_" + seqAdd.Id + ", attrType_" + seqAdd.Id + ");\n"); } } source.AppendFront(SetResultVar(seqAdd, container)); } else if(seqAdd.ContainerType(env).StartsWith("deque")) { string deque = container; string dequeValueType = TypesHelper.XgrsTypeToCSharpType(TypesHelper.ExtractSrc(seqAdd.ContainerType(env)), model); string sourceValue = "srcval_" + seqAdd.Id; source.AppendFront(dequeValueType + " " + sourceValue + " = (" + dequeValueType + ")" + GetSequenceExpression(seqAdd.Expr, source) + ";\n"); string destinationValue = seqAdd.ExprDst == null ? null : "dstval_" + seqAdd.Id; if(destinationValue != null) source.AppendFront("int " + destinationValue + " = (int)" + GetSequenceExpression(seqAdd.ExprDst, source) + ";\n"); if(seqAdd.Attribute != null) { source.AppendFront("GRGEN_LIBGR.IGraphElement elem_" + seqAdd.Id + " = (GRGEN_LIBGR.IGraphElement)" + GetVar(seqAdd.Attribute.SourceVar) + ";\n"); source.AppendFront("GRGEN_LIBGR.AttributeType attrType_" + seqAdd.Id + " = elem_" + seqAdd.Id + ".Type.GetAttributeType(\"" + seqAdd.Attribute.AttributeName + "\");\n"); if(destinationValue != null) { source.AppendFront("if(elem_" + seqAdd.Id + " is GRGEN_LIBGR.INode)\n"); source.AppendFront("\tgraph.ChangingNodeAttribute((GRGEN_LIBGR.INode)elem_" + seqAdd.Id + ", attrType_" + seqAdd.Id + ", GRGEN_LIBGR.AttributeChangeType.PutElement, " + sourceValue + ", " + destinationValue + ");\n"); source.AppendFront("else\n"); source.AppendFront("\tgraph.ChangingEdgeAttribute((GRGEN_LIBGR.IEdge)elem_" + seqAdd.Id + ", attrType_" + seqAdd.Id + ", GRGEN_LIBGR.AttributeChangeType.PutElement, " + sourceValue + ", " + destinationValue + ");\n"); } else { source.AppendFront("if(elem_" + seqAdd.Id + " is GRGEN_LIBGR.INode)\n"); source.AppendFront("\tgraph.ChangingNodeAttribute((GRGEN_LIBGR.INode)elem_" + seqAdd.Id + ", attrType_" + seqAdd.Id + ", GRGEN_LIBGR.AttributeChangeType.PutElement, " + sourceValue + ", null);\n"); source.AppendFront("else\n"); source.AppendFront("\tgraph.ChangingEdgeAttribute((GRGEN_LIBGR.IEdge)elem_" + seqAdd.Id + ", attrType_" + seqAdd.Id + ", GRGEN_LIBGR.AttributeChangeType.PutElement, " + sourceValue + ", null);\n"); } } if(destinationValue == null) source.AppendFront(deque + ".Enqueue(" + sourceValue + ");\n"); else source.AppendFront(deque + ".EnqueueAt(" + destinationValue + ", " + sourceValue + ");\n"); if(seqAdd.Attribute != null) { if(gen.FireDebugEvents) { source.AppendFront("if(elem_" + seqAdd.Id + " is GRGEN_LIBGR.INode)\n"); source.AppendFront("\tgraph.ChangedNodeAttribute((GRGEN_LIBGR.INode)elem_" + seqAdd.Id + ", attrType_" + seqAdd.Id + ");\n"); source.AppendFront("else\n"); source.AppendFront("\tgraph.ChangedEdgeAttribute((GRGEN_LIBGR.IEdge)elem_" + seqAdd.Id + ", attrType_" + seqAdd.Id + ");\n"); } } source.AppendFront(SetResultVar(seqAdd, container)); } else { string dictionary = container; string dictSrcType = TypesHelper.XgrsTypeToCSharpType(TypesHelper.ExtractSrc(seqAdd.ContainerType(env)), model); string sourceValue = " srcval_" + seqAdd.Id; source.AppendFront(dictSrcType + " " + sourceValue + " = (" + dictSrcType + ")" + GetSequenceExpression(seqAdd.Expr, source) + ";\n"); string dictDstType = TypesHelper.XgrsTypeToCSharpType(TypesHelper.ExtractDst(seqAdd.ContainerType(env)), model); string destinationValue = seqAdd.ExprDst == null ? null : "dstval_" + seqAdd.Id; if(destinationValue != null) source.AppendFront(dictDstType + " " + destinationValue + " = (" + dictDstType + ")" + GetSequenceExpression(seqAdd.ExprDst, source) + ";\n"); if(seqAdd.Attribute != null) { source.AppendFront("GRGEN_LIBGR.IGraphElement elem_" + seqAdd.Id + " = (GRGEN_LIBGR.IGraphElement)" + GetVar(seqAdd.Attribute.SourceVar) + ";\n"); source.AppendFront("GRGEN_LIBGR.AttributeType attrType_" + seqAdd.Id + " = elem_" + seqAdd.Id + ".Type.GetAttributeType(\"" + seqAdd.Attribute.AttributeName + "\");\n"); if(destinationValue != null) // must be map { source.AppendFront("if(elem_" + seqAdd.Id + " is GRGEN_LIBGR.INode)\n"); source.AppendFront("\tgraph.ChangingNodeAttribute((GRGEN_LIBGR.INode)elem_" + seqAdd.Id + ", attrType_" + seqAdd.Id + ", GRGEN_LIBGR.AttributeChangeType.PutElement, " + destinationValue + ", " + sourceValue + ");\n"); source.AppendFront("else\n"); source.AppendFront("\tgraph.ChangingEdgeAttribute((GRGEN_LIBGR.IEdge)elem_" + seqAdd.Id + ", attrType_" + seqAdd.Id + ", GRGEN_LIBGR.AttributeChangeType.PutElement, " + destinationValue + ", " + sourceValue + ");\n"); } else { source.AppendFront("if(elem_" + seqAdd.Id + " is GRGEN_LIBGR.INode)\n"); source.AppendFront("\tgraph.ChangingNodeAttribute((GRGEN_LIBGR.INode)elem_" + seqAdd.Id + ", attrType_" + seqAdd.Id + ", GRGEN_LIBGR.AttributeChangeType.PutElement, " + sourceValue + ", null);\n"); source.AppendFront("else\n"); source.AppendFront("\tgraph.ChangingEdgeAttribute((GRGEN_LIBGR.IEdge)elem_" + seqAdd.Id + ", attrType_" + seqAdd.Id + ", GRGEN_LIBGR.AttributeChangeType.PutElement, " + sourceValue + ", null);\n"); } } if(destinationValue == null) source.AppendFront(dictionary + "[" + sourceValue + "] = null;\n"); else source.AppendFront(dictionary + "[" + sourceValue + "] = " + destinationValue + ";\n"); if(seqAdd.Attribute != null) { if(gen.FireDebugEvents) { source.AppendFront("if(elem_" + seqAdd.Id + " is GRGEN_LIBGR.INode)\n"); source.AppendFront("\tgraph.ChangedNodeAttribute((GRGEN_LIBGR.INode)elem_" + seqAdd.Id + ", attrType_" + seqAdd.Id + ");\n"); source.AppendFront("else\n"); source.AppendFront("\tgraph.ChangedEdgeAttribute((GRGEN_LIBGR.IEdge)elem_" + seqAdd.Id + ", attrType_" + seqAdd.Id + ");\n"); } } source.AppendFront(SetResultVar(seqAdd, container)); } break; } case SequenceComputationType.ContainerRem: { SequenceComputationContainerRem seqDel = (SequenceComputationContainerRem)seqComp; string container = GetContainerValue(seqDel); if(seqDel.ContainerType(env) == "") { if(seqDel.Attribute != null) { source.AppendFront("GRGEN_LIBGR.IGraphElement elem_" + seqDel.Id + " = (GRGEN_LIBGR.IGraphElement)" + GetVar(seqDel.Attribute.SourceVar) + ";\n"); source.AppendFront("GRGEN_LIBGR.AttributeType attrType_" + seqDel.Id + " = elem_" + seqDel.Id + ".Type.GetAttributeType(\"" + seqDel.Attribute.AttributeName + "\");\n"); } string containerVar = "tmp_eval_once_" + seqDel.Id; source.AppendFront("object " + containerVar + " = " + container + ";\n"); string sourceValue = seqDel.Expr == null ? null : "srcval_" + seqDel.Id; source.AppendFront("if(" + containerVar + " is IList) {\n"); source.Indent(); if(sourceValue != null && !TypesHelper.IsSameOrSubtype(seqDel.Expr.Type(env), "int", model)) source.AppendFront("throw new Exception(\"Can't remove non-int index from array\");\n"); else { string array = "((System.Collections.IList)" + containerVar + ")"; if(sourceValue != null) source.AppendFront("int " + sourceValue + " = (int)" + GetSequenceExpression(seqDel.Expr, source) + ";\n"); if(seqDel.Attribute != null) { if(sourceValue != null) { source.AppendFront("if(elem_" + seqDel.Id + " is GRGEN_LIBGR.INode)\n"); source.AppendFront("\tgraph.ChangingNodeAttribute((GRGEN_LIBGR.INode)elem_" + seqDel.Id + ", attrType_" + seqDel.Id + ", GRGEN_LIBGR.AttributeChangeType.RemoveElement, null, " + sourceValue + ");\n"); source.AppendFront("else\n"); source.AppendFront("\tgraph.ChangingEdgeAttribute((GRGEN_LIBGR.IEdge)elem_" + seqDel.Id + ", attrType_" + seqDel.Id + ", GRGEN_LIBGR.AttributeChangeType.RemoveElement, null, " + sourceValue + ");\n"); } else { source.AppendFront("if(elem_" + seqDel.Id + " is GRGEN_LIBGR.INode)\n"); source.AppendFront("\tgraph.ChangingNodeAttribute((GRGEN_LIBGR.INode)elem_" + seqDel.Id + ", attrType_" + seqDel.Id + ", GRGEN_LIBGR.AttributeChangeType.RemoveElement, null, null);\n"); source.AppendFront("else\n"); source.AppendFront("\tgraph.ChangingEdgeAttribute((GRGEN_LIBGR.IEdge)elem_" + seqDel.Id + ", attrType_" + seqDel.Id + ", GRGEN_LIBGR.AttributeChangeType.RemoveElement, null, null);\n"); } } if(sourceValue == null) source.AppendFront(array + ".RemoveAt(" + array + ".Count - 1);\n"); else source.AppendFront(array + ".RemoveAt(" + sourceValue + ");\n"); if(seqDel.Attribute != null) { if(gen.FireDebugEvents) { source.AppendFront("if(elem_" + seqDel.Id + " is GRGEN_LIBGR.INode)\n"); source.AppendFront("\tgraph.ChangedNodeAttribute((GRGEN_LIBGR.INode)elem_" + seqDel.Id + ", attrType_" + seqDel.Id + ");\n"); source.AppendFront("else\n"); source.AppendFront("\tgraph.ChangedEdgeAttribute((GRGEN_LIBGR.IEdge)elem_" + seqDel.Id + ", attrType_" + seqDel.Id + ");\n"); } } } source.Unindent(); source.AppendFront("} else if(" + containerVar + " is GRGEN_LIBGR.IDeque) {\n"); source.Indent(); if(sourceValue != null && !TypesHelper.IsSameOrSubtype(seqDel.Expr.Type(env), "int", model)) source.AppendFront("throw new Exception(\"Can't remove non-int index from deque\");\n"); else { string deque = "((GRGEN_LIBGR.IDeque)" + containerVar + ")"; if(sourceValue != null) source.AppendFront("int " + sourceValue + " = (int)" + GetSequenceExpression(seqDel.Expr, source) + ";\n"); if(seqDel.Attribute != null) { if(sourceValue != null) { source.AppendFront("if(elem_" + seqDel.Id + " is GRGEN_LIBGR.INode)\n"); source.AppendFront("\tgraph.ChangingNodeAttribute((GRGEN_LIBGR.INode)elem_" + seqDel.Id + ", attrType_" + seqDel.Id + ", GRGEN_LIBGR.AttributeChangeType.RemoveElement, null, " + sourceValue + ");\n"); source.AppendFront("else\n"); source.AppendFront("\tgraph.ChangingEdgeAttribute((GRGEN_LIBGR.IEdge)elem_" + seqDel.Id + ", attrType_" + seqDel.Id + ", GRGEN_LIBGR.AttributeChangeType.RemoveElement, null, " + sourceValue + ");\n"); } else { source.AppendFront("if(elem_" + seqDel.Id + " is GRGEN_LIBGR.INode)\n"); source.AppendFront("\tgraph.ChangingNodeAttribute((GRGEN_LIBGR.INode)elem_" + seqDel.Id + ", attrType_" + seqDel.Id + ", GRGEN_LIBGR.AttributeChangeType.RemoveElement, null, null);\n"); source.AppendFront("else\n"); source.AppendFront("\tgraph.ChangingEdgeAttribute((GRGEN_LIBGR.IEdge)elem_" + seqDel.Id + ", attrType_" + seqDel.Id + ", GRGEN_LIBGR.AttributeChangeType.RemoveElement, null, null);\n"); } } if(sourceValue == null) source.AppendFront(deque + ".Dequeue();\n"); else source.AppendFront(deque + ".DequeueAt(" + sourceValue + ");\n"); if(seqDel.Attribute != null) { if(gen.FireDebugEvents) { source.AppendFront("if(elem_" + seqDel.Id + " is GRGEN_LIBGR.INode)\n"); source.AppendFront("\tgraph.ChangedNodeAttribute((GRGEN_LIBGR.INode)elem_" + seqDel.Id + ", attrType_" + seqDel.Id + ");\n"); source.AppendFront("else\n"); source.AppendFront("\tgraph.ChangedEdgeAttribute((GRGEN_LIBGR.IEdge)elem_" + seqDel.Id + ", attrType_" + seqDel.Id + ");\n"); } } } source.Unindent(); source.AppendFront("} else {\n"); source.Indent(); string dictionary = "((System.Collections.IDictionary)" + containerVar + ")"; if(sourceValue != null) source.AppendFront("object " + sourceValue + " = " + GetSequenceExpression(seqDel.Expr, source) + ";\n"); if(seqDel.Attribute != null) { source.AppendFront("if(GRGEN_LIBGR.TypesHelper.ExtractDst(GRGEN_LIBGR.TypesHelper.AttributeTypeToXgrsType(attrType_" + seqDel.Id + ")) == \"SetValueType\")\n"); source.AppendFront("{\n"); source.Indent(); source.AppendFront("if(elem_" + seqDel.Id + " is GRGEN_LIBGR.INode)\n"); source.AppendFront("\tgraph.ChangingNodeAttribute((GRGEN_LIBGR.INode)elem_" + seqDel.Id + ", attrType_" + seqDel.Id + ", GRGEN_LIBGR.AttributeChangeType.RemoveElement, " + sourceValue + ", null);\n"); source.AppendFront("else\n"); source.AppendFront("\tgraph.ChangingEdgeAttribute((GRGEN_LIBGR.IEdge)elem_" + seqDel.Id + ", attrType_" + seqDel.Id + ", GRGEN_LIBGR.AttributeChangeType.RemoveElement, " + sourceValue + ", null);\n"); source.Unindent(); source.AppendFront("}\n"); source.AppendFront("else\n"); source.AppendFront("{\n"); source.Indent(); source.AppendFront("if(elem_" + seqDel.Id + " is GRGEN_LIBGR.INode)\n"); source.AppendFront("\tgraph.ChangingNodeAttribute((GRGEN_LIBGR.INode)elem_" + seqDel.Id + ", attrType_" + seqDel.Id + ", GRGEN_LIBGR.AttributeChangeType.RemoveElement, null, " + sourceValue + ");\n"); source.AppendFront("else\n"); source.AppendFront("\tgraph.ChangingEdgeAttribute((GRGEN_LIBGR.IEdge)elem_" + seqDel.Id + ", attrType_" + seqDel.Id + ", GRGEN_LIBGR.AttributeChangeType.RemoveElement, null, " + sourceValue + ");\n"); source.Unindent(); source.AppendFront("}\n"); } if(sourceValue == null) source.AppendFront("throw new Exception(\""+seqDel.Container.PureName+".rem() only possible on array or deque!\");\n"); else source.AppendFront(dictionary + ".Remove(" + sourceValue + ");\n"); if(seqDel.Attribute != null) { if(gen.FireDebugEvents) { source.AppendFront("if(elem_" + seqDel.Id + " is GRGEN_LIBGR.INode)\n"); source.AppendFront("\tgraph.ChangedNodeAttribute((GRGEN_LIBGR.INode)elem_" + seqDel.Id + ", attrType_" + seqDel.Id + ");\n"); source.AppendFront("else\n"); source.AppendFront("\tgraph.ChangedEdgeAttribute((GRGEN_LIBGR.IEdge)elem_" + seqDel.Id + ", attrType_" + seqDel.Id + ");\n"); } } source.Unindent(); source.AppendFront("}\n"); source.AppendFront(SetResultVar(seqDel, containerVar)); } else if(seqDel.ContainerType(env).StartsWith("array")) { string array = container; string sourceValue = seqDel.Expr == null ? null : "srcval_" + seqDel.Id; if(sourceValue != null) source.AppendFront("int " + sourceValue + " = (int)" + GetSequenceExpression(seqDel.Expr, source) + ";\n"); if(seqDel.Attribute != null) { source.AppendFront("GRGEN_LIBGR.IGraphElement elem_" + seqDel.Id + " = (GRGEN_LIBGR.IGraphElement)" + GetVar(seqDel.Attribute.SourceVar) + ";\n"); source.AppendFront("GRGEN_LIBGR.AttributeType attrType_" + seqDel.Id + " = elem_" + seqDel.Id + ".Type.GetAttributeType(\"" + seqDel.Attribute.AttributeName + "\");\n"); if(sourceValue != null) { source.AppendFront("if(elem_" + seqDel.Id + " is GRGEN_LIBGR.INode)\n"); source.AppendFront("\tgraph.ChangingNodeAttribute((GRGEN_LIBGR.INode)elem_" + seqDel.Id + ", attrType_" + seqDel.Id + ", GRGEN_LIBGR.AttributeChangeType.RemoveElement, null, " + sourceValue + ");\n"); source.AppendFront("else\n"); source.AppendFront("\tgraph.ChangingEdgeAttribute((GRGEN_LIBGR.IEdge)elem_" + seqDel.Id + ", attrType_" + seqDel.Id + ", GRGEN_LIBGR.AttributeChangeType.RemoveElement, null, " + sourceValue + ");\n"); } else { source.AppendFront("if(elem_" + seqDel.Id + " is GRGEN_LIBGR.INode)\n"); source.AppendFront("\tgraph.ChangingNodeAttribute((GRGEN_LIBGR.INode)elem_" + seqDel.Id + ", attrType_" + seqDel.Id + ", GRGEN_LIBGR.AttributeChangeType.RemoveElement, null, null);\n"); source.AppendFront("else\n"); source.AppendFront("\tgraph.ChangingEdgeAttribute((GRGEN_LIBGR.IEdge)elem_" + seqDel.Id + ", attrType_" + seqDel.Id + ", GRGEN_LIBGR.AttributeChangeType.RemoveElement, null, null);\n"); } } if(sourceValue == null) source.AppendFront(array + ".RemoveAt(" + array + ".Count - 1);\n"); else source.AppendFront(array + ".RemoveAt(" + sourceValue + ");\n"); if(seqDel.Attribute != null) { if(gen.FireDebugEvents) { source.AppendFront("if(elem_" + seqDel.Id + " is GRGEN_LIBGR.INode)\n"); source.AppendFront("\tgraph.ChangedNodeAttribute((GRGEN_LIBGR.INode)elem_" + seqDel.Id + ", attrType_" + seqDel.Id + ");\n"); source.AppendFront("else\n"); source.AppendFront("\tgraph.ChangedEdgeAttribute((GRGEN_LIBGR.IEdge)elem_" + seqDel.Id + ", attrType_" + seqDel.Id + ");\n"); } } source.AppendFront(SetResultVar(seqDel, container)); } else if(seqDel.ContainerType(env).StartsWith("deque")) { string deque = container; string sourceValue = seqDel.Expr == null ? null : "srcval_" + seqDel.Id; if(sourceValue != null) source.AppendFront("int " + sourceValue + " = (int)" + GetSequenceExpression(seqDel.Expr, source) + ";\n"); if(seqDel.Attribute != null) { source.AppendFront("GRGEN_LIBGR.IGraphElement elem_" + seqDel.Id + " = (GRGEN_LIBGR.IGraphElement)" + GetVar(seqDel.Attribute.SourceVar) + ";\n"); source.AppendFront("GRGEN_LIBGR.AttributeType attrType_" + seqDel.Id + " = elem_" + seqDel.Id + ".Type.GetAttributeType(\"" + seqDel.Attribute.AttributeName + "\");\n"); if(sourceValue != null) { source.AppendFront("if(elem_" + seqDel.Id + " is GRGEN_LIBGR.INode)\n"); source.AppendFront("\tgraph.ChangingNodeAttribute((GRGEN_LIBGR.INode)elem_" + seqDel.Id + ", attrType_" + seqDel.Id + ", GRGEN_LIBGR.AttributeChangeType.RemoveElement, null, " + sourceValue + ");\n"); source.AppendFront("else\n"); source.AppendFront("\tgraph.ChangingEdgeAttribute((GRGEN_LIBGR.IEdge)elem_" + seqDel.Id + ", attrType_" + seqDel.Id + ", GRGEN_LIBGR.AttributeChangeType.RemoveElement, null, " + sourceValue + ");\n"); } else { source.AppendFront("if(elem_" + seqDel.Id + " is GRGEN_LIBGR.INode)\n"); source.AppendFront("\tgraph.ChangingNodeAttribute((GRGEN_LIBGR.INode)elem_" + seqDel.Id + ", attrType_" + seqDel.Id + ", GRGEN_LIBGR.AttributeChangeType.RemoveElement, null, null);\n"); source.AppendFront("else\n"); source.AppendFront("\tgraph.ChangingEdgeAttribute((GRGEN_LIBGR.IEdge)elem_" + seqDel.Id + ", attrType_" + seqDel.Id + ", GRGEN_LIBGR.AttributeChangeType.RemoveElement, null, null);\n"); } } if(sourceValue == null) source.AppendFront(deque + ".Dequeue();\n"); else source.AppendFront(deque + ".DequeueAt(" + sourceValue + ");\n"); if(seqDel.Attribute != null) { if(gen.FireDebugEvents) { source.AppendFront("if(elem_" + seqDel.Id + " is GRGEN_LIBGR.INode)\n"); source.AppendFront("\tgraph.ChangedNodeAttribute((GRGEN_LIBGR.INode)elem_" + seqDel.Id + ", attrType_" + seqDel.Id + ");\n"); source.AppendFront("else\n"); source.AppendFront("\tgraph.ChangedEdgeAttribute((GRGEN_LIBGR.IEdge)elem_" + seqDel.Id + ", attrType_" + seqDel.Id + ");\n"); } } source.AppendFront(SetResultVar(seqDel, container)); } else { string dictionary = container; string dictSrcType = TypesHelper.XgrsTypeToCSharpType(TypesHelper.ExtractSrc(seqDel.ContainerType(env)), model); string sourceValue = "srcval_" + seqDel.Id; source.AppendFront(dictSrcType + " " + sourceValue + " = (" + dictSrcType + ")" + GetSequenceExpression(seqDel.Expr, source) + ";\n"); if(seqDel.Attribute != null) { source.AppendFront("GRGEN_LIBGR.IGraphElement elem_" + seqDel.Id + " = (GRGEN_LIBGR.IGraphElement)" + GetVar(seqDel.Attribute.SourceVar) + ";\n"); source.AppendFront("GRGEN_LIBGR.AttributeType attrType_" + seqDel.Id + " = elem_" + seqDel.Id + ".Type.GetAttributeType(\"" + seqDel.Attribute.AttributeName + "\");\n"); if(TypesHelper.ExtractDst(seqDel.ContainerType(env)) == "SetValueType") { source.AppendFront("if(elem_" + seqDel.Id + " is GRGEN_LIBGR.INode)\n"); source.AppendFront("\tgraph.ChangingNodeAttribute((GRGEN_LIBGR.INode)elem_" + seqDel.Id + ", attrType_" + seqDel.Id + ", GRGEN_LIBGR.AttributeChangeType.RemoveElement, " + sourceValue + ", null);\n"); source.AppendFront("else\n"); source.AppendFront("\tgraph.ChangingEdgeAttribute((GRGEN_LIBGR.IEdge)elem_" + seqDel.Id + ", attrType_" + seqDel.Id + ", GRGEN_LIBGR.AttributeChangeType.RemoveElement, " + sourceValue + ", null);\n"); } else { source.AppendFront("if(elem_" + seqDel.Id + " is GRGEN_LIBGR.INode)\n"); source.AppendFront("\tgraph.ChangingNodeAttribute((GRGEN_LIBGR.INode)elem_" + seqDel.Id + ", attrType_" + seqDel.Id + ", GRGEN_LIBGR.AttributeChangeType.RemoveElement, null, " + sourceValue + ");\n"); source.AppendFront("else\n"); source.AppendFront("\tgraph.ChangingEdgeAttribute((GRGEN_LIBGR.IEdge)elem_" + seqDel.Id + ", attrType_" + seqDel.Id + ", GRGEN_LIBGR.AttributeChangeType.RemoveElement, null, " + sourceValue + ");\n"); } } source.AppendFront(dictionary + ".Remove(" + sourceValue + ");\n"); if(seqDel.Attribute != null) { if(gen.FireDebugEvents) { source.AppendFront("if(elem_" + seqDel.Id + " is GRGEN_LIBGR.INode)\n"); source.AppendFront("\tgraph.ChangedNodeAttribute((GRGEN_LIBGR.INode)elem_" + seqDel.Id + ", attrType_" + seqDel.Id + ");\n"); source.AppendFront("else\n"); source.AppendFront("\tgraph.ChangedEdgeAttribute((GRGEN_LIBGR.IEdge)elem_" + seqDel.Id + ", attrType_" + seqDel.Id + ");\n"); } } source.AppendFront(SetResultVar(seqDel, container)); } break; } case SequenceComputationType.ContainerClear: { SequenceComputationContainerClear seqClear = (SequenceComputationContainerClear)seqComp; string container = GetContainerValue(seqClear); if(seqClear.ContainerType(env) == "") { if(seqClear.Attribute != null) { source.AppendFront("GRGEN_LIBGR.IGraphElement elem_" + seqClear.Id + " = (GRGEN_LIBGR.IGraphElement)" + GetVar(seqClear.Attribute.SourceVar) + ";\n"); source.AppendFront("GRGEN_LIBGR.AttributeType attrType_" + seqClear.Id + " = elem_" + seqClear.Id + ".Type.GetAttributeType(\"" + seqClear.Attribute.AttributeName + "\");\n"); } string containerVar = "tmp_eval_once_" + seqClear.Id; source.AppendFront("object " + containerVar + " = " + container + ";\n"); source.AppendFront("if(" + containerVar + " is IList) {\n"); source.Indent(); string array = "((System.Collections.IList)" + containerVar + ")"; if(seqClear.Attribute != null) { source.AppendFront("for(int i_" + seqClear.Id + " = " + array + ".Count; i_" + seqClear.Id + " >= 0; --i_" + seqClear.Id + ")\n"); source.AppendFront("\tif(elem_" + seqClear.Id + " is GRGEN_LIBGR.INode)\n"); source.AppendFront("\t\tgraph.ChangingNodeAttribute((GRGEN_LIBGR.INode)elem_" + seqClear.Id + ", attrType_" + seqClear.Id + ", GRGEN_LIBGR.AttributeChangeType.RemoveElement, null, i_" + seqClear.Id + ");\n"); source.AppendFront("\telse\n"); source.AppendFront("\t\tgraph.ChangingEdgeAttribute((GRGEN_LIBGR.IEdge)elem_" + seqClear.Id + ", attrType_" + seqClear.Id + ", GRGEN_LIBGR.AttributeChangeType.RemoveElement, null, i_" + seqClear.Id + ");\n"); } source.AppendFront(array + ".Clear();\n"); if(seqClear.Attribute != null) { if(gen.FireDebugEvents) { source.AppendFront("\tif(elem_" + seqClear.Id + " is GRGEN_LIBGR.INode)\n"); source.AppendFront("\t\tgraph.ChangedNodeAttribute((GRGEN_LIBGR.INode)elem_" + seqClear.Id + ", attrType_" + seqClear.Id + ");\n"); source.AppendFront("\telse\n"); source.AppendFront("\t\tgraph.ChangedEdgeAttribute((GRGEN_LIBGR.IEdge)elem_" + seqClear.Id + ", attrType_" + seqClear.Id + ");\n"); } } source.Unindent(); source.AppendFront("} else if(" + containerVar + " is GRGEN_LIBGR.IDeque) {\n"); source.Indent(); string deque = "((GRGEN_LIBGR.IDeque)" + containerVar + ")"; if(seqClear.Attribute != null) { source.AppendFront("for(int i_" + seqClear.Id + " = " + deque + ".Count; i_" + seqClear.Id + " >= 0; --i_" + seqClear.Id + ")\n"); source.AppendFront("\tif(elem_" + seqClear.Id + " is GRGEN_LIBGR.INode)\n"); source.AppendFront("\t\tgraph.ChangingNodeAttribute((GRGEN_LIBGR.INode)elem_" + seqClear.Id + ", attrType_" + seqClear.Id + ", GRGEN_LIBGR.AttributeChangeType.RemoveElement, null, i_" + seqClear.Id + ");\n"); source.AppendFront("\telse\n"); source.AppendFront("\t\tgraph.ChangingEdgeAttribute((GRGEN_LIBGR.IEdge)elem_" + seqClear.Id + ", attrType_" + seqClear.Id + ", GRGEN_LIBGR.AttributeChangeType.RemoveElement, null, i_" + seqClear.Id + ");\n"); } source.AppendFront(deque + ".Clear();\n"); if(seqClear.Attribute != null) { if(gen.FireDebugEvents) { source.AppendFront("\tif(elem_" + seqClear.Id + " is GRGEN_LIBGR.INode)\n"); source.AppendFront("\t\tgraph.ChangedNodeAttribute((GRGEN_LIBGR.INode)elem_" + seqClear.Id + ", attrType_" + seqClear.Id + ");\n"); source.AppendFront("\telse\n"); source.AppendFront("\t\tgraph.ChangedEdgeAttribute((GRGEN_LIBGR.IEdge)elem_" + seqClear.Id + ", attrType_" + seqClear.Id + ");\n"); } } source.Unindent(); source.AppendFront("} else {\n"); source.Indent(); string dictionary = "((System.Collections.IDictionary)" + containerVar + ")"; if(seqClear.Attribute != null) { source.AppendFront("if(GRGEN_LIBGR.TypesHelper.ExtractDst(GRGEN_LIBGR.TypesHelper.AttributeTypeToXgrsType(attrType_" + seqClear.Id + ")) == \"SetValueType\")\n"); source.AppendFront("{\n"); source.Indent(); source.AppendFront("foreach(DictionaryEntry kvp_" + seqClear.Id + " in " + dictionary + ")\n"); source.AppendFront("\tif(elem_" + seqClear.Id + " is GRGEN_LIBGR.INode)\n"); source.AppendFront("\t\tgraph.ChangingNodeAttribute((GRGEN_LIBGR.INode)elem_" + seqClear.Id + ", attrType_" + seqClear.Id + ", GRGEN_LIBGR.AttributeChangeType.RemoveElement, kvp_" + seqClear.Id + ", null);\n"); source.AppendFront("\telse\n"); source.AppendFront("\t\tgraph.ChangingEdgeAttribute((GRGEN_LIBGR.IEdge)elem_" + seqClear.Id + ", attrType_" + seqClear.Id + ", GRGEN_LIBGR.AttributeChangeType.RemoveElement, kvp_" + seqClear.Id + ", null);\n"); source.Unindent(); source.AppendFront("}\n"); source.AppendFront("else\n"); source.AppendFront("{\n"); source.Indent(); source.AppendFront("foreach(DictionaryEntry kvp_" + seqClear.Id + " in " + dictionary + ")\n"); source.AppendFront("\tif(elem_" + seqClear.Id + " is GRGEN_LIBGR.INode)\n"); source.AppendFront("\t\tgraph.ChangingNodeAttribute((GRGEN_LIBGR.INode)elem_" + seqClear.Id + ", attrType_" + seqClear.Id + ", GRGEN_LIBGR.AttributeChangeType.RemoveElement, null, kvp_" + seqClear.Id + ");\n"); source.AppendFront("\telse\n"); source.AppendFront("\t\tgraph.ChangingEdgeAttribute((GRGEN_LIBGR.IEdge)elem_" + seqClear.Id + ", attrType_" + seqClear.Id + ", GRGEN_LIBGR.AttributeChangeType.RemoveElement, null, kvp_" + seqClear.Id + ");\n"); source.Unindent(); source.AppendFront("}\n"); } source.AppendFront(dictionary + ".Clear();\n"); if(seqClear.Attribute != null) { if(gen.FireDebugEvents) { source.AppendFront("\tif(elem_" + seqClear.Id + " is GRGEN_LIBGR.INode)\n"); source.AppendFront("\t\tgraph.ChangedNodeAttribute((GRGEN_LIBGR.INode)elem_" + seqClear.Id + ", attrType_" + seqClear.Id + ");\n"); source.AppendFront("\telse\n"); source.AppendFront("\t\tgraph.ChangedEdgeAttribute((GRGEN_LIBGR.IEdge)elem_" + seqClear.Id + ", attrType_" + seqClear.Id + ");\n"); } } source.Unindent(); source.AppendFront("}\n"); source.AppendFront(SetResultVar(seqClear, containerVar)); } else if(seqClear.ContainerType(env).StartsWith("array")) { string array = container; if(seqClear.Attribute != null) { source.AppendFront("GRGEN_LIBGR.IGraphElement elem_" + seqClear.Id + " = (GRGEN_LIBGR.IGraphElement)" + GetVar(seqClear.Attribute.SourceVar) + ";\n"); source.AppendFront("GRGEN_LIBGR.AttributeType attrType_" + seqClear.Id + " = elem_" + seqClear.Id + ".Type.GetAttributeType(\"" + seqClear.Attribute.AttributeName + "\");\n"); source.AppendFront("for(int i_" + seqClear.Id + " = " + array + ".Count; i_" + seqClear.Id + " >= 0; --i_" + seqClear.Id + ")\n"); source.AppendFront("\tif(elem_" + seqClear.Id + " is GRGEN_LIBGR.INode)\n"); source.AppendFront("\t\tgraph.ChangingNodeAttribute((GRGEN_LIBGR.INode)elem_" + seqClear.Id + ", attrType_" + seqClear.Id + ", GRGEN_LIBGR.AttributeChangeType.RemoveElement, null, i_" + seqClear.Id + ");\n"); source.AppendFront("\telse\n"); source.AppendFront("\t\tgraph.ChangingEdgeAttribute((GRGEN_LIBGR.IEdge)elem_" + seqClear.Id + ", attrType_" + seqClear.Id + ", GRGEN_LIBGR.AttributeChangeType.RemoveElement, null, i_" + seqClear.Id + ");\n"); } source.AppendFront(array + ".Clear();\n"); if(seqClear.Attribute != null) { if(gen.FireDebugEvents) { source.AppendFront("\tif(elem_" + seqClear.Id + " is GRGEN_LIBGR.INode)\n"); source.AppendFront("\t\tgraph.ChangedNodeAttribute((GRGEN_LIBGR.INode)elem_" + seqClear.Id + ", attrType_" + seqClear.Id + ");\n"); source.AppendFront("\telse\n"); source.AppendFront("\t\tgraph.ChangedEdgeAttribute((GRGEN_LIBGR.IEdge)elem_" + seqClear.Id + ", attrType_" + seqClear.Id + ");\n"); } } source.AppendFront(SetResultVar(seqClear, container)); } else if(seqClear.ContainerType(env).StartsWith("deque")) { string deque = container; if(seqClear.Attribute != null) { source.AppendFront("GRGEN_LIBGR.IGraphElement elem_" + seqClear.Id + " = (GRGEN_LIBGR.IGraphElement)" + GetVar(seqClear.Attribute.SourceVar) + ";\n"); source.AppendFront("GRGEN_LIBGR.AttributeType attrType_" + seqClear.Id + " = elem_" + seqClear.Id + ".Type.GetAttributeType(\"" + seqClear.Attribute.AttributeName + "\");\n"); source.AppendFront("for(int i_" + seqClear.Id + " = " + deque + ".Count; i_" + seqClear.Id + " >= 0; --i_" + seqClear.Id + ")\n"); source.AppendFront("\tif(elem_" + seqClear.Id + " is GRGEN_LIBGR.INode)\n"); source.AppendFront("\t\tgraph.ChangingNodeAttribute((GRGEN_LIBGR.INode)elem_" + seqClear.Id + ", attrType_" + seqClear.Id + ", GRGEN_LIBGR.AttributeChangeType.RemoveElement, null, i_" + seqClear.Id + ");\n"); source.AppendFront("\telse\n"); source.AppendFront("\t\tgraph.ChangingEdgeAttribute((GRGEN_LIBGR.IEdge)elem_" + seqClear.Id + ", attrType_" + seqClear.Id + ", GRGEN_LIBGR.AttributeChangeType.RemoveElement, null, i_" + seqClear.Id + ");\n"); } source.AppendFront(deque + ".Clear();\n"); if(seqClear.Attribute != null) { if(gen.FireDebugEvents) { source.AppendFront("\tif(elem_" + seqClear.Id + " is GRGEN_LIBGR.INode)\n"); source.AppendFront("\t\tgraph.ChangedNodeAttribute((GRGEN_LIBGR.INode)elem_" + seqClear.Id + ", attrType_" + seqClear.Id + ");\n"); source.AppendFront("\telse\n"); source.AppendFront("\t\tgraph.ChangedEdgeAttribute((GRGEN_LIBGR.IEdge)elem_" + seqClear.Id + ", attrType_" + seqClear.Id + ");\n"); } } source.AppendFront(SetResultVar(seqClear, container)); } else { string dictionary = container; if(seqClear.Attribute != null) { source.AppendFront("GRGEN_LIBGR.IGraphElement elem_" + seqClear.Id + " = (GRGEN_LIBGR.IGraphElement)" + GetVar(seqClear.Attribute.SourceVar) + ";\n"); source.AppendFront("GRGEN_LIBGR.AttributeType attrType_" + seqClear.Id + " = elem_" + seqClear.Id + ".Type.GetAttributeType(\"" + seqClear.Attribute.AttributeName + "\");\n"); if(TypesHelper.ExtractDst(seqClear.ContainerType(env)) == "SetValueType") { source.AppendFront("foreach(DictionaryEntry kvp_" + seqClear.Id + " in " + dictionary + ")\n"); source.AppendFront("if(elem_" + seqClear.Id + " is GRGEN_LIBGR.INode)\n"); source.AppendFront("\tgraph.ChangingNodeAttribute((GRGEN_LIBGR.INode)elem_" + seqClear.Id + ", attrType_" + seqClear.Id + ", GRGEN_LIBGR.AttributeChangeType.RemoveElement, kvp_" + seqClear.Id + ", null);\n"); source.AppendFront("else\n"); source.AppendFront("\tgraph.ChangingEdgeAttribute((GRGEN_LIBGR.IEdge)elem_" + seqClear.Id + ", attrType_" + seqClear.Id + ", GRGEN_LIBGR.AttributeChangeType.RemoveElement, kvp_" + seqClear.Id + ", null);\n"); } else { source.AppendFront("foreach(DictionaryEntry kvp_" + seqClear.Id + " in " + dictionary + ")\n"); source.AppendFront("if(elem_" + seqClear.Id + " is GRGEN_LIBGR.INode)\n"); source.AppendFront("\tgraph.ChangingNodeAttribute((GRGEN_LIBGR.INode)elem_" + seqClear.Id + ", attrType_" + seqClear.Id + ", GRGEN_LIBGR.AttributeChangeType.RemoveElement, null, kvp_" + seqClear.Id + ");\n"); source.AppendFront("else\n"); source.AppendFront("\tgraph.ChangingEdgeAttribute((GRGEN_LIBGR.IEdge)elem_" + seqClear.Id + ", attrType_" + seqClear.Id + ", GRGEN_LIBGR.AttributeChangeType.RemoveElement, null, kvp_" + seqClear.Id + ");\n"); } } source.AppendFront(dictionary + ".Clear();\n"); if(seqClear.Attribute != null) { if(gen.FireDebugEvents) { source.AppendFront("if(elem_" + seqClear.Id + " is GRGEN_LIBGR.INode)\n"); source.AppendFront("\tgraph.ChangedNodeAttribute((GRGEN_LIBGR.INode)elem_" + seqClear.Id + ", attrType_" + seqClear.Id + ");\n"); source.AppendFront("else\n"); source.AppendFront("\tgraph.ChangedEdgeAttribute((GRGEN_LIBGR.IEdge)elem_" + seqClear.Id + ", attrType_" + seqClear.Id + ");\n"); } } source.AppendFront(SetResultVar(seqClear, container)); } break; } case SequenceComputationType.VAlloc: source.Append("graph.AllocateVisitedFlag()"); break; case SequenceComputationType.VFree: case SequenceComputationType.VFreeNonReset: { SequenceComputationVFree seqVFree = (SequenceComputationVFree)seqComp; if(seqVFree.Reset) source.AppendFront("graph.FreeVisitedFlag((int)" + GetSequenceExpression(seqVFree.VisitedFlagExpression, source) + ");\n"); else source.AppendFront("graph.FreeVisitedFlagNonReset((int)" + GetSequenceExpression(seqVFree.VisitedFlagExpression, source) + ");\n"); source.AppendFront(SetResultVar(seqVFree, "null")); break; } case SequenceComputationType.VReset: { SequenceComputationVReset seqVReset = (SequenceComputationVReset)seqComp; source.AppendFront("graph.ResetVisitedFlag((int)" + GetSequenceExpression(seqVReset.VisitedFlagExpression, source) + ");\n"); source.AppendFront(SetResultVar(seqVReset, "null")); break; } case SequenceComputationType.DebugAdd: { SequenceComputationDebugAdd seqDebug = (SequenceComputationDebugAdd)seqComp; source.AppendFront("procEnv.DebugEntering("); for(int i = 0; i < seqDebug.ArgExprs.Count; ++i) { if(i == 0) source.Append("(string)"); else source.Append(", "); source.Append(GetSequenceExpression(seqDebug.ArgExprs[i], source)); } source.Append(");\n"); source.AppendFront(SetResultVar(seqDebug, "null")); break; } case SequenceComputationType.DebugRem: { SequenceComputationDebugRem seqDebug = (SequenceComputationDebugRem)seqComp; source.AppendFront("procEnv.DebugExiting("); for(int i = 0; i < seqDebug.ArgExprs.Count; ++i) { if(i == 0) source.Append("(string)"); else source.Append(", "); source.Append(GetSequenceExpression(seqDebug.ArgExprs[i], source)); } source.Append(");\n"); source.AppendFront(SetResultVar(seqDebug, "null")); break; } case SequenceComputationType.DebugEmit: { SequenceComputationDebugEmit seqDebug = (SequenceComputationDebugEmit)seqComp; source.AppendFront("procEnv.DebugEmitting("); for(int i = 0; i < seqDebug.ArgExprs.Count; ++i) { if(i == 0) source.Append("(string)"); else source.Append(", "); source.Append(GetSequenceExpression(seqDebug.ArgExprs[i], source)); } source.Append(");\n"); source.AppendFront(SetResultVar(seqDebug, "null")); break; } case SequenceComputationType.DebugHalt: { SequenceComputationDebugHalt seqDebug = (SequenceComputationDebugHalt)seqComp; source.AppendFront("procEnv.DebugHalting("); for(int i = 0; i < seqDebug.ArgExprs.Count; ++i) { if(i == 0) source.Append("(string)"); else source.Append(", "); source.Append(GetSequenceExpression(seqDebug.ArgExprs[i], source)); } source.Append(");\n"); source.AppendFront(SetResultVar(seqDebug, "null")); break; } case SequenceComputationType.DebugHighlight: { SequenceComputationDebugHighlight seqDebug = (SequenceComputationDebugHighlight)seqComp; source.AppendFront("List<object> values = new List<object>();\n"); source.AppendFront("List<string> annotations = new List<string>();\n"); for(int i = 1; i < seqDebug.ArgExprs.Count; ++i) { if(i % 2 == 1) source.AppendFront("values.Add(" + GetSequenceExpression(seqDebug.ArgExprs[i], source) + ");\n"); else source.AppendFront("annotations.Add((string)" + GetSequenceExpression(seqDebug.ArgExprs[i], source) + ");\n"); } source.AppendFront("procEnv.DebugHighlighting(" + GetSequenceExpression(seqDebug.ArgExprs[0], source) + ", values, annotations);\n"); source.AppendFront(SetResultVar(seqDebug, "null")); break; } case SequenceComputationType.Emit: { SequenceComputationEmit seqEmit = (SequenceComputationEmit)seqComp; bool declarationEmitted = false; for(int i = 0; i < seqEmit.Expressions.Count; ++i) { if(!(seqEmit.Expressions[i] is SequenceExpressionConstant)) { string emitVal = "emitval_" + seqEmit.Id; if(!declarationEmitted) { source.AppendFront("object " + emitVal + ";\n"); declarationEmitted = true; } source.AppendFront(emitVal + " = " + GetSequenceExpression(seqEmit.Expressions[i], source) + ";\n"); if(seqEmit.Expressions[i].Type(env) == "" || seqEmit.Expressions[i].Type(env).StartsWith("set<") || seqEmit.Expressions[i].Type(env).StartsWith("map<") || seqEmit.Expressions[i].Type(env).StartsWith("array<") || seqEmit.Expressions[i].Type(env).StartsWith("deque<")) { source.AppendFront("if(" + emitVal + " is IDictionary)\n"); source.AppendFront("\tprocEnv.EmitWriter.Write(GRGEN_LIBGR.EmitHelper.ToString((IDictionary)" + emitVal + ", graph));\n"); source.AppendFront("else if(" + emitVal + " is IList)\n"); source.AppendFront("\tprocEnv.EmitWriter.Write(GRGEN_LIBGR.EmitHelper.ToString((IList)" + emitVal + ", graph));\n"); source.AppendFront("else if(" + emitVal + " is GRGEN_LIBGR.IDeque)\n"); source.AppendFront("\tprocEnv.EmitWriter.Write(GRGEN_LIBGR.EmitHelper.ToString((GRGEN_LIBGR.IDeque)" + emitVal + ", graph));\n"); source.AppendFront("else\n\t"); } source.AppendFront("procEnv.EmitWriter.Write(GRGEN_LIBGR.EmitHelper.ToString(" + emitVal + ", graph));\n"); } else { SequenceExpressionConstant constant = (SequenceExpressionConstant)seqEmit.Expressions[i]; if(constant.Constant is string) { String text = (string)constant.Constant; text = text.Replace("\n", "\\n"); text = text.Replace("\r", "\\r"); text = text.Replace("\t", "\\t"); source.AppendFront("procEnv.EmitWriter.Write(\"" + text + "\");\n"); } else source.AppendFront("procEnv.EmitWriter.Write(GRGEN_LIBGR.EmitHelper.ToString(" + GetSequenceExpression(seqEmit.Expressions[i], source) + ", graph));\n"); } } source.AppendFront(SetResultVar(seqEmit, "null")); break; } case SequenceComputationType.Record: { SequenceComputationRecord seqRec = (SequenceComputationRecord)seqComp; if(!(seqRec.Expression is SequenceExpressionConstant)) { string recVal = "recval_" + seqRec.Id; source.AppendFront("object " + recVal + " = " + GetSequenceExpression(seqRec.Expression, source) + ";\n"); if(seqRec.Expression.Type(env) == "" || seqRec.Expression.Type(env).StartsWith("set<") || seqRec.Expression.Type(env).StartsWith("map<") || seqRec.Expression.Type(env).StartsWith("array<") || seqRec.Expression.Type(env).StartsWith("deque<")) { source.AppendFront("if(" + recVal + " is IDictionary)\n"); source.AppendFront("\tprocEnv.Recorder.Write(GRGEN_LIBGR.EmitHelper.ToString((IDictionary)" + recVal + ", graph));\n"); source.AppendFront("else if(" + recVal + " is IList)\n"); source.AppendFront("\tprocEnv.Recorder.Write(GRGEN_LIBGR.EmitHelper.ToString((IList)" + recVal + ", graph));\n"); source.AppendFront("else if(" + recVal + " is GRGEN_LIBGR.IDeque)\n"); source.AppendFront("\tprocEnv.Recorder.Write(GRGEN_LIBGR.EmitHelper.ToString((GRGEN_LIBGR.IDeque)" + recVal + ", graph));\n"); source.AppendFront("else\n\t"); } source.AppendFront("procEnv.Recorder.Write(GRGEN_LIBGR.EmitHelper.ToString(" + recVal + ", graph));\n"); } else { SequenceExpressionConstant constant = (SequenceExpressionConstant)seqRec.Expression; if(constant.Constant is string) { String text = (string)constant.Constant; text = text.Replace("\n", "\\n"); text = text.Replace("\r", "\\r"); text = text.Replace("\t", "\\t"); source.AppendFront("procEnv.Recorder.Write(\"" + text + "\");\n"); } else source.AppendFront("procEnv.Recorder.Write(GRGEN_LIBGR.EmitHelper.ToString(" + GetSequenceExpression(seqRec.Expression, source) + ", graph));\n"); } source.AppendFront(SetResultVar(seqRec, "null")); break; } case SequenceComputationType.Export: { SequenceComputationExport seqExp = (SequenceComputationExport)seqComp; string expFileName = "expfilename_" + seqExp.Id; source.AppendFront("object " + expFileName + " = " + GetSequenceExpression(seqExp.Name, source) + ";\n"); string expArguments = "exparguments_" + seqExp.Id; source.AppendFront("List<string> " + expArguments + " = new List<string>();\n"); source.AppendFront(expArguments + ".Add(" + expFileName + ".ToString());\n"); string expGraph = "expgraph_" + seqExp.Id; if(seqExp.Graph != null) source.AppendFront("GRGEN_LIBGR.IGraph " + expGraph + " = (GRGEN_LIBGR.IGraph)" + GetSequenceExpression(seqExp.Graph, source) + ";\n"); else source.AppendFront("GRGEN_LIBGR.IGraph " + expGraph + " = graph;\n"); source.AppendFront(expArguments + ".Add(" + expFileName + ".ToString());\n"); source.AppendFront("if(" + expGraph + " is GRGEN_LIBGR.INamedGraph)\n"); source.AppendFront("\tGRGEN_LIBGR.Porter.Export((GRGEN_LIBGR.INamedGraph)" + expGraph + ", " + expArguments + ");\n"); source.AppendFront("else\n"); source.AppendFront("\tGRGEN_LIBGR.Porter.Export(" + expGraph + ", " + expArguments + ");\n"); source.AppendFront(SetResultVar(seqExp, "null")); break; } case SequenceComputationType.DeleteFile: { SequenceComputationDeleteFile seqDelFile = (SequenceComputationDeleteFile)seqComp; string delFileName = "delfilename_" + seqDelFile.Id; source.AppendFront("object " + delFileName + " = " + GetSequenceExpression(seqDelFile.Name, source) + ";\n"); source.AppendFront("\tSystem.IO.File.Delete((string)" + delFileName + ");\n"); source.AppendFront(SetResultVar(seqDelFile, "null")); break; } case SequenceComputationType.GraphAdd: { SequenceComputationGraphAdd seqAdd = (SequenceComputationGraphAdd)seqComp; if(seqAdd.ExprSrc == null) { string typeExpr = GetSequenceExpression(seqAdd.Expr, source); source.Append("GRGEN_LIBGR.GraphHelper.AddNodeOfType(" + typeExpr + ", graph)"); } else { string typeExpr = GetSequenceExpression(seqAdd.Expr, source); string srcExpr = GetSequenceExpression(seqAdd.ExprSrc, source); string tgtExpr = GetSequenceExpression(seqAdd.ExprDst, source); source.Append("GRGEN_LIBGR.GraphHelper.AddEdgeOfType(" + typeExpr + ", (GRGEN_LIBGR.INode)" + srcExpr + ", (GRGEN_LIBGR.INode)" + tgtExpr + ", graph)"); } break; } case SequenceComputationType.GraphRem: { SequenceComputationGraphRem seqRem = (SequenceComputationGraphRem)seqComp; string remVal = "remval_" + seqRem.Id; string seqRemExpr = GetSequenceExpression(seqRem.Expr, source); if(seqRem.Expr.Type(env) == "") { source.AppendFront("GRGEN_LIBGR.IGraphElement " + remVal + " = (GRGEN_LIBGR.IGraphElement)" + seqRemExpr + ";\n"); source.AppendFront("if(" + remVal + " is GRGEN_LIBGR.IEdge)\n"); source.AppendFront("\tgraph.Remove((GRGEN_LIBGR.IEdge)" + remVal + ");\n"); source.AppendFront("else\n"); source.AppendFront("\t{graph.RemoveEdges((GRGEN_LIBGR.INode)" + remVal + "); graph.Remove((GRGEN_LIBGR.INode)" + remVal + ");}\n"); } else { if(TypesHelper.IsSameOrSubtype(seqRem.Expr.Type(env), "Node", model)) { source.AppendFront("GRGEN_LIBGR.INode " + remVal + " = (GRGEN_LIBGR.INode)" + seqRemExpr + ";\n"); source.AppendFront("graph.RemoveEdges(" + remVal + "); graph.Remove(" + remVal + ");\n"); } else if(TypesHelper.IsSameOrSubtype(seqRem.Expr.Type(env), "Edge", model)) { source.AppendFront("GRGEN_LIBGR.IEdge " + remVal + " = (GRGEN_LIBGR.IEdge)" + seqRemExpr + ";\n"); source.AppendFront("\tgraph.Remove(" + remVal + ");\n"); } else source.AppendFront("throw new Exception(\"rem() on non-node/edge\");\n"); } source.AppendFront(SetResultVar(seqRem, "null")); break; } case SequenceComputationType.GraphClear: { SequenceComputationGraphClear seqClr = (SequenceComputationGraphClear)seqComp; source.AppendFront("graph.Clear();\n"); source.AppendFront(SetResultVar(seqClr, "null")); break; } 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")); break; } case SequenceComputationType.Insert: { SequenceComputationInsert seqIns = (SequenceComputationInsert)seqComp; string graphExpr = GetSequenceExpression(seqIns.Graph, source); source.AppendFrontFormat("GRGEN_LIBGR.GraphHelper.Insert((GRGEN_LIBGR.IGraph){0}, graph);\n", graphExpr); source.AppendFront(SetResultVar(seqIns, "null")); break; } case SequenceComputationType.InsertCopy: { SequenceComputationInsertCopy seqInsCopy = (SequenceComputationInsertCopy)seqComp; string graphExpr = GetSequenceExpression(seqInsCopy.Graph, source); string rootNodeExpr = GetSequenceExpression(seqInsCopy.RootNode, source); source.AppendFormat("GRGEN_LIBGR.GraphHelper.InsertCopy((GRGEN_LIBGR.IGraph){0}, (GRGEN_LIBGR.INode){1}, graph)", graphExpr, rootNodeExpr); break; } case SequenceComputationType.InsertInduced: { SequenceComputationInsertInduced seqInsInd = (SequenceComputationInsertInduced)seqComp; source.Append("GRGEN_LIBGR.GraphHelper.InsertInduced((IDictionary<GRGEN_LIBGR.INode, GRGEN_LIBGR.SetValueType>)" + GetSequenceExpression(seqInsInd.NodeSet, source) + ", (GRGEN_LIBGR.INode)" + GetSequenceExpression(seqInsInd.RootNode, source) + ", graph)"); break; } case SequenceComputationType.InsertDefined: { SequenceComputationInsertDefined seqInsDef = (SequenceComputationInsertDefined)seqComp; source.Append("GRGEN_LIBGR.GraphHelper.InsertDefined((IDictionary<GRGEN_LIBGR.IEdge, GRGEN_LIBGR.SetValueType>)" + GetSequenceExpression(seqInsDef.EdgeSet, source) + ", (GRGEN_LIBGR.IEdge)" + GetSequenceExpression(seqInsDef.RootEdge, source) + ", graph)"); break; } case SequenceComputationType.Expression: { SequenceExpression seqExpr = (SequenceExpression)seqComp; source.AppendFront(SetResultVar(seqExpr, GetSequenceExpression(seqExpr, source))); break; } case SequenceComputationType.BuiltinProcedureCall: { SequenceComputationBuiltinProcedureCall seqCall = (SequenceComputationBuiltinProcedureCall)seqComp; SourceBuilder sb = new SourceBuilder(); EmitSequenceComputation(seqCall.BuiltinProcedure, sb); if(seqCall.ReturnVars.Count > 0) { source.AppendFront(SetVar(seqCall.ReturnVars[0], sb.ToString())); source.AppendFront(SetResultVar(seqCall, GetVar(seqCall.ReturnVars[0]))); } else { source.AppendFront(sb.ToString() + ";\n"); source.AppendFront(SetResultVar(seqCall, "null")); } break; } case SequenceComputationType.ProcedureCall: { SequenceComputationProcedureCall seqCall = (SequenceComputationProcedureCall)seqComp; String returnParameterDeclarations; String returnArguments; String returnAssignments; BuildReturnParameters(seqCall.ParamBindings, out returnParameterDeclarations, out returnArguments, out returnAssignments); if(returnParameterDeclarations.Length != 0) source.AppendFront(returnParameterDeclarations + "\n"); if(seqCall.IsExternalProcedureCalled) source.AppendFront("GRGEN_EXPR.ExternalProcedures."); else source.AppendFrontFormat("GRGEN_ACTIONS.{0}Procedures.", TypesHelper.GetPackagePrefixDot(seqCall.ParamBindings.Package)); source.Append(seqCall.ParamBindings.Name); source.Append("(procEnv, graph"); source.Append(BuildParameters(seqCall.ParamBindings)); source.Append(returnArguments); source.Append(");\n"); if(returnAssignments.Length != 0) source.AppendFront(returnAssignments + "\n"); source.AppendFront(SetResultVar(seqCall, "null")); break; } case SequenceComputationType.ProcedureMethodCall: { SequenceComputationProcedureMethodCall seqCall = (SequenceComputationProcedureMethodCall)seqComp; String type = seqCall.TargetExpr != null ? seqCall.TargetExpr.Type(env) : seqCall.TargetVar.Type; if(type == "") { string tmpVarName = "tmpvar_" + tmpVarCtr.ToString(); ++tmpVarCtr; source.AppendFront("object[] " + tmpVarName + " = "); source.Append("((GRGEN_LIBGR.IGraphElement)"); if(seqCall.TargetExpr != null) source.Append(GetSequenceExpression(seqCall.TargetExpr, source)); else source.Append(GetVar(seqCall.TargetVar)); source.Append(").ApplyProcedureMethod(procEnv, graph, "); source.Append("\"" + seqCall.ParamBindings.Name + "\""); source.Append(BuildParametersInObject(seqCall.ParamBindings)); source.Append(");\n"); for(int i = 0; i < seqCall.ParamBindings.ReturnVars.Length; i++) source.Append(SetVar(seqCall.ParamBindings.ReturnVars[i], tmpVarName)); } else { String returnParameterDeclarations; String returnArguments; String returnAssignments; BuildReturnParameters(seqCall.ParamBindings, TypesHelper.GetNodeOrEdgeType(type, model), out returnParameterDeclarations, out returnArguments, out returnAssignments); if(returnParameterDeclarations.Length != 0) source.AppendFront(returnParameterDeclarations + "\n"); source.AppendFront("(("); source.Append(TypesHelper.XgrsTypeToCSharpType(type, model)); source.Append(")"); if(seqCall.TargetExpr != null) source.Append(GetSequenceExpression(seqCall.TargetExpr, source)); else source.Append(GetVar(seqCall.TargetVar)); source.Append(")."); source.Append(seqCall.ParamBindings.Name); source.Append("(procEnv, graph"); source.Append(BuildParameters(seqCall.ParamBindings, TypesHelper.GetNodeOrEdgeType(type, model).GetProcedureMethod(seqCall.ParamBindings.Name))); source.Append(returnArguments); source.Append(");\n"); } source.AppendFront(SetResultVar(seqCall, "null")); break; } default: throw new Exception("Unknown sequence computation type: " + seqComp.SequenceComputationType); } }
public override void Dump(SourceBuilder builder) { builder.AppendFront("AdjustListHeads "); if(Type==AdjustListHeadsTypes.GraphElements) { builder.Append("GraphElements "); builder.AppendFormat("on {0} node:{1} {2}\n", PatternElementName, IsNode, Parallel ? "Parallel " : ""); } else { // Type==AdjustListHeadsTypes.IncidentEdges builder.Append("IncidentEdges "); builder.AppendFormat("on {0} from:{1} incident type:{2} {3}\n", PatternElementName, StartingPointNodeName, IncidentType.ToString(), Parallel ? "Parallel " : ""); } }
public override void Dump(SourceBuilder builder) { // first dump local content builder.AppendFront("FillPartialMatchForDuplicateChecking with "); foreach(string neededElement in NeededElements) { builder.AppendFormat("{0} ", neededElement); } builder.Append("\n"); }
public override void Dump(SourceBuilder builder) { builder.AppendFront("AbandonCandidate "); builder.AppendFormat("on {0} negNamePrefix:{1} node:{2}", PatternElementName, NegativeIndependentNamePrefix, IsNode); builder.AppendFormat("parallel:{0} all:{1} ", Parallel, LockForAllThreads); builder.AppendFormat("\n"); }
public override void Emit(SourceBuilder sourceCode) { sourceCode.AppendFormat("{0}: ;\n", LabelName); }
public override void Dump(SourceBuilder builder) { builder.AppendFront("ContinueOperation "); if(Type==ContinueOperationType.ByReturn) { builder.Append("ByReturn "); if(InParallelizedBody) builder.Append("InParallelizedBody "); builder.AppendFormat("return matches:{0}\n", ReturnMatches); } else if(Type==ContinueOperationType.ByContinue) { builder.AppendFormat("ByContinue {0}\n", ContinueAtParallelizedLoop ? "AtParallelizedLoop" : ""); } else { // Type==ContinueOperationType.ByGoto builder.Append("ByGoto "); builder.AppendFormat("{0}\n", LabelName); } }
public override void Emit(SourceBuilder sourceCode) { sourceCode.AppendFormat("(({0})((GRGEN_LGSP.LGSPGraphProcessingEnvironment)actionEnv).GetVariableValue(\"{1}\")).@{2}", OwnerType, Owner, Member); }
public override void Dump(SourceBuilder builder) { // first dump check builder.AppendFront("CheckCandidate MapByUnique "); builder.AppendFormat("on {0} node:{1}\n", PatternElementName, IsNode); // then operations for case check failed if(CheckFailedOperations != null) { builder.Indent(); CheckFailedOperations.Dump(builder); builder.Unindent(); } }
public override void Dump(SourceBuilder builder) { if(Type == PushAndPopSubpatternTaskTypes.Subpattern) { builder.AppendFront("PushSubpatternTask Subpattern "); } else if(Type == PushAndPopSubpatternTaskTypes.Alternative) { builder.AppendFront("PushSubpatternTask Alternative "); } else { // Type==PushAndPopSubpatternTaskTypes.Iterated builder.AppendFront("PushSubpatternTask Iterated "); } if(Type == PushAndPopSubpatternTaskTypes.Subpattern) { builder.AppendFormat("{0} of {1} ", SubpatternElementName, SubpatternName); } else { builder.AppendFormat("{0}/{1} ", PathPrefix, AlternativeOrIteratedName); } if(Parallel) builder.Append("Parallel "); builder.Append("with "); for (int i = 0; i < ConnectionName.Length; ++i) { builder.AppendFormat("{0} <- {1} ", ConnectionName[i], ArgumentExpressions[i]); } builder.Append("\n"); }
public override void Emit(SourceBuilder sourceCode) { // --- move list head from current position to random position --- if (Type == RandomizeListHeadsTypes.GraphElements) { // emit declaration of variable containing random position to move list head to string variableContainingRandomPosition = "random_position_" + PatternElementName; sourceCode.AppendFormat("int {0}", variableContainingRandomPosition); // emit initialization with ramdom position string graphMemberContainingElementListCountsByType = IsNode ? "nodesByTypeCounts" : "edgesByTypeCounts"; string variableContainingTypeIDForCandidate = NamesOfEntities.TypeIdForCandidateVariable(PatternElementName); sourceCode.AppendFormat(" = random.Next(graph.{0}[{1}]);\n", graphMemberContainingElementListCountsByType, variableContainingTypeIDForCandidate); // emit declaration of variable containing element at random position string typeOfVariableContainingElementAtRandomPosition = "GRGEN_LGSP." + (IsNode ? "LGSPNode" : "LGSPEdge"); string variableContainingElementAtRandomPosition = "random_element_" + PatternElementName; sourceCode.AppendFrontFormat("{0} {1}", typeOfVariableContainingElementAtRandomPosition, variableContainingElementAtRandomPosition); // emit initialization with element list head string graphMemberContainingElementListHeadByType = IsNode ? "nodesByTypeHeads" : "edgesByTypeHeads"; sourceCode.AppendFormat(" = graph.{0}[{1}];\n", graphMemberContainingElementListHeadByType, variableContainingTypeIDForCandidate); // emit iteration to get element at random position sourceCode.AppendFrontFormat( "for(int i = 0; i < {0}; ++i) {1} = {1}.Next;\n", variableContainingRandomPosition, variableContainingElementAtRandomPosition); // iteration left, element is the one at the requested random position // move list head after element at random position, sourceCode.AppendFrontFormat("graph.MoveHeadAfter({0});\n", variableContainingElementAtRandomPosition); // effect is new random starting point for following iteration } else //Type == RandomizeListHeadsTypes.IncidentEdges { // emit "randomization only if list is not empty" string variableContainingStartingPointNode = NamesOfEntities.CandidateVariable(StartingPointNodeName); string memberOfNodeContainingListHead = IsIncoming ? "lgspInhead" : "lgspOuthead"; sourceCode.AppendFrontFormat("if({0}.{1}!=null)\n", variableContainingStartingPointNode, memberOfNodeContainingListHead); sourceCode.AppendFront("{\n"); sourceCode.Indent(); // emit declaration of variable containing random position to move list head to, initialize it to 0 string variableContainingRandomPosition = "random_position_" + PatternElementName; sourceCode.AppendFrontFormat("int {0} = 0;", variableContainingRandomPosition); // misuse variable to store length of list which is computed within the follwing iteration string memberOfEdgeContainingNextEdge = IsIncoming ? "lgspInNext" : "lgspOutNext"; sourceCode.AppendFrontFormat("for(GRGEN_LGSP.LGSPEdge edge = {0}.{1}; edge!={0}.{1}; edge=edge.{2}) ++{3};\n", variableContainingStartingPointNode, memberOfNodeContainingListHead, memberOfEdgeContainingNextEdge, variableContainingRandomPosition); // emit initialization of variable containing ramdom position // now that the necessary length of the list is known after the iteration // given in the variable itself sourceCode.AppendFrontFormat("{0} = random.Next({0});\n", variableContainingRandomPosition); // emit declaration of variable containing edge at random position string variableContainingEdgeAtRandomPosition = "random_element_" + PatternElementName; sourceCode.AppendFrontFormat("GRGEN_LGSP.LGSPEdge {0}", variableContainingEdgeAtRandomPosition); // emit initialization with edge list head sourceCode.AppendFormat(" = {0}.{1};\n", variableContainingStartingPointNode, memberOfNodeContainingListHead); // emit iteration to get edge at random position sourceCode.AppendFrontFormat( "for(int i = 0; i < {0}; ++i) {1} = {1}.{2};\n", variableContainingRandomPosition, variableContainingEdgeAtRandomPosition, memberOfEdgeContainingNextEdge); // iteration left, edge is the one at the requested random position // move list head after edge at random position, if (IsIncoming) { sourceCode.AppendFrontFormat("{0}.MoveInHeadAfter({1});\n", variableContainingStartingPointNode, variableContainingEdgeAtRandomPosition); } else { sourceCode.AppendFrontFormat("{0}.MoveOutHeadAfter({1});\n", variableContainingStartingPointNode, variableContainingEdgeAtRandomPosition); } // close list is not empty check sourceCode.Unindent(); sourceCode.AppendFront("}\n"); // effect is new random starting point for following iteration } }
public override void Dump(SourceBuilder builder) { builder.AppendFront("RandomizeListHeads "); if (Type == RandomizeListHeadsTypes.GraphElements) { builder.Append("GraphElements "); builder.AppendFormat("on {0} node:{1}\n", PatternElementName, IsNode); } else { // Type==RandomizeListHeadsTypes.IncidentEdges builder.Append("IncidentEdges "); builder.AppendFormat("on {0} from:{1} incoming:{2}\n", PatternElementName, StartingPointNodeName, IsIncoming); } }
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"); }
public override void Emit(SourceBuilder sourceCode) { sourceCode.AppendFormat("(({0})((GRGEN_LGSP.LGSPGraphProcessingEnvironment)actionEnv).GetVariableValue(\"{1}\"))", Type, GlobalVariableName); }
public override void Dump(SourceBuilder builder) { builder.AppendFront("GotoLabel "); builder.AppendFormat("{0}\n", LabelName); }
public override void Emit(SourceBuilder sourceCode) { if(sourceCode.CommentSourceCode) sourceCode.AppendFront("// Condition \n"); // open decision sourceCode.AppendFront("if("); // emit condition expression sourceCode.AppendFormat("!({0})", ConditionExpression); // close decision sourceCode.Append(") "); // emit check failed code sourceCode.Append("{\n"); sourceCode.Indent(); CheckFailedOperations.Emit(sourceCode); sourceCode.Unindent(); sourceCode.AppendFront("}\n"); }
public override void Dump(SourceBuilder builder) { // first dump local content builder.AppendFront("CheckPartialMatch ForDuplicate with "); foreach(string neededElement in NeededElements) { builder.AppendFormat("{0} ", neededElement); } builder.Append("\n"); // then operations for case check failed if(CheckFailedOperations != null) { builder.Indent(); CheckFailedOperations.Dump(builder); builder.Unindent(); } }
public override void Emit(SourceBuilder sourceCode) { if (sourceCode.CommentSourceCode) { sourceCode.AppendFront("// Check whether a duplicate match to be purged was found or will be found\n"); } // emit hash variable declaration sourceCode.AppendFrontFormat("int {0} = 0;\n", NamesOfEntities.DuplicateMatchHashVariable()); // only do the rest if more than one match is requested sourceCode.AppendFront("if(maxMatches!=1) {\n"); sourceCode.Indent(); // emit found matches hash map initialization as needed sourceCode.AppendFrontFormat("if({0}==null) {0} = new Dictionary<int, {1}>();\n", NamesOfEntities.FoundMatchesForFilteringVariable(), RulePatternClassName + "." + NamesOfEntities.MatchClassName(PatternName)); // emit hash variable initialization with result of hash computation sourceCode.AppendFrontFormat("{0} = unchecked(", NamesOfEntities.DuplicateMatchHashVariable()); EmitHashComputation(sourceCode, NeededElements.Length - 1); sourceCode.Append(");\n"); // emit check whether hash is contained in found matches hash map sourceCode.AppendFrontFormat("if({0}.ContainsKey({1}))\n", NamesOfEntities.FoundMatchesForFilteringVariable(), NamesOfEntities.DuplicateMatchHashVariable()); sourceCode.AppendFront("{\n"); sourceCode.Indent(); // emit check whether one of the matches in the hash map with same hash is equal to the locally matched elements sourceCode.AppendFrontFormat("{0} {1} = {2}[{3}];\n", RulePatternClassName + "." + NamesOfEntities.MatchClassName(PatternName), NamesOfEntities.DuplicateMatchCandidateVariable(), NamesOfEntities.FoundMatchesForFilteringVariable(), NamesOfEntities.DuplicateMatchHashVariable()); sourceCode.AppendFront("do {\n"); sourceCode.Indent(); // emit check for same elements sourceCode.AppendFront("if("); for (int i = 0; i < NeededElements.Length; ++i) { if (i != 0) { sourceCode.Append(" && "); } sourceCode.AppendFormat("{0}._{1} == {2}", NamesOfEntities.DuplicateMatchCandidateVariable() + MatchObjectPaths[i], NamesOfEntities.MatchName(NeededElementsUnprefixedName[i], NeededElementsIsNode[i] ? BuildMatchObjectType.Node : BuildMatchObjectType.Edge), NamesOfEntities.CandidateVariable(NeededElements[i])); } sourceCode.Append(")\n"); // emit check failed code, i.e. the current local match is equivalent to one of the already found ones, a duplicate sourceCode.AppendFront("{\n"); sourceCode.Indent(); CheckFailedOperations.Emit(sourceCode); sourceCode.Unindent(); sourceCode.AppendFront("}\n"); // close "emit check whether one of the matches in the hash map with same hash is equal to the locally matched elements" // switching to next match with the same hash, if available sourceCode.Unindent(); sourceCode.AppendFront("} "); sourceCode.AppendFormat("while(({0} = {0}.nextWithSameHash) != null);\n", NamesOfEntities.DuplicateMatchCandidateVariable()); // close "emit check whether hash is contained in found matches hash map" sourceCode.Unindent(); sourceCode.AppendFront("}\n"); // close "only do the rest if more than one match is requested" sourceCode.Unindent(); sourceCode.AppendFront("}\n"); }
void EmitHashComputation(SourceBuilder sourceCode, int i) { if(i < 0) sourceCode.Append("23"); else { sourceCode.Append("("); EmitHashComputation(sourceCode, i - 1); sourceCode.AppendFormat("*17 + {0}.GetHashCode()", NamesOfEntities.CandidateVariable(NeededElements[i])); sourceCode.Append(")"); } }
public override void Dump(SourceBuilder builder) { // first dump check builder.AppendFront("CheckPartialMatch ByCondition "); builder.AppendFormat("{0} with ", ConditionExpression); foreach(string neededElement in NeededElements) { builder.Append(neededElement); builder.Append(" "); } foreach(string neededVar in NeededVariables) { builder.Append(neededVar); builder.Append(" "); } builder.Append("\n"); // then operations for case check failed if (CheckFailedOperations != null) { builder.Indent(); CheckFailedOperations.Dump(builder); builder.Unindent(); } }
public override void Dump(SourceBuilder builder) { builder.AppendFront("AbandonCandidatePatternpath"); builder.AppendFormat("on {0} negNamePrefix:{1} node:{2}\n", PatternElementName, NegativeIndependentNamePrefix, IsNode); }
public override void Emit(SourceBuilder sourceCode) { // open decision whether to fail sourceCode.AppendFront("if("); // fail if graph element contained within candidate was already matched // (previously on the pattern derivation path to another pattern element) // as this would cause a inter-pattern-homomorphic match string variableContainingCandidate = NamesOfEntities.CandidateVariable(PatternElementName); string isMatchedBySomeBit = "(uint)GRGEN_LGSP.LGSPElemFlags.IS_MATCHED_BY_SOME_ENCLOSING_PATTERN"; if (!Always) { sourceCode.Append("searchPatternpath && "); } sourceCode.AppendFormat("({0}.lgspFlags & {1})=={1} && GRGEN_LGSP.PatternpathIsomorphyChecker.IsMatched({0}, {2})", variableContainingCandidate, isMatchedBySomeBit, LastMatchAtPreviousNestingLevel); sourceCode.Append(")\n"); // emit check failed code sourceCode.AppendFront("{\n"); sourceCode.Indent(); CheckFailedOperations.Emit(sourceCode); sourceCode.Unindent(); sourceCode.AppendFront("}\n"); }
/// <summary> // generate implementation of the exact action interface, // delegate calls of the inexact action interface IAction to the exact action interface /// </summary> void GenerateActionImplementation(SourceBuilder sb, LGSPRulePattern matchingPattern) { StringBuilder sbInParameters = new StringBuilder(); StringBuilder sbInArguments = new StringBuilder(); StringBuilder sbInArgumentsFromArray = new StringBuilder(); for(int i = 0; i < matchingPattern.Inputs.Length; ++i) { sbInParameters.Append(", "); sbInParameters.Append(TypesHelper.TypeName(matchingPattern.Inputs[i])); sbInParameters.Append(" "); sbInParameters.Append(matchingPattern.InputNames[i]); sbInArguments.Append(", "); sbInArguments.Append(matchingPattern.InputNames[i]); sbInArgumentsFromArray.Append(", ("); sbInArgumentsFromArray.Append(TypesHelper.TypeName(matchingPattern.Inputs[i])); sbInArgumentsFromArray.Append(") parameters["); sbInArgumentsFromArray.Append(i); sbInArgumentsFromArray.Append("]"); } String inParameters = sbInParameters.ToString(); String inArguments = sbInArguments.ToString(); String inArgumentsFromArray = sbInArgumentsFromArray.ToString(); StringBuilder sbOutParameters = new StringBuilder(); StringBuilder sbRefParameters = new StringBuilder(); StringBuilder sbOutLocals = new StringBuilder(); StringBuilder sbRefLocals = new StringBuilder(); StringBuilder sbOutArguments = new StringBuilder(); StringBuilder sbRefArguments = new StringBuilder(); StringBuilder sbOutIntermediateLocalsAll = new StringBuilder(); StringBuilder sbOutParametersAll = new StringBuilder(); StringBuilder sbOutArgumentsAll = new StringBuilder(); StringBuilder sbIntermediateLocalArgumentsAll = new StringBuilder(); StringBuilder sbOutClassArgumentsAll = new StringBuilder(); for(int i = 0; i < matchingPattern.Outputs.Length; ++i) { sbOutParameters.Append(", out "); sbOutParameters.Append(TypesHelper.TypeName(matchingPattern.Outputs[i])); sbOutParameters.Append(" output_"); sbOutParameters.Append(i); sbRefParameters.Append(", ref "); sbRefParameters.Append(TypesHelper.TypeName(matchingPattern.Outputs[i])); sbRefParameters.Append(" output_"); sbRefParameters.Append(i); sbOutLocals.Append(TypesHelper.TypeName(matchingPattern.Outputs[i])); sbOutLocals.Append(" output_"); sbOutLocals.Append(i); sbOutLocals.Append("; "); sbRefLocals.Append(TypesHelper.TypeName(matchingPattern.Outputs[i])); sbRefLocals.Append(" output_"); sbRefLocals.Append(i); sbRefLocals.Append(" = "); sbRefLocals.Append(TypesHelper.DefaultValueString(matchingPattern.Outputs[i].PackagePrefixedName, model)); sbRefLocals.Append("; "); sbOutArguments.Append(", out output_"); sbOutArguments.Append(i); sbRefArguments.Append(", ref output_"); sbRefArguments.Append(i); sbOutIntermediateLocalsAll.Append(TypesHelper.TypeName(matchingPattern.Outputs[i])); sbOutIntermediateLocalsAll.Append(" output_local_"); sbOutIntermediateLocalsAll.Append(i); sbOutIntermediateLocalsAll.Append("; "); sbOutParametersAll.Append(", List<"); sbOutParametersAll.Append(TypesHelper.TypeName(matchingPattern.Outputs[i])); sbOutParametersAll.Append("> output_"); sbOutParametersAll.Append(i); sbOutArgumentsAll.Append(", output_"); sbOutArgumentsAll.Append(i); sbIntermediateLocalArgumentsAll.Append(", out output_local_"); sbIntermediateLocalArgumentsAll.Append(i); sbOutClassArgumentsAll.Append(", output_list_"); sbOutClassArgumentsAll.Append(i); } String outParameters = sbOutParameters.ToString(); String refParameters = sbRefParameters.ToString(); String outLocals = sbOutLocals.ToString(); String refLocals = sbRefLocals.ToString(); String outArguments = sbOutArguments.ToString(); String refArguments = sbRefArguments.ToString(); String outIntermediateLocalsAll = sbOutIntermediateLocalsAll.ToString(); String outParametersAll = sbOutParametersAll.ToString(); String outArgumentsAll = sbOutArgumentsAll.ToString(); String intermediateLocalArgumentsAll = sbIntermediateLocalArgumentsAll.ToString(); String outClassArgumentsAll = sbOutClassArgumentsAll.ToString(); String matchingPatternClassName = matchingPattern.GetType().Name; String patternName = matchingPattern.name; String matchType = matchingPatternClassName + "." + NamesOfEntities.MatchInterfaceName(patternName); String matchesType = "GRGEN_LIBGR.IMatchesExact<" + matchType + ">"; // implementation of exact action interface sb.AppendFront("/// <summary> Type of the matcher method (with parameters processing environment containing host graph, maximum number of matches to search for (zero=unlimited), and rule parameters; returning found matches). </summary>\n"); sb.AppendFrontFormat("public delegate {0} MatchInvoker(GRGEN_LGSP.LGSPActionExecutionEnvironment actionEnv, int maxMatches{1});\n", matchesType, inParameters); sb.AppendFront("/// <summary> A delegate pointing to the current matcher program for this rule. </summary>\n"); sb.AppendFront("public MatchInvoker DynamicMatch;\n"); sb.AppendFront("/// <summary> The RulePattern object from which this LGSPAction object has been created. </summary>\n"); sb.AppendFront("public GRGEN_LIBGR.IRulePattern RulePattern { get { return _rulePattern; } }\n"); for(int i = 0; i < matchingPattern.Outputs.Length; ++i) { sb.AppendFront("List<"); sb.Append(TypesHelper.TypeName(matchingPattern.Outputs[i])); sb.Append("> output_list_"); sb.Append(i.ToString()); sb.Append(" = new List<"); sb.Append(TypesHelper.TypeName(matchingPattern.Outputs[i])); sb.Append(">();\n"); } sb.AppendFrontFormat("public {0} Match(GRGEN_LIBGR.IActionExecutionEnvironment actionEnv, int maxMatches{1})\n", matchesType, inParameters); sb.AppendFront("{\n"); sb.Indent(); sb.AppendFrontFormat("return DynamicMatch((GRGEN_LGSP.LGSPActionExecutionEnvironment)actionEnv, maxMatches{0});\n", inArguments); sb.Unindent(); sb.AppendFront("}\n"); sb.AppendFrontFormat("public void Modify(GRGEN_LIBGR.IActionExecutionEnvironment actionEnv, {0} match{1})\n", matchType, outParameters); sb.AppendFront("{\n"); sb.Indent(); sb.AppendFrontFormat("_rulePattern.Modify((GRGEN_LGSP.LGSPActionExecutionEnvironment)actionEnv, match{0});\n", outArguments); sb.Unindent(); sb.AppendFront("}\n"); sb.AppendFrontFormat("public void ModifyAll(GRGEN_LIBGR.IActionExecutionEnvironment actionEnv, {0} matches{1})\n", matchesType, outParametersAll); sb.AppendFront("{\n"); sb.Indent(); sb.AppendFrontFormat("foreach({0} match in matches)\n", matchType); sb.AppendFront("{\n"); sb.Indent(); sb.AppendFrontFormat("{0}\n", outIntermediateLocalsAll); sb.AppendFrontFormat("_rulePattern.Modify((GRGEN_LGSP.LGSPActionExecutionEnvironment)actionEnv, match{0});\n", intermediateLocalArgumentsAll); for(int i = 0; i < matchingPattern.Outputs.Length; ++i) { sb.AppendFrontFormat("output_{0}.Add(output_local_{0});\n", i); } sb.Unindent(); sb.AppendFront("}\n"); sb.Unindent(); sb.AppendFront("}\n"); sb.AppendFrontFormat("public bool Apply(GRGEN_LIBGR.IActionExecutionEnvironment actionEnv{0}{1})\n", inParameters, refParameters); sb.AppendFront("{\n"); sb.Indent(); sb.AppendFrontFormat("{0} matches = DynamicMatch((GRGEN_LGSP.LGSPActionExecutionEnvironment)actionEnv, 1{1});\n", matchesType, inArguments); sb.AppendFront("if(matches.Count <= 0) return false;\n"); sb.AppendFrontFormat("_rulePattern.Modify((GRGEN_LGSP.LGSPActionExecutionEnvironment)actionEnv, matches.First{0});\n", outArguments); sb.AppendFront("return true;\n"); sb.Unindent(); sb.AppendFront("}\n"); sb.AppendFrontFormat("public int ApplyAll(int maxMatches, GRGEN_LIBGR.IActionExecutionEnvironment actionEnv{0}{1})\n", inParameters, outParametersAll); sb.AppendFront("{\n"); sb.Indent(); sb.AppendFrontFormat("{0} matches = DynamicMatch((GRGEN_LGSP.LGSPActionExecutionEnvironment)actionEnv, maxMatches{1});\n", matchesType, inArguments); sb.AppendFront("if(matches.Count <= 0) return 0;\n"); sb.AppendFrontFormat("foreach({0} match in matches)\n", matchType); sb.AppendFront("{\n"); sb.Indent(); sb.AppendFrontFormat("{0}\n", outIntermediateLocalsAll); sb.AppendFrontFormat("_rulePattern.Modify((GRGEN_LGSP.LGSPActionExecutionEnvironment)actionEnv, match{0});\n", intermediateLocalArgumentsAll); for(int i = 0; i < matchingPattern.Outputs.Length; ++i) { sb.AppendFrontFormat("output_{0}.Add(output_local_{0});\n", i); } sb.Unindent(); sb.AppendFront("}\n"); sb.AppendFront("return matches.Count;\n"); sb.Unindent(); sb.AppendFront("}\n"); sb.AppendFrontFormat("public bool ApplyStar(GRGEN_LIBGR.IActionExecutionEnvironment actionEnv{0})\n", inParameters); sb.AppendFront("{\n"); sb.Indent(); sb.AppendFrontFormat("{0} matches;\n", matchesType); sb.AppendFrontFormat("{0}\n", outLocals); sb.AppendFront("while(true)\n"); sb.AppendFront("{\n"); sb.Indent(); sb.AppendFrontFormat("matches = DynamicMatch((GRGEN_LGSP.LGSPActionExecutionEnvironment)actionEnv, 1{0});\n", inArguments); sb.AppendFront("if(matches.Count <= 0) return true;\n"); sb.AppendFrontFormat("_rulePattern.Modify((GRGEN_LGSP.LGSPActionExecutionEnvironment)actionEnv, matches.First{0});\n", outArguments); sb.Unindent(); sb.AppendFront("}\n"); sb.Unindent(); sb.AppendFront("}\n"); sb.AppendFrontFormat("public bool ApplyPlus(GRGEN_LIBGR.IActionExecutionEnvironment actionEnv{0})\n", inParameters); sb.AppendFront("{\n"); sb.Indent(); sb.AppendFrontFormat("{0} matches = DynamicMatch((GRGEN_LGSP.LGSPActionExecutionEnvironment)actionEnv, 1{1});\n", matchesType, inArguments); sb.AppendFront("if(matches.Count <= 0) return false;\n"); sb.AppendFrontFormat("{0}\n", outLocals); sb.AppendFront("do\n"); sb.AppendFront("{\n"); sb.Indent(); sb.AppendFrontFormat("_rulePattern.Modify((GRGEN_LGSP.LGSPActionExecutionEnvironment)actionEnv, matches.First{0});\n", outArguments); sb.AppendFrontFormat("matches = DynamicMatch((GRGEN_LGSP.LGSPActionExecutionEnvironment)actionEnv, 1{0});\n", inArguments); sb.Unindent(); sb.AppendFront("}\n"); sb.AppendFront("while(matches.Count > 0) ;\n"); sb.AppendFront("return true;\n"); sb.Unindent(); sb.AppendFront("}\n"); sb.AppendFrontFormat("public bool ApplyMinMax(GRGEN_LIBGR.IActionExecutionEnvironment actionEnv, int min, int max{0})\n", inParameters); sb.AppendFront("{\n"); sb.Indent(); sb.AppendFrontFormat("{0} matches;\n", matchesType); sb.AppendFrontFormat("{0}\n", outLocals); sb.AppendFront("for(int i = 0; i < max; i++)\n"); sb.AppendFront("{\n"); sb.Indent(); sb.AppendFrontFormat("matches = DynamicMatch((GRGEN_LGSP.LGSPActionExecutionEnvironment)actionEnv, 1{0});\n", inArguments); sb.AppendFront("if(matches.Count <= 0) return i >= min;\n"); sb.AppendFrontFormat("_rulePattern.Modify((GRGEN_LGSP.LGSPActionExecutionEnvironment)actionEnv, matches.First{0});\n", outArguments); sb.Unindent(); sb.AppendFront("}\n"); sb.AppendFront("return true;\n"); sb.Unindent(); sb.AppendFront("}\n"); // implementation of inexact action interface by delegation to exact action interface sb.AppendFront("// implementation of inexact action interface by delegation to exact action interface\n"); sb.AppendFront("public GRGEN_LIBGR.IMatches Match(GRGEN_LIBGR.IActionExecutionEnvironment actionEnv, int maxMatches, object[] parameters)\n"); sb.AppendFront("{\n"); sb.Indent(); sb.AppendFrontFormat("return Match(actionEnv, maxMatches{0});\n", inArgumentsFromArray); sb.Unindent(); sb.AppendFront("}\n"); sb.AppendFront("public object[] Modify(GRGEN_LIBGR.IActionExecutionEnvironment actionEnv, GRGEN_LIBGR.IMatch match)\n"); sb.AppendFront("{\n"); sb.Indent(); sb.AppendFrontFormat("{0}\n", outLocals); sb.AppendFrontFormat("Modify(actionEnv, ({0})match{1});\n", matchType, outArguments); for(int i = 0; i < matchingPattern.Outputs.Length; ++i) { sb.AppendFrontFormat("ReturnArray[{0}] = output_{0};\n", i); } sb.AppendFront("return ReturnArray;\n"); sb.Unindent(); sb.AppendFront("}\n"); sb.AppendFront("public List<object[]> ModifyAll(GRGEN_LIBGR.IActionExecutionEnvironment actionEnv, GRGEN_LIBGR.IMatches matches)\n"); sb.AppendFront("{\n"); sb.Indent(); for(int i = 0; i < matchingPattern.Outputs.Length; ++i) { sb.AppendFront("output_list_"); sb.Append(i.ToString()); sb.Append(".Clear();\n"); } sb.AppendFrontFormat("ModifyAll(actionEnv, ({0})matches{1});\n", matchesType, outClassArgumentsAll); sb.AppendFront("while(AvailableReturnArrays.Count < matches.Count) AvailableReturnArrays.Add(new object[" + matchingPattern.Outputs.Length + "]);\n"); sb.AppendFront("ReturnArrayListForAll.Clear();\n"); sb.AppendFront("for(int i=0; i<matches.Count; ++i)\n"); sb.AppendFront("{\n"); sb.Indent(); sb.AppendFront("ReturnArrayListForAll.Add(AvailableReturnArrays[i]);\n"); for(int i = 0; i < matchingPattern.Outputs.Length; ++i) { sb.AppendFrontFormat("ReturnArrayListForAll[i][{0}] = output_list_{0}[i];\n", i); } sb.Unindent(); sb.AppendFront("}\n"); sb.AppendFront("return ReturnArrayListForAll;\n"); sb.Unindent(); sb.AppendFront("}\n"); sb.AppendFront("object[] GRGEN_LIBGR.IAction.Apply(GRGEN_LIBGR.IActionExecutionEnvironment actionEnv)\n"); sb.AppendFront("{\n"); sb.Indent(); if(matchingPattern.Inputs.Length == 0) { sb.AppendFrontFormat("{0}\n", refLocals); sb.AppendFrontFormat("if(Apply(actionEnv{0})) ", refArguments); sb.Append("{\n"); sb.Indent(); for(int i = 0; i < matchingPattern.Outputs.Length; ++i) { sb.AppendFrontFormat("ReturnArray[{0}] = output_{0};\n", i); } sb.AppendFront("return ReturnArray;\n"); sb.Unindent(); sb.AppendFront("}\n"); sb.AppendFront("else return null;\n"); } else sb.AppendFront("throw new Exception();\n"); sb.Unindent(); sb.AppendFront("}\n"); sb.AppendFront("object[] GRGEN_LIBGR.IAction.Apply(GRGEN_LIBGR.IActionExecutionEnvironment actionEnv, params object[] parameters)\n"); sb.AppendFront("{\n"); sb.Indent(); sb.AppendFrontFormat("{0}\n", refLocals); sb.AppendFrontFormat("if(Apply(actionEnv{0}{1})) ", inArgumentsFromArray, refArguments); sb.Append("{\n"); sb.Indent(); for(int i = 0; i < matchingPattern.Outputs.Length; ++i) { sb.AppendFrontFormat("ReturnArray[{0}] = output_{0};\n", i); } sb.AppendFront("return ReturnArray;\n"); sb.Unindent(); sb.AppendFront("}\n"); sb.AppendFront("else return null;\n"); sb.Unindent(); sb.AppendFront("}\n"); sb.AppendFront("public List<object[]> Reserve(int numReturns)\n"); sb.AppendFront("{\n"); sb.Indent(); sb.AppendFront("while(AvailableReturnArrays.Count < numReturns) AvailableReturnArrays.Add(new object[" + matchingPattern.Outputs.Length + "]);\n"); sb.AppendFront("ReturnArrayListForAll.Clear();\n"); sb.AppendFront("for(int i=0; i<numReturns; ++i)\n"); sb.AppendFront("{\n"); sb.Indent(); sb.AppendFront("ReturnArrayListForAll.Add(AvailableReturnArrays[i]);\n"); sb.Unindent(); sb.AppendFront("}\n"); sb.AppendFront("return ReturnArrayListForAll;\n"); sb.Unindent(); sb.AppendFront("}\n"); sb.AppendFront("List<object[]> GRGEN_LIBGR.IAction.ApplyAll(int maxMatches, GRGEN_LIBGR.IActionExecutionEnvironment actionEnv)\n"); sb.AppendFront("{\n"); sb.Indent(); if(matchingPattern.Inputs.Length == 0) { for(int i = 0; i < matchingPattern.Outputs.Length; ++i) { sb.AppendFront("output_list_"); sb.Append(i.ToString()); sb.Append(".Clear();\n"); } sb.AppendFrontFormat("int matchesCount = ApplyAll(maxMatches, actionEnv{0});\n", outClassArgumentsAll); sb.AppendFront("while(AvailableReturnArrays.Count < matchesCount) AvailableReturnArrays.Add(new object[" + matchingPattern.Outputs.Length + "]);\n"); sb.AppendFront("ReturnArrayListForAll.Clear();\n"); sb.AppendFront("for(int i=0; i<matchesCount; ++i)\n"); sb.AppendFront("{\n"); sb.Indent(); sb.AppendFront("ReturnArrayListForAll.Add(AvailableReturnArrays[i]);\n"); for(int i = 0; i < matchingPattern.Outputs.Length; ++i) { sb.AppendFrontFormat("ReturnArrayListForAll[i][{0}] = output_list_{0}[i];\n", i); } sb.Unindent(); sb.AppendFront("}\n"); sb.AppendFront("return ReturnArrayListForAll;\n"); } else sb.AppendFront("throw new Exception();\n"); sb.Unindent(); sb.AppendFront("}\n"); sb.AppendFront("List<object[]> GRGEN_LIBGR.IAction.ApplyAll(int maxMatches, GRGEN_LIBGR.IActionExecutionEnvironment actionEnv, params object[] parameters)\n"); sb.AppendFront("{\n"); sb.Indent(); for(int i = 0; i < matchingPattern.Outputs.Length; ++i) { sb.AppendFront("output_list_"); sb.Append(i.ToString()); sb.Append(".Clear();\n"); } sb.AppendFrontFormat("int matchesCount = ApplyAll(maxMatches, actionEnv{0}{1});\n", inArgumentsFromArray, outClassArgumentsAll); sb.AppendFront("while(AvailableReturnArrays.Count < matchesCount) AvailableReturnArrays.Add(new object[" + matchingPattern.Outputs.Length + "]);\n"); sb.AppendFront("ReturnArrayListForAll.Clear();\n"); sb.AppendFront("for(int i=0; i<matchesCount; ++i)\n"); sb.AppendFront("{\n"); sb.Indent(); sb.AppendFront("ReturnArrayListForAll.Add(AvailableReturnArrays[i]);\n"); for(int i = 0; i < matchingPattern.Outputs.Length; ++i) { sb.AppendFrontFormat("ReturnArrayListForAll[i][{0}] = output_list_{0}[i];\n", i); } sb.Unindent(); sb.AppendFront("}\n"); sb.AppendFront("return ReturnArrayListForAll;\n"); sb.Unindent(); sb.AppendFront("}\n"); sb.AppendFront("bool GRGEN_LIBGR.IAction.ApplyStar(GRGEN_LIBGR.IActionExecutionEnvironment actionEnv)\n"); sb.AppendFront("{\n"); sb.Indent(); if(matchingPattern.Inputs.Length == 0) sb.AppendFront("return ApplyStar(actionEnv);\n"); else sb.AppendFront("throw new Exception(); return false;\n"); sb.Unindent(); sb.AppendFront("}\n"); sb.AppendFront("bool GRGEN_LIBGR.IAction.ApplyStar(GRGEN_LIBGR.IActionExecutionEnvironment actionEnv, params object[] parameters)\n"); sb.AppendFront("{\n"); sb.Indent(); sb.AppendFrontFormat("return ApplyStar(actionEnv{0});\n", inArgumentsFromArray); sb.Unindent(); sb.AppendFront("}\n"); sb.AppendFront("bool GRGEN_LIBGR.IAction.ApplyPlus(GRGEN_LIBGR.IActionExecutionEnvironment actionEnv)\n"); sb.AppendFront("{\n"); sb.Indent(); if(matchingPattern.Inputs.Length == 0) sb.AppendFront("return ApplyPlus(actionEnv);\n"); else sb.AppendFront("throw new Exception(); return false;\n"); sb.Unindent(); sb.AppendFront("}\n"); sb.AppendFront("bool GRGEN_LIBGR.IAction.ApplyPlus(GRGEN_LIBGR.IActionExecutionEnvironment actionEnv, params object[] parameters)\n"); sb.AppendFront("{\n"); sb.Indent(); sb.AppendFrontFormat("return ApplyPlus(actionEnv{0});\n", inArgumentsFromArray); sb.Unindent(); sb.AppendFront("}\n"); sb.AppendFront("bool GRGEN_LIBGR.IAction.ApplyMinMax(GRGEN_LIBGR.IActionExecutionEnvironment actionEnv, int min, int max)\n"); sb.AppendFront("{\n"); sb.Indent(); if(matchingPattern.Inputs.Length == 0) sb.AppendFront("return ApplyMinMax(actionEnv, min, max);\n"); else sb.AppendFront("throw new Exception(); return false;\n"); sb.Unindent(); sb.AppendFront("}\n"); sb.AppendFront("bool GRGEN_LIBGR.IAction.ApplyMinMax(GRGEN_LIBGR.IActionExecutionEnvironment actionEnv, int min, int max, params object[] parameters)\n"); sb.AppendFront("{\n"); sb.Indent(); sb.AppendFrontFormat("return ApplyMinMax(actionEnv, min, max{0});\n", inArgumentsFromArray); sb.Unindent(); sb.AppendFront("}\n"); sb.AppendFront("void GRGEN_LIBGR.IAction.Filter(GRGEN_LIBGR.IActionExecutionEnvironment actionEnv, GRGEN_LIBGR.IMatches matches, GRGEN_LIBGR.FilterCall filter)\n"); sb.AppendFront("{\n"); sb.Indent(); sb.AppendFront("if(filter.IsAutoSupplied) {\n"); sb.Indent(); sb.AppendFront("switch(filter.Name) {\n"); sb.Indent(); sb.AppendFront("case \"keepFirst\": matches.FilterKeepFirst((int)(filter.ArgumentExpressions[0]!=null ? filter.ArgumentExpressions[0].Evaluate((GRGEN_LIBGR.IGraphProcessingEnvironment)actionEnv) : filter.Arguments[0])); break;\n"); sb.AppendFront("case \"keepLast\": matches.FilterKeepLast((int)(filter.ArgumentExpressions[0]!=null ? filter.ArgumentExpressions[0].Evaluate((GRGEN_LIBGR.IGraphProcessingEnvironment)actionEnv) : filter.Arguments[0])); break;\n"); sb.AppendFront("case \"keepFirstFraction\": matches.FilterKeepFirstFraction((double)(filter.ArgumentExpressions[0]!=null ? filter.ArgumentExpressions[0].Evaluate((GRGEN_LIBGR.IGraphProcessingEnvironment)actionEnv) : filter.Arguments[0])); break;\n"); sb.AppendFront("case \"keepLastFraction\": matches.FilterKeepLastFraction((double)(filter.ArgumentExpressions[0]!=null ? filter.ArgumentExpressions[0].Evaluate((GRGEN_LIBGR.IGraphProcessingEnvironment)actionEnv) : filter.Arguments[0])); break;\n"); sb.AppendFront("case \"removeFirst\": matches.FilterRemoveFirst((int)(filter.ArgumentExpressions[0]!=null ? filter.ArgumentExpressions[0].Evaluate((GRGEN_LIBGR.IGraphProcessingEnvironment)actionEnv) : filter.Arguments[0])); break;\n"); sb.AppendFront("case \"removeLast\": matches.FilterRemoveLast((int)(filter.ArgumentExpressions[0]!=null ? filter.ArgumentExpressions[0].Evaluate((GRGEN_LIBGR.IGraphProcessingEnvironment)actionEnv) : filter.Arguments[0])); break;\n"); sb.AppendFront("case \"removeFirstFraction\": matches.FilterRemoveFirstFraction((double)(filter.ArgumentExpressions[0]!=null ? filter.ArgumentExpressions[0].Evaluate((GRGEN_LIBGR.IGraphProcessingEnvironment)actionEnv) : filter.Arguments[0])); break;\n"); sb.AppendFront("case \"removeLastFraction\": matches.FilterRemoveLastFraction((double)(filter.ArgumentExpressions[0]!=null ? filter.ArgumentExpressions[0].Evaluate((GRGEN_LIBGR.IGraphProcessingEnvironment)actionEnv) : filter.Arguments[0])); break;\n"); sb.AppendFront("default: throw new Exception(\"Unknown auto supplied filter name!\");\n"); sb.Unindent(); sb.AppendFront("}\n"); sb.AppendFront("return;\n"); sb.Unindent(); sb.AppendFront("}\n"); sb.AppendFront("switch(filter.FullName) {\n"); sb.Indent(); foreach(IFilter filter in matchingPattern.Filters) { if(filter is IFilterAutoGenerated) { if(((IFilterAutoGenerated)filter).Entity != null) { sb.AppendFrontFormat("case \"{1}<{2}>\": GRGEN_ACTIONS.{4}MatchFilters.Filter_{0}_{1}_{2}((GRGEN_LGSP.LGSPGraphProcessingEnvironment)actionEnv, ({3})matches); break;\n", patternName, filter.Name, ((IFilterAutoGenerated)filter).Entity, matchesType, TypesHelper.GetPackagePrefixDot(filter.Package)); if(filter.Package != null) sb.AppendFrontFormat("case \"{5}{1}<{2}>\": GRGEN_ACTIONS.{4}MatchFilters.Filter_{0}_{1}_{2}((GRGEN_LGSP.LGSPGraphProcessingEnvironment)actionEnv, ({3})matches); break;\n", patternName, filter.Name, ((IFilterAutoGenerated)filter).Entity, matchesType, filter.Package + ".", filter.Package + "::"); } else // auto { sb.AppendFrontFormat("case \"{1}\": GRGEN_ACTIONS.{3}MatchFilters.Filter_{0}_{1}((GRGEN_LGSP.LGSPGraphProcessingEnvironment)actionEnv, ({2})matches); break;\n", patternName, filter.Name, matchesType, TypesHelper.GetPackagePrefixDot(filter.Package)); if(filter.Package != null) sb.AppendFrontFormat("case \"{4}{1}\": GRGEN_ACTIONS.{3}MatchFilters.Filter_{0}_{1}((GRGEN_LGSP.LGSPGraphProcessingEnvironment)actionEnv, ({2})matches); break;\n", patternName, filter.Name, matchesType, filter.Package + ".", filter.Package + "::"); } } else { IFilterFunction filterFunction = (IFilterFunction)filter; sb.AppendFrontFormat("case \"{0}\": GRGEN_ACTIONS.{1}MatchFilters.Filter_{2}((GRGEN_LGSP.LGSPGraphProcessingEnvironment)actionEnv, ({3})matches", filterFunction.Name, TypesHelper.GetPackagePrefixDot(filterFunction.Package), filterFunction.Name, matchesType); for(int i=0; i<filterFunction.Inputs.Length; ++i) { sb.AppendFormat(", ({0})(filter.ArgumentExpressions[{1}]!=null ? filter.ArgumentExpressions[{1}].Evaluate((GRGEN_LIBGR.IGraphProcessingEnvironment)actionEnv) : filter.Arguments[{1}])", TypesHelper.TypeName(filterFunction.Inputs[i]), i); } sb.Append("); break;\n"); if(filter.Package != null) { sb.AppendFrontFormat("case \"{4}{0}\": GRGEN_ACTIONS.{1}MatchFilters.Filter_{2}((GRGEN_LGSP.LGSPGraphProcessingEnvironment)actionEnv, ({3})matches", filterFunction.Name, TypesHelper.GetPackagePrefixDot(filterFunction.Package), filterFunction.Name, matchesType, filter.Package + "::"); for(int i = 0; i < filterFunction.Inputs.Length; ++i) { sb.AppendFormat(", ({0})(filter.ArgumentExpressions[{1}]!=null ? filter.ArgumentExpressions[{1}].Evaluate((GRGEN_LIBGR.IGraphProcessingEnvironment)actionEnv) : filter.Arguments[{1}])", TypesHelper.TypeName(filterFunction.Inputs[i]), i); } sb.Append("); break;\n"); } } } sb.AppendFront("default: throw new Exception(\"Unknown filter name!\");\n"); sb.Unindent(); sb.AppendFront("}\n"); sb.Unindent(); sb.AppendFront("}\n"); }
public override void Emit(SourceBuilder sourceCode) { if(sourceCode.CommentSourceCode) sourceCode.AppendFront("// Check whether a duplicate match to be purged was found or will be found\n"); // emit hash variable declaration sourceCode.AppendFrontFormat("int {0} = 0;\n", NamesOfEntities.DuplicateMatchHashVariable()); // only do the rest if more than one match is requested sourceCode.AppendFront("if(maxMatches!=1) {\n"); sourceCode.Indent(); // emit found matches hash map initialization as needed sourceCode.AppendFrontFormat("if({0}==null) {0} = new Dictionary<int, {1}>();\n", NamesOfEntities.FoundMatchesForFilteringVariable(), RulePatternClassName + "." + NamesOfEntities.MatchClassName(PatternName)); // emit hash variable initialization with result of hash computation sourceCode.AppendFrontFormat("{0} = unchecked(", NamesOfEntities.DuplicateMatchHashVariable()); EmitHashComputation(sourceCode, NeededElements.Length - 1); sourceCode.Append(");\n"); // emit check whether hash is contained in found matches hash map sourceCode.AppendFrontFormat("if({0}.ContainsKey({1}))\n", NamesOfEntities.FoundMatchesForFilteringVariable(), NamesOfEntities.DuplicateMatchHashVariable()); sourceCode.AppendFront("{\n"); sourceCode.Indent(); // emit check whether one of the matches in the hash map with same hash is equal to the locally matched elements sourceCode.AppendFrontFormat("{0} {1} = {2}[{3}];\n", RulePatternClassName + "." + NamesOfEntities.MatchClassName(PatternName), NamesOfEntities.DuplicateMatchCandidateVariable(), NamesOfEntities.FoundMatchesForFilteringVariable(), NamesOfEntities.DuplicateMatchHashVariable()); sourceCode.AppendFront("do {\n"); sourceCode.Indent(); // emit check for same elements sourceCode.AppendFront("if("); for(int i = 0; i < NeededElements.Length; ++i) { if(i != 0) sourceCode.Append(" && "); sourceCode.AppendFormat("{0}._{1} == {2}", NamesOfEntities.DuplicateMatchCandidateVariable() + MatchObjectPaths[i], NamesOfEntities.MatchName(NeededElementsUnprefixedName[i], NeededElementsIsNode[i] ? BuildMatchObjectType.Node : BuildMatchObjectType.Edge), NamesOfEntities.CandidateVariable(NeededElements[i])); } sourceCode.Append(")\n"); // emit check failed code, i.e. the current local match is equivalent to one of the already found ones, a duplicate sourceCode.AppendFront("{\n"); sourceCode.Indent(); CheckFailedOperations.Emit(sourceCode); sourceCode.Unindent(); sourceCode.AppendFront("}\n"); // close "emit check whether one of the matches in the hash map with same hash is equal to the locally matched elements" // switching to next match with the same hash, if available sourceCode.Unindent(); sourceCode.AppendFront("} "); sourceCode.AppendFormat("while(({0} = {0}.nextWithSameHash) != null);\n", NamesOfEntities.DuplicateMatchCandidateVariable()); // close "emit check whether hash is contained in found matches hash map" sourceCode.Unindent(); sourceCode.AppendFront("}\n"); // close "only do the rest if more than one match is requested" sourceCode.Unindent(); sourceCode.AppendFront("}\n"); }
public override void Emit(SourceBuilder sourceCode) { sourceCode.AppendFormat("GRGEN_MODEL.Comparer_{0}_{1}.IndexOfOrderedBy(", OwnerType, Member); Target.Emit(sourceCode); sourceCode.Append(", "); Value.Emit(sourceCode); sourceCode.Append(")"); }
public override void Dump(SourceBuilder builder) { Debug.Assert(CheckFailedOperations == null, "check independent without direct check failed code"); // first dump local content builder.AppendFront("CheckPartialMatch ByIndependent with "); foreach (string neededElement in NeededElements) { builder.AppendFormat("{0} ", neededElement); } builder.Append("\n"); // then nested content if (NestedOperationsList != null) { builder.Indent(); NestedOperationsList.Dump(builder); builder.Unindent(); } }
public override void Emit(SourceBuilder sourceCode) { // open decision whether to fail sourceCode.AppendFront("if("); // fail if graph element contained within candidate was already matched // (to another pattern element) // as this would cause a homomorphic match string variableContainingCandidate = NamesOfEntities.CandidateVariable(PatternElementName); if (Parallel) { if (!NeverAboveMaxIsoSpace) { sourceCode.Append("(isoSpace < (int) GRGEN_LGSP.LGSPElemFlagsParallel.MAX_ISO_SPACE ? "); } string isMatchedBit = "(uint)GRGEN_LGSP.LGSPElemFlagsParallel.IS_MATCHED << isoSpace"; if (LockForAllThreads) { sourceCode.AppendFormat("( flagsPerElement0[{0}.uniqueId] & {1} ) != 0", variableContainingCandidate, isMatchedBit); } else { sourceCode.AppendFormat("( flagsPerElement[{0}.uniqueId] & {1} ) != 0", variableContainingCandidate, isMatchedBit); } if (!NeverAboveMaxIsoSpace) { sourceCode.Append(" : "); sourceCode.AppendFormat("graph.perThreadInIsoSpaceMatchedElements[{0}][isoSpace - (int)" + "GRGEN_LGSP.LGSPElemFlagsParallel.MAX_ISO_SPACE]" + ".ContainsKey({1}))", LockForAllThreads ? "0" : "threadId", variableContainingCandidate); } } else { if (!NeverAboveMaxIsoSpace) { sourceCode.Append("(isoSpace < (int) GRGEN_LGSP.LGSPElemFlags.MAX_ISO_SPACE ? "); } string isMatchedBit = "(uint)GRGEN_LGSP.LGSPElemFlags.IS_MATCHED << isoSpace"; sourceCode.AppendFormat("({0}.lgspFlags & {1}) != 0", variableContainingCandidate, isMatchedBit); if (!NeverAboveMaxIsoSpace) { sourceCode.Append(" : "); sourceCode.AppendFormat("graph.inIsoSpaceMatchedElements[isoSpace - (int)" + "GRGEN_LGSP.LGSPElemFlags.MAX_ISO_SPACE]" + ".ContainsKey({0}))", variableContainingCandidate); } } // but only if isomorphy is demanded (NamesOfPatternElementsToCheckAgainst empty) // otherwise homomorphy to certain elements is allowed, // so we only fail if the graph element is matched to one of the not allowed elements, // given in NamesOfPatternElementsToCheckAgainst if (NamesOfPatternElementsToCheckAgainst != null) { Debug.Assert(NamesOfPatternElementsToCheckAgainst.Count > 0); sourceCode.Append("\n"); sourceCode.Indent(); if (NamesOfPatternElementsToCheckAgainst.Count == 1) { string name = NamesOfPatternElementsToCheckAgainst[0]; sourceCode.AppendFrontFormat("&& {0}=={1}\n", variableContainingCandidate, NamesOfEntities.CandidateVariable(name)); } else { bool first = true; foreach (string name in NamesOfPatternElementsToCheckAgainst) { if (first) { sourceCode.AppendFrontFormat("&& ({0}=={1}\n", variableContainingCandidate, NamesOfEntities.CandidateVariable(name)); sourceCode.Indent(); first = false; } else { sourceCode.AppendFrontFormat("|| {0}=={1}\n", variableContainingCandidate, NamesOfEntities.CandidateVariable(name)); } } sourceCode.AppendFront(")\n"); sourceCode.Unindent(); } // close decision sourceCode.AppendFront(")\n"); sourceCode.Unindent(); } else { // close decision sourceCode.Append(")\n"); } // emit check failed code sourceCode.AppendFront("{\n"); sourceCode.Indent(); CheckFailedOperations.Emit(sourceCode); sourceCode.Unindent(); sourceCode.AppendFront("}\n"); }
public override void Emit(SourceBuilder sourceCode) { sourceCode.AppendFormat("GRGEN_MODEL.Comparer_{0}_{1}.LastIndexOfBy(", OwnerType, Member); Target.Emit(sourceCode); sourceCode.Append(", "); Value.Emit(sourceCode); if(StartIndex != null) { sourceCode.Append(", "); StartIndex.Emit(sourceCode); } sourceCode.Append(")"); }
public override void Emit(SourceBuilder sourceCode) { // open decision whether to fail sourceCode.AppendFront("if("); // fail if graph element contained within candidate was already matched // (in another subpattern to another pattern element) // as this would cause a inter-pattern-homomorphic match string variableContainingCandidate = NamesOfEntities.CandidateVariable(PatternElementName); if (Parallel) { if (!NeverAboveMaxIsoSpace) { sourceCode.Append("(isoSpace < (int) GRGEN_LGSP.LGSPElemFlagsParallel.MAX_ISO_SPACE ? "); } string isMatchedBit = "(uint)GRGEN_LGSP.LGSPElemFlagsParallel.IS_MATCHED_BY_ENCLOSING_PATTERN << isoSpace"; sourceCode.AppendFormat("( flagsPerElementGlobal[{0}.uniqueId] & {1} ) == {1}", variableContainingCandidate, isMatchedBit); if (!NeverAboveMaxIsoSpace) { sourceCode.Append(" : "); sourceCode.AppendFormat("graph.perThreadInIsoSpaceMatchedElementsGlobal[threadId][isoSpace - (int)" + "GRGEN_LGSP.LGSPElemFlagsParallel.MAX_ISO_SPACE]" + ".ContainsKey({0}))", variableContainingCandidate); } } else { if (!NeverAboveMaxIsoSpace) { sourceCode.Append("(isoSpace < (int) GRGEN_LGSP.LGSPElemFlags.MAX_ISO_SPACE ? "); } string isMatchedBit = "(uint)GRGEN_LGSP.LGSPElemFlags.IS_MATCHED_BY_ENCLOSING_PATTERN << isoSpace"; sourceCode.AppendFormat("({0}.lgspFlags & {1})=={1}", variableContainingCandidate, isMatchedBit); if (!NeverAboveMaxIsoSpace) { sourceCode.Append(" : "); sourceCode.AppendFormat("graph.inIsoSpaceMatchedElementsGlobal[isoSpace - (int)" + "GRGEN_LGSP.LGSPElemFlags.MAX_ISO_SPACE]" + ".ContainsKey({0}))", variableContainingCandidate); } } if (GloballyHomomorphElements != null) { // don't fail if candidate was globally matched by an element // it is allowed to be globally homomorph to // (element from alternative case declared to be non-isomorph to element from enclosing pattern) foreach (string name in GloballyHomomorphElements) { sourceCode.AppendFormat(" && {0}!={1}", variableContainingCandidate, NamesOfEntities.CandidateVariable(name)); } } sourceCode.Append(")\n"); // emit check failed code sourceCode.AppendFront("{\n"); sourceCode.Indent(); CheckFailedOperations.Emit(sourceCode); sourceCode.Unindent(); sourceCode.AppendFront("}\n"); }
public override void Emit(SourceBuilder sourceCode) { sourceCode.AppendFormat("GRGEN_MODEL.Comparer_{0}_{1}.ArrayOrderAscendingBy(", OwnerType, Member); Target.Emit(sourceCode); sourceCode.Append(")"); }
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"); } } }