예제 #1
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));
        }
예제 #2
0
        private static ParseResult <QuotedOrNonquotedValueNode> ParseQuotedValue(ICharInput input)
        {
            var startPos = input.Position;

            input = input.ConsumeChar(_quota);
            var res = input.ConsumeWhile(_quota);

            input = res.InputRest.ConsumeChar(_quota);
            return
                (CreateResult(
                     new QuotedOrNonquotedValueNode(res.Result, startPos, input.Position - startPos, true),
                     input));
        }