/// <summary> /// move outwards from check succeeded operation until check partial match by independent is found /// appending restore isomorphy for isomorphy written on the way /// and final jump to operation right after the independent failed operation of the check partial match by independent /// </summary> private static void MoveRightAfterCorrespondingIndependentFailedAppendingRemoveIsomorphyAndJump( CheckContinueMatchingOfIndependentSucceeded checkSucceeded, CheckPartialMatchByIndependent enclosingIndependent, SearchProgram topLevelSearchProgram) { // insertion point for candidate failed operations SearchProgramOperation insertionPoint = checkSucceeded.CheckFailedOperations; while (insertionPoint.Next != null) // needed? { insertionPoint = insertionPoint.Next; } // move outwards, append remove isomorphy string[] neededElements = new string[0]; SearchProgramOperation continuationPoint = MoveOutwardsAppendingRemoveIsomorphy( checkSucceeded, ref insertionPoint, neededElements, enclosingIndependent, topLevelSearchProgram); // move to check failed operation of check independent operation while (!(continuationPoint is CheckContinueMatchingOfIndependentFailed)) { continuationPoint = continuationPoint.Next; } CheckContinueMatchingOfIndependentFailed checkFailed = (CheckContinueMatchingOfIndependentFailed)continuationPoint; // insert label right thereafter, append jump there at insertion point GotoLabel gotoLabel = new GotoLabel(); checkFailed.Insert(gotoLabel); ContinueOperation continueByGoto = new ContinueOperation( ContinueOperationType.ByGoto, gotoLabel.LabelName); insertionPoint.Append(continueByGoto); }
/// <summary> /// Search program operations implementing the /// Independent search plan operation (searching of positive application condition) /// are created and inserted into search program /// </summary> private SearchProgramOperation buildIndependent( SearchProgramOperation insertionPoint, int currentOperationIndex, PatternGraph independentPatternGraph) { // fill needed elements array for CheckPartialMatchByIndependent string[] neededElements = ComputeNeededElements(independentPatternGraph); CheckPartialMatchByIndependent checkIndependent = new CheckPartialMatchByIndependent(neededElements); SearchProgramOperation continuationPoint = insertionPoint.Append(checkIndependent); checkIndependent.NestedOperationsList = new SearchProgramList(checkIndependent); insertionPoint = checkIndependent.NestedOperationsList; bool enclosingIsNegative = isNegative; isNegative = false; PatternGraph enclosingPatternGraph = patternGraphWithNestingPatterns.Peek(); patternGraphWithNestingPatterns.Push(independentPatternGraph); isoSpaceNeverAboveMaxIsoSpace = patternGraphWithNestingPatterns.Peek().maxIsoSpace < (int)LGSPElemFlags.MAX_ISO_SPACE; bool parallelizedBak = parallelized; parallelized &= patternGraphWithNestingPatterns.Peek().parallelizedSchedule != null; // the idpt within a parallelized head may be non-parallelized int indexOfScheduleBak = indexOfSchedule; if(parallelized) indexOfSchedule = 0; // the idpt of a parallelized body at index 1 is still only at index 0 string independentNamePrefix = NegativeIndependentNamePrefix(patternGraphWithNestingPatterns.Peek()); bool independentContainsSubpatterns = independentPatternGraph.embeddedGraphsPlusInlined.Length >= 1 || independentPatternGraph.alternativesPlusInlined.Length >= 1 || independentPatternGraph.iteratedsPlusInlined.Length >= 1; InitializeNegativeIndependentMatching initIdpt = new InitializeNegativeIndependentMatching( independentContainsSubpatterns, independentNamePrefix, isoSpaceNeverAboveMaxIsoSpace, parallelized); insertionPoint = insertionPoint.Append(initIdpt); insertionPoint = insertVariableDeclarationsNegIdpt(insertionPoint, independentPatternGraph); //--------------------------------------------------------------------------- // build independent pattern insertionPoint = BuildScheduledSearchPlanOperationIntoSearchProgram( 0, insertionPoint); //--------------------------------------------------------------------------- FinalizeNegativeIndependentMatching finalize = new FinalizeNegativeIndependentMatching( isoSpaceNeverAboveMaxIsoSpace, parallelized); insertionPoint = insertionPoint.Append(finalize); // independent pattern built by now // continue at the end of the list handed in insertionPoint = continuationPoint; // the matcher program of independent didn't find a match, // we fell through the loops and reached this point -> abort the matching process / try next candidate CheckContinueMatchingOfIndependentFailed abortMatching = new CheckContinueMatchingOfIndependentFailed(checkIndependent, independentPatternGraph.isIterationBreaking); checkIndependent.CheckIndependentFailed = abortMatching; insertionPoint = insertionPoint.Append(abortMatching); patternGraphWithNestingPatterns.Pop(); parallelized = parallelizedBak; indexOfSchedule = indexOfScheduleBak; isNegative = enclosingIsNegative; //--------------------------------------------------------------------------- // build next operation insertionPoint = BuildScheduledSearchPlanOperationIntoSearchProgram( currentOperationIndex + 1, insertionPoint); //--------------------------------------------------------------------------- return insertionPoint; }
/// <summary> /// move outwards from check succeeded operation until check partial match by independent is found /// appending restore isomorphy for isomorphy written on the way /// and final jump to operation right after the independent failed operation of the check partial match by independent /// </summary> private void MoveRightAfterCorrespondingIndependentFailedAppendingRemoveIsomorphyAndJump( CheckContinueMatchingOfIndependentSucceeded checkSucceeded, CheckPartialMatchByIndependent enclosingIndependent, SearchProgram topLevelSearchProgram) { // insertion point for candidate failed operations SearchProgramOperation insertionPoint = checkSucceeded.CheckFailedOperations; while (insertionPoint.Next != null) // needed? { insertionPoint = insertionPoint.Next; } // move outwards, append remove isomorphy string[] neededElements = new string[0]; SearchProgramOperation continuationPoint = MoveOutwardsAppendingRemoveIsomorphy( checkSucceeded, ref insertionPoint, neededElements, enclosingIndependent, topLevelSearchProgram); // move to check failed operation of check independent operation while (!(continuationPoint is CheckContinueMatchingOfIndependentFailed)) { continuationPoint = continuationPoint.Next; } CheckContinueMatchingOfIndependentFailed checkFailed = (CheckContinueMatchingOfIndependentFailed)continuationPoint; // insert label right thereafter, append jump there at insertion point GotoLabel gotoLabel = new GotoLabel(); checkFailed.Insert(gotoLabel); ContinueOperation continueByGoto = new ContinueOperation( ContinueOperationType.ByGoto, gotoLabel.LabelName); insertionPoint.Append(continueByGoto); }
public CheckContinueMatchingOfIndependentFailed(CheckPartialMatchByIndependent checkIndependent, bool isIterationBreaking) { CheckIndependent = checkIndependent; IsIterationBreaking = isIterationBreaking; }