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); } } } } } }
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)); }
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); }
public bool TryRun(SequenceHandler <TValue> values, int startIndex, OCaptureTable <TValue> table, out Range range) { throw new NotImplementedException(); }