Пример #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);
                            }
                        }
                    }
                }
            }
        }
Пример #2
0
 public bool TryRun(SequenceHandler <TValue> values, int startIndex, OCaptureTable <TValue> table, out Range range)
 {
     return(FastFsa.TryRun(values, startIndex, null, out range) && CmdFsa.TryRun(values, startIndex, table, out range));
 }
Пример #3
0
        public bool TryRun(SequenceHandler <TValue> values, int startIndex, OCaptureTable <TValue> table, out Range range)
        {
            range = default(Range);
            var piStack = _piStack;

            piStack.Clear();
            var stack = _instanceStack;

            stack.Clear();
            bool     hasSubCaptures = false;
            FSAState state          = CreateState(_startState, startIndex);

            stack.Push(state);
            var pi = 0;

            piStack.Push(pi);
            while (stack.Count > 0)
            {
                state = stack.Peek();
                pi    = piStack.Peek();

                bool retrieved   = false;
                var  transitions = _transitionMatrix[state.StateId];
                if (transitions != null &&
                    transitions.Length > 0)
                {
                    for (int i = pi; i < transitions.Length; i++)
                    {
                        var trans = transitions[i];
                        piStack.Push(piStack.Pop() + 1);

                        var isMatch = trans.Condition.IsMatch(values, state.CurrentIndex);
                        if (isMatch)
                        {
                            var isEps = PredicateEdgeBase <TValue> .IsEpsilon(trans.Condition);

                            hasSubCaptures |= trans.Condition.IsSystemPredicate && ((SystemPredicateEdge <TValue>)trans.Condition).IsCapture;
                            stack.Push(CreateState(trans.EndState, state.CurrentIndex + (isEps ? 0 : 1)));
                            piStack.Push(0);
                            retrieved = true;
                            break;
                        }
                    }
                }

                if (!retrieved)
                {
                    if (_finalsLookup[state.StateId])
                    {
                        break;
                    }
                    stack.Pop();
                    piStack.Pop();
                }
            }

            if (stack.Count != 0 && _finalsLookup[state.StateId])
            {
                if (hasSubCaptures && table != null)
                {
                    ManageSubCaptures(table, values, stack, piStack);
                }
                range = new Range(startIndex, state.CurrentIndex - startIndex);
                return(true);
            }
            return(false);
        }
Пример #4
0
 public bool TryRun(SequenceHandler <TValue> values, int startIndex, OCaptureTable <TValue> table, out Range range)
 {
     throw new NotImplementedException();
 }