private static IEnumerable <CommandTreeToken> ScanShortOptions(CommandTreeTokenizerContext context, TextBuffer reader, int position) { var result = new List <CommandTreeToken>(); while (!reader.ReachedEnd) { var current = reader.Peek(); if (char.IsWhiteSpace(current)) { break; } // Encountered a separator? if (current == '=' || current == ':') { break; } if (char.IsLetter(current)) { context.AddRemaining(current); reader.Read(); // Consume var value = current.ToString(CultureInfo.InvariantCulture); result.Add(result.Count == 0 ? new CommandTreeToken(CommandTreeToken.Kind.ShortOption, position, value, $"-{value}") : new CommandTreeToken(CommandTreeToken.Kind.ShortOption, position + result.Count, value, value)); } else { // Create a token representing the short option. var tokenPosition = position + 1 + result.Count; var represntation = current.ToString(CultureInfo.InvariantCulture); var token = new CommandTreeToken(CommandTreeToken.Kind.ShortOption, tokenPosition, represntation, represntation); throw ParseException.InvalidShortOptionName(reader.Original, token); } } if (result.Count > 1) { foreach (var item in result) { item.IsGrouped = true; } } return(result); }
private static CommandTreeToken ScanLongOption(CommandTreeTokenizerContext context, TextBuffer reader, int position) { reader.Consume('-'); context.AddRemaining('-'); if (reader.ReachedEnd) { // Rest of the arguments are remaining ones. context.Mode = Mode.Remaining; return(new CommandTreeToken(CommandTreeToken.Kind.Remaining, position, "--", "--")); } var name = ScanString(context, reader, new[] { '=', ':' }); // Perform validation of the name. if (name.Value.Length == 0) { throw ParseException.LongOptionNameIsMissing(reader, position); } if (name.Value.Length == 1) { throw ParseException.LongOptionNameIsOneCharacter(reader, position, name.Value); } if (char.IsDigit(name.Value[0])) { throw ParseException.LongOptionNameStartWithDigit(reader, position, name.Value); } for (var index = 0; index < name.Value.Length; index++) { if (!char.IsLetterOrDigit(name.Value[index]) && name.Value[index] != '-' && name.Value[index] != '_') { throw ParseException.LongOptionNameContainSymbol(reader, position + 2 + index, name.Value[index]); } } return(new CommandTreeToken(CommandTreeToken.Kind.LongOption, position, name.Value, $"--{name.Value}")); }