public void Decomposite(out bool isFinished) { isFinished = true; List <object> newString = new List <object>(); ForwardEnumerator it = new ForwardEnumerator(this.currentString, 0); while (it.MoveNext()) { object m = it.Current; if (m is CutModule) { // Apply cutting rule - goto end of current branch. it.FindEndOfBranch(typeof(StartBranchModule), typeof(EndBranchModule)); // Current module should be end of branch. m = it.Current; } if (this.decRules.ContainsKey(m.GetType())) { foreach (var d in this.decRules[m.GetType()]) { object result = d.MethodInfo.Invoke(this.systemDefinition, new object[] { m }); if (result is EmptyModule) { // Do nothing, Strict is removed from new string. goto endOfDecomposition; } else if (result != null) { // Have some replacement. List <object> newModules = result.ObjectAsList(); newString.InsertRange(newString.Count, newModules); // Check if we are still not finished. if (isFinished && CanBeDecomposed(newModules)) { isFinished = false; } goto endOfDecomposition; } } } // No decomposition were done. newString.Add(m); endOfDecomposition :; } this.String = newString; }
public bool TryLeftToRight( List <object> currentString, int currentIndex, List <object> newLeftString, object systemDefinition, ref object result, ref int numReplacedModules) { List <object> parameters = new List <object>(); // Check left predecessors. if (!this.IsLeftMatch(new BackwardEnumerator(newLeftString, newLeftString.Count - 1), this.NewLeft.GetEnumerator(), parameters)) { return(false); } if (!this.IsLeftMatch(new BackwardEnumerator(currentString, currentIndex - 1), this.Left.GetEnumerator(), parameters)) { return(false); } // Reverse parameters list, because it is in reverse order. parameters.Reverse(); // Check strict predecessor. var it = new ForwardEnumerator(currentString, currentIndex); if (!this.IsSimpleMatch(it, this.Strict.GetEnumerator(), parameters)) { return(false); } // Memorize length of strict part. numReplacedModules = it.NumMoves; // Check right predecessor. if (!this.IsRightMatch(it, this.Right.GetEnumerator(), parameters)) { return(false); } // Invoke rule. result = this.Method.Invoke(systemDefinition, parameters.ToArray()); return(result != null); }