Exemplo n.º 1
0
            internal override InternalResult <string> Parse(IParseState <TToken> state)
            {
                var consumedInput = false;
                var builder       = new PooledStringBuilder(_count);

                for (var _ = 0; _ < _count; _++)
                {
                    var result = _parser.Parse(state);
                    consumedInput = consumedInput || result.ConsumedInput;

                    if (!result.Success)
                    {
                        state.Error = state.Error.WithExpected(Expected);
                        return(InternalResult.Failure <string>(consumedInput));
                    }

                    builder.Append(result.Value);
                }

                return(InternalResult.Success(builder.GetStringAndClear(), consumedInput));
            }
Exemplo n.º 2
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));
            }