Пример #1
0
        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);
                            }
                        }
                    }
                }
            }
        }