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)); }
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)); }