public override void Emit(SourceBuilder sourceCode) { string targetPatternElement = Type == EntityType.Variable ? NamesOfEntities.Variable(TargetPatternElementName) : NamesOfEntities.CandidateVariable(TargetPatternElementName); if (SourcePatternElementUnprefixedName != null) { string sourcePatternElement = NamesOfEntities.MatchName(SourcePatternElementUnprefixedName, Type); sourceCode.AppendFrontFormat("{0} = {1}._{2}; // bubble up (from match)\n", targetPatternElement, NestedMatchOrTaskObjectName, sourcePatternElement); } else { sourceCode.AppendFrontFormat("{0} = {1}.{0}; // bubble up (from task)\n", targetPatternElement, NestedMatchOrTaskObjectName); } }
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) { string matchName = NamesOfEntities.MatchName(PatternElementUnprefixedName, Type); if (Type == BuildMatchObjectType.Node || Type == BuildMatchObjectType.Edge) { string variableContainingCandidate = NamesOfEntities.CandidateVariable(PatternElementName); sourceCode.AppendFrontFormat("{0}._{1} = {2};\n", MatchObjectName, matchName, variableContainingCandidate); } else if (Type == BuildMatchObjectType.Variable) { string variableName = NamesOfEntities.Variable(PatternElementName); sourceCode.AppendFrontFormat("{0}._{1} = {2};\n", MatchObjectName, matchName, variableName); } else if (Type == BuildMatchObjectType.Subpattern) { sourceCode.AppendFrontFormat("{0}._{1} = (@{2})currentFoundPartialMatch.Pop();\n", MatchObjectName, matchName, PatternElementType); sourceCode.AppendFrontFormat("{0}._{1}._matchOfEnclosingPattern = {0};\n", MatchObjectName, matchName); } else if (Type == BuildMatchObjectType.InlinedSubpattern) { sourceCode.AppendFrontFormat("{0}._{1} = match_{2};\n", MatchObjectName, matchName, PatternElementName); } else if (Type == BuildMatchObjectType.Iteration) { sourceCode.AppendFrontFormat("{0}._{1} = new GRGEN_LGSP.LGSPMatchesList<{2}.{3}, {2}.{4}>(null);\n", MatchObjectName, matchName, RulePatternClassName, NamesOfEntities.MatchClassName(PatternElementType), NamesOfEntities.MatchInterfaceName(PatternElementType)); sourceCode.AppendFrontFormat("while(currentFoundPartialMatch.Count>0 && currentFoundPartialMatch.Peek() is {0}.{1}) ", RulePatternClassName, NamesOfEntities.MatchInterfaceName(PatternElementType)); sourceCode.Append("{\n"); sourceCode.Indent(); sourceCode.AppendFrontFormat("{0}.{1} cfpm = ({0}.{1})currentFoundPartialMatch.Pop();\n", RulePatternClassName, NamesOfEntities.MatchClassName(PatternElementType)); sourceCode.AppendFront("if(cfpm.IsNullMatch) break;\n"); sourceCode.AppendFrontFormat("cfpm.SetMatchOfEnclosingPattern({0});\n", MatchObjectName); sourceCode.AppendFrontFormat("{0}._{1}.Add(cfpm);\n", MatchObjectName, matchName); sourceCode.Unindent(); sourceCode.AppendFront("}\n"); } else if (Type == BuildMatchObjectType.Alternative) { sourceCode.AppendFrontFormat("{0}._{1} = ({2}.{3})currentFoundPartialMatch.Pop();\n", MatchObjectName, matchName, RulePatternClassName, NamesOfEntities.MatchInterfaceName(PatternElementType)); sourceCode.AppendFrontFormat("{0}._{1}.SetMatchOfEnclosingPattern({0});\n", MatchObjectName, matchName); } else //if(Type == BuildMatchObjectType.Independent) { sourceCode.AppendFrontFormat("{0}._{1} = {2};\n", MatchObjectName, matchName, NamesOfEntities.MatchedIndependentVariable(PatternElementName)); sourceCode.AppendFrontFormat("{0} = new {1}({0});\n", NamesOfEntities.MatchedIndependentVariable(PatternElementName), RulePatternClassName + "." + NamesOfEntities.MatchClassName(MatchClassName)); sourceCode.AppendFrontFormat("{0}._{1}.SetMatchOfEnclosingPattern({0});\n", MatchObjectName, matchName); } }