Beispiel #1
0
            internal sealed override InternalResult <TToken> Parse(ref ParseState <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 (!_predicate(val))
                {
                    state.Error = new ParseError <TToken>(
                        x,
                        false,
                        Expected,
                        state.SourcePos,
                        null
                        );
                    return(InternalResult.Failure <TToken>(false));
                }
                state.Advance();
                return(InternalResult.Success <TToken>(val, true));
            }
Beispiel #2
0
            internal sealed override InternalResult <TEnumerable> Parse(ref ParseState <TToken> state)
            {
                var span = state.Peek(_valueTokens.Length);  // span.Length <= _valueTokens.Length

                var errorPos = -1;

                for (var i = 0; i < span.Length; i++)
                {
                    if (!EqualityComparer <TToken> .Default.Equals(span[i], _valueTokens[i]))
                    {
                        errorPos = i;
                        break;
                    }
                }

                if (errorPos != -1)
                {
                    // strings didn't match
                    state.Advance(errorPos);
                    state.Error = new InternalError <TToken>(
                        Maybe.Just(span[errorPos]),
                        false,
                        state.SourcePos,
                        null
                        );
                    state.AddExpected(new Expected <TToken>(_valueTokens));
                    return(InternalResult.Failure <TEnumerable>(errorPos > 0));
                }

                if (span.Length < _valueTokens.Length)
                {
                    // strings matched but reached EOF
                    state.Advance(span.Length);
                    state.Error = new InternalError <TToken>(
                        Maybe.Nothing <TToken>(),
                        true,
                        state.SourcePos,
                        null
                        );
                    state.AddExpected(new Expected <TToken>(_valueTokens));
                    return(InternalResult.Failure <TEnumerable>(span.Length > 0));
                }

                // OK
                state.Advance(_valueTokens.Length);
                return(InternalResult.Success <TEnumerable>(_value, _valueTokens.Length > 0));
            }
Beispiel #3
0
            internal sealed override InternalResult <Unit> Parse(ref ParseState <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));
            }
Beispiel #4
0
            internal sealed override InternalResult <string> Parse(ref ParseState <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));
            }
Beispiel #5
0
            internal sealed override InternalResult <Unit> Parse(ref ParseState <TToken> state)
            {
                var startingPosition = state.SourcePos;
                var token            = state.Peek();
                var result           = _parser.Parse(ref 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
                           ));
            }
Beispiel #6
0
            internal sealed override InternalResult <TEnumerable> Parse(ref ParseState <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));
            }