/// <summary> /// Consume leading spaces. /// </summary> private static ICharInput ConsumeSpaces(this ICharInput input) { while (char.IsWhiteSpace(input.Current)) { input = input.GetNext(); } return(input); }
/// <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()); }
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()); }
/// <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)); }
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)); }
/// <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)); }
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)); }