private void ManageSubCaptures(OCaptureTable <TValue> table, SequenceHandler <TValue> handler, FixedSizeStack <FSAState> states, FixedSizeStack <int> piStack) { var stack = _captureStack; stack.Clear(); for (int i = 0; i < piStack.Count; i++) { var s = states[i]; int id = piStack[i] - 1; if (id >= 0) { var cond = _transitionMatrix[s.StateId][id].Condition; if (cond.IsSystemPredicate) { var sys = (SystemPredicateEdge <TValue>)cond; if (sys.IsCapture) { var right = new CaptureEdge { Index = s.CurrentIndex, CaptureId = sys.CaptureId }; if (stack.Count > 0 && stack.Peek().CaptureId == right.CaptureId) { var left = stack.Pop(); table.Add( left.CaptureId, new OCapture <TValue>(handler, new Range(left.Index, right.Index - left.Index))); } else { stack.Push(right); } } } } } }