예제 #1
0
 /// <summary>
 /// Consume leading spaces.
 /// </summary>
 private static ICharInput ConsumeSpaces(this ICharInput input)
 {
     while (char.IsWhiteSpace(input.Current))
     {
         input = input.GetNext();
     }
     return(input);
 }
예제 #2
0
 /// <summary>
 /// Consume single char.
 /// </summary>
 private static ICharInput ConsumeChar(this ICharInput input, char charToConsume)
 {
     if (input.Current != charToConsume)
     {
         throw new ParsingException(
                   "'{0}' expected, but '{1}' found".FormatWith(charToConsume, input.Current),
                   input.Position);
     }
     return(input.GetNext());
 }
예제 #3
0
 private static ICharInput ConsumeChar([NotNull] this ICharInput input, char charToConsume)
 {
     if (input.Current != charToConsume)
     {
         throw new ParsingException(
                   $"'{charToConsume}' expected, but '{input.Current}' found",
                   input.Position);
     }
     return(input.GetNext());
 }
예제 #4
0
        /// <summary>
        /// Consume while space character or end of file reached.
        /// </summary>
        private static ParseResult <string> ConsumeWhileNonSpace(this ICharInput input)
        {
            var sb = new StringBuilder();

            while (!input.IsEof() && !char.IsWhiteSpace(input.Current))
            {
                sb.Append(input.Current);
                input = input.GetNext();
            }
            return(new ParseResult <string>(sb.ToString(), input));
        }
예제 #5
0
        private static ParseResult <OptionNode> ParseOption(ICharInput input)
        {
            var startPos = input.Position;

            if (!IsOptionPrefix(input.Current))
            {
                throw new ParsingException("invalid option prefix '{0}'");
            }
            input = input.GetNext();

            var name =
                input.ConsumeWhile(
                    c =>
                    c != CharInput.EOF &&
                    !char.IsWhiteSpace(c) &&
                    c != '=' &&
                    c != '+' &&
                    c != '-');

            if (name.Result.Length == 0)
            {
                throw new ParsingException("option name expected", input.Position);
            }

            var nextChar = name.InputRest.Current;

            if (nextChar == '+' || nextChar == '-')
            {
                return
                    (CreateResult(
                         new OptionNode(name.Result, startPos, name.InputRest.Position - startPos + 1, nextChar == '+'),
                         name.InputRest.GetNext()));
            }

            if (nextChar == '=')
            {
                var value = ParseQuotedOrNonquotedValue(name.InputRest.GetNext());
                if (value.Result.Text.Length == 0)
                {
                    throw new ParsingException(
                              "option '{0}' value not specified".FormatWith(name.Result),
                              value.Result.Position);
                }
                return
                    (new ParseResult <OptionNode>(
                         new OptionNode(name.Result, startPos, value.InputRest.Position - startPos, value.Result),
                         value.InputRest));
            }

            return
                (CreateResult(
                     new OptionNode(name.Result, startPos, name.InputRest.Position - startPos),
                     name.InputRest));
        }
예제 #6
0
        /// <summary>
        /// Consume while predicate is true.
        /// </summary>
        private static ParseResult <string> ConsumeWhile(this ICharInput input, Func <char, bool> predicate)
        {
            var sb = new StringBuilder();

            while (predicate(input.Current))
            {
                input.ThowIfEof();
                sb.Append(input.Current);
                input = input.GetNext();
            }
            return(new ParseResult <string>(sb.ToString(), input));
        }
예제 #7
0
        private static ParseResult <string> ConsumeWhile([NotNull] this ICharInput input, char stopChar)
        {
            var sb = new StringBuilder();

            while (input.Current != stopChar)
            {
                input.ThowIfEof();
                sb.Append(input.Current);
                input = input.GetNext();
            }
            return(new ParseResult <string>(sb.ToString(), input));
        }