// Get the future State i which is ahead of current State n. If the State i does not // exist, create it. Otherwise return it as-is. public State GetAhead(int consumed, ISequenceCheckpoint checkpoint) { if (consumed <= 0) { return(_current.State); } var i = _current.State.Number + consumed; if (_lookup.ContainsKey(i)) { return(_lookup[i].State); } var state = new State(i, checkpoint); var current = _current; Debug.Assert(i > current.State.Number, "We shouldn't be going backwards"); while (current.Next != null && current.Next.State.Number < i) { current = current.Next; } var newNode = new StateNode(state) { State = state, Next = current.Next }; current.Next = newNode; _lookup.Add(i, newNode); return(state); }
public SuccessResultAlternative(TOutput value, int consumed, ISequenceCheckpoint continuation) { Assert.ArgumentNotNull(continuation, nameof(continuation)); Value = value; Consumed = consumed; Continuation = continuation; }
public StateCollection(ISequenceCheckpoint cp) { InitialState = new State(0, cp); _current = new StateNode(InitialState); _lookup = new Dictionary <int, StateNode> { { 0, _current } }; }
public MultiResult(IParser parser, Location location, ISequenceCheckpoint startCheckpoint, IEnumerable <IResultAlternative <TOutput> > results, IReadOnlyList <object>?data = null) { Parser = parser; Results = results.ToList(); Success = Results.Any(r => r.Success); Location = location; StartCheckpoint = startCheckpoint; _data = data; }
public static IResultAlternative <TOutput> FactoryMethod(TOutput value, int consumed, ISequenceCheckpoint continuation) => new SuccessResultAlternative <TOutput>(value, consumed, continuation);
public FailureResultAlternative(string errorMessage, ISequenceCheckpoint continuation) { ErrorMessage = errorMessage; Continuation = continuation; }
private static IResultAlternative <TOutput> ParseOne(IParser <TInput, TOutput> parser, IParseState <TInput> state, ISequenceCheckpoint startCheckpoint) { var result = parser.Parse(state); if (result.Success) { var endCheckpoint = state.Input.Checkpoint(); return(new SuccessResultAlternative <TOutput>(result.Value, result.Consumed, endCheckpoint)); } return(new FailureResultAlternative <TOutput>(result.ErrorMessage, startCheckpoint)); }
public State(int number, ISequenceCheckpoint cp) { Items = new List <Item>(); Number = number; Checkpoint = cp; }