private static void Consume(string expected, ref ParseState <char> state) { var oldCol = state.ComputeSourcePos().Col; AssertEqual(expected.AsSpan(), state.LookAhead(expected.Length)); state.Advance(expected.Length); Assert.Equal(oldCol + expected.Length, state.ComputeSourcePos().Col); }
private static void Consume(char expected, ref ParseState <char> state) { var oldCol = state.ComputeSourcePos().Col; Assert.True(state.HasCurrent); Assert.Equal(expected, state.Current); state.Advance(); Assert.Equal(oldCol + 1, state.ComputeSourcePos().Col); }
private static void UnalignedChunkTest(int inputLength) { var input = ("fa" + new string('o', inputLength - 2)).AsSpan(); var state = new ParseState <char>((_, x) => x.IncrementCol(), new SpanTokenStream <char>(ref input)); Consume('f', ref state); state.PushBookmark(); Consume('a' + new string('o', inputLength - 2), ref state); Assert.False(state.HasCurrent); Assert.Equal(new SourcePos(1, inputLength + 1), state.ComputeSourcePos()); state.Rewind(); Assert.Equal(new SourcePos(1, 2), state.ComputeSourcePos()); Consume('a', ref state); }
private static void AlignedChunkTest(int inputLength) { var input = ('f' + new string('o', inputLength - 1)); var state = new ParseState <char>((_, x) => x.IncrementCol(), ToStream(input)); state.PushBookmark(); Consume('f', ref state); Consume(new string('o', inputLength - 1), ref state); Assert.False(state.HasCurrent); Assert.Equal(new SourcePos(1, inputLength + 1), state.ComputeSourcePos()); state.Rewind(); Assert.Equal(new SourcePos(1, 1), state.ComputeSourcePos()); Consume('f', ref state); }
public void TestEmptyInput() { var input = "".AsSpan(); var state = new ParseState <char>((_, x) => x.IncrementCol(), new SpanTokenStream <char>(ref input)); Assert.Equal(new SourcePos(1, 1), state.ComputeSourcePos()); Assert.False(state.HasCurrent); }
public void TestDiscardChunk() { var input = ('f' + new string('o', ChunkSize)).AsSpan(); // Length == ChunkSize + 1 var state = new ParseState <char>((_, x) => x.IncrementCol(), new SpanTokenStream <char>(ref input)); Consume('f', ref state); Consume(new string('o', ChunkSize), ref state); Assert.False(state.HasCurrent); Assert.Equal(new SourcePos(1, input.Length + 1 /* because Col is 1-indexed */), state.ComputeSourcePos()); }
internal sealed override bool TryParse(ref ParseState <TToken> state, ref ExpectedCollector <TToken> expecteds, out SourcePos result) { result = state.ComputeSourcePos(); return(true); }
public override InternalResult <SourcePos> Parse(ref ParseState <TToken> state) => InternalResult.Success(state.ComputeSourcePos(), false);