private void InnerParse(string[] args) { parsedArgs = args; var tokenizer = new Tokenizer(args); while (!tokenizer.Finished) { var token = tokenizer.ReadNextToken(); if (token is PositionalArgumentToken) { if (currentValuesCount < values.Count()) { values[currentValuesCount].Descriptor = token.Descriptor; values[currentValuesCount++].Value = ((PositionalArgumentToken)token).Value; } else { unexpectedArguments.Add(new UnexpectedArgument(((PositionalArgumentToken)token).Value)); } } else if (token is LongNameToken) { var foundOption = options.SingleOrDefault(x => x.LongName == ((LongNameToken)token).Name); if (foundOption != null) { var parsedOption = new CommandLineOption(foundOption); int additionalLength = 0; var isSeparated = true; if (foundOption.AcceptsArgument) { tokenizer.MarkPosition(); var argumentString = tokenizer.ReadUntilTheEndOfString(); if (((LongNameToken)token).HasAssignment) { additionalLength = argumentString.Length + 1; // argument length + '=' isSeparated = false; } if (parsedOption.ParseArgument(argumentString, isSeparated)) { tokenizer.MoveToTheNextString(); } else { tokenizer.ResetPosition(); } } parsedOption.Descriptor = token.Descriptor.WithLengthChangedBy(2 + additionalLength); // -- prefix if (foundOption.OptionType == typeof(bool)) { parsedOption.Value = true; } parsedOptions.Add(parsedOption); } else { unexpectedArguments.Add(new UnexpectedArgument(((LongNameToken)token).Name)); } } else if (token is ShortNameToken) { var foundOption = options.SingleOrDefault(x => x.ShortName == ((ShortNameToken)token).Name); if (foundOption != null) { var parsedOption = new CommandLineOption(foundOption); int additionalLength = 0; var isSeparated = false; if (foundOption.AcceptsArgument) { tokenizer.MarkPosition(); var argumentString = tokenizer.ReadUntilTheEndOfString(); if (argumentString == string.Empty) { // it means that the value is separated by a whitespace tokenizer.MoveToTheNextString(); argumentString = tokenizer.ReadUntilTheEndOfString(); isSeparated = true; } if (argumentString != null) { additionalLength = isSeparated ? 0 : argumentString.Length; if (!parsedOption.ParseArgument(argumentString, isSeparated)) { tokenizer.ResetPosition(); } } } parsedOption.Descriptor = token.Descriptor.WithLengthChangedBy(additionalLength); if (foundOption.OptionType == typeof(bool)) { parsedOption.Value = true; } parsedOptions.Add(parsedOption); } else { unexpectedArguments.Add(new UnexpectedArgument(((ShortNameToken)token).Name.ToString())); } } } }