Beispiel #1
0
            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));
            }
Beispiel #2
0
            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));
            }
Beispiel #3
0
            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));
            }
Beispiel #4
0
            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));
            }
Beispiel #5
0
            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));
            }
Beispiel #6
0
            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));
            }
Beispiel #7
0
            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
                           ));
            }
Beispiel #8
0
            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));
            }