Exemple #1
0
    // 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;
 }
Exemple #3
0
 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;
 }
Exemple #7
0
    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));
    }
Exemple #8
0
 public State(int number, ISequenceCheckpoint cp)
 {
     Items      = new List <Item>();
     Number     = number;
     Checkpoint = cp;
 }