private static IEnumerable <RuleMatch> GetMatches( IRule rule, ExplorerContext context) { var leftMatches = context.InvokeRule(rule); foreach (var m in leftMatches) { var newContext = context.MoveForward(m); var interleaveLength = newContext.MatchInterleave(); var fullMatch = m.AddInterleaveLength(interleaveLength); yield return(fullMatch); } }
private int MatchInterleave(ExplorerContext interleaveContext) { if (_interleaveRule == null) { return(0); } else { var interleaveMatch = _interleaveRule.Match(interleaveContext).FirstOrDefault(); if (interleaveMatch == null || interleaveMatch.Text.Length == 0) { return(0); } else { var newInterleaveContext = interleaveContext.MoveForward(interleaveMatch); // Recursion var remainingLength = MatchInterleave(newInterleaveContext); return(interleaveMatch.Text.Length + remainingLength); } } }