internal sealed override Result <TToken, TToken> Parse(IParseState <TToken> state) { var x = state.Peek(); if (!x.HasValue) { return(Result.Failure <TToken, TToken>( new ParseError <TToken>( x, true, Expected, state.SourcePos, null ), false )); } var val = x.GetValueOrDefault(); if (!_predicate(val)) { return(Result.Failure <TToken, TToken>( new ParseError <TToken>( x, false, Expected, state.SourcePos, null ), false )); } state.Advance(); return(Result.Success <TToken, TToken>(val, true)); }
internal sealed override InternalResult <TToken> Parse(IParseState <TToken> state) { var x = state.Peek(); if (!x.HasValue) { state.Error = new ParseError <TToken>( x, true, Expected, state.SourcePos, null ); return(InternalResult.Failure <TToken>(false)); } var val = x.GetValueOrDefault(); if (!EqualityComparer <TToken> .Default.Equals(val, _token)) { state.Error = new ParseError <TToken>( x, false, Expected, state.SourcePos, null ); return(InternalResult.Failure <TToken>(false)); } state.Advance(); return(InternalResult.Success <TToken>(val, true)); }
internal sealed override InternalResult <Unit> Parse(IParseState <TToken> state) { var result = state.Peek(); if (result.HasValue) { state.Error = new ParseError <TToken>( result, false, Expected, state.SourcePos, null ); return(InternalResult.Failure <Unit>(false)); } return(InternalResult.Success(Unit.Value, false)); }
internal sealed override Result <TToken, Unit> Parse(IParseState <TToken> state) { var result = state.Peek(); if (result.HasValue) { return(Result.Failure <TToken, Unit>( new ParseError <TToken>( result, false, Expected, state.SourcePos, null ), false )); } return(Result.Success <TToken, Unit>(Unit.Value, false)); }
internal sealed override Result <TToken, TEnumerable> Parse(IParseState <TToken> state) { var consumedInput = false; foreach (var x in _valueList) { var result = state.Peek(); if (!result.HasValue) { return(Result.Failure <TToken, TEnumerable>( new ParseError <TToken>( result, true, Expected, state.SourcePos, null ), consumedInput )); } TToken token = result.GetValueOrDefault(); if (!token.Equals(x)) { return(Result.Failure <TToken, TEnumerable>( new ParseError <TToken>( result, false, Expected, state.SourcePos, null ), consumedInput )); } consumedInput = true; state.Advance(); } return(Result.Success <TToken, TEnumerable>(_value, consumedInput)); }
internal sealed override InternalResult <string> Parse(IParseState <char> state) { var consumedInput = false; var builder = new PooledStringBuilder(_value.Length); foreach (var c in _value) { var result = state.Peek(); if (!result.HasValue) { state.Error = new ParseError <char>( result, true, Expected, state.SourcePos, null ); return(InternalResult.Failure <string>(consumedInput)); } var token = result.GetValueOrDefault(); if (char.ToLowerInvariant(token) != c) { state.Error = new ParseError <char>( result, false, Expected, state.SourcePos, null ); return(InternalResult.Failure <string>(consumedInput)); } consumedInput = true; builder.Append(token); state.Advance(); } return(InternalResult.Success <string>(builder.GetStringAndClear(), consumedInput)); }
internal sealed override InternalResult <Unit> Parse(IParseState <TToken> state) { var startingPosition = state.SourcePos; var token = state.Peek(); var result = _parser.Parse(state); if (result.Success) { state.Error = new ParseError <TToken>( token, false, null, startingPosition, null ); return(InternalResult.Failure <Unit>(result.ConsumedInput)); } return(InternalResult.Success( Unit.Value, result.ConsumedInput )); }
internal sealed override InternalResult <TEnumerable> Parse(IParseState <TToken> state) { var consumedInput = false; foreach (var x in _valueTokens) { var result = state.Peek(); if (!result.HasValue) { state.Error = new ParseError <TToken>( result, true, Expected, state.SourcePos, null ); return(InternalResult.Failure <TEnumerable>(consumedInput)); } TToken token = result.GetValueOrDefault(); if (!EqualityComparer <TToken> .Default.Equals(token, x)) { state.Error = new ParseError <TToken>( result, false, Expected, state.SourcePos, null ); return(InternalResult.Failure <TEnumerable>(consumedInput)); } consumedInput = true; state.Advance(); } return(InternalResult.Success <TEnumerable>(_value, consumedInput)); }