public ParserContext(ParserConfiguration configuration, string text) { Configuration = configuration; Result = new ParseResult(); Lexer = new Lexer(text); Mapper = new CommandMapper(Configuration.Commands); }
public ParseResult Parse(string input) { var result = new ParseResult(); var lexer = new Lexer(input); var state = new ParserState(CommandRoot, lexer, _helpFlags, _helpVerb); while (state.Advance()) { } result.FinalNode = state.CurrentNode; result.NamedParameters = state.NamedParameters; result.PositionalParameters = state.PositionalParameters; if (state.HelpWanted) { result.Kind = ParseResultKind.Help; } else if (state.CurrentNode is CommandRoot) { if (state.PendingRequired.Any()) { var missing = string.Join(", ", state.PendingRequired); throw new CommandLineParserException(string.Concat("Missing required parameter(s): ", missing)); } result.Kind = ParseResultKind.DefaultCommand; } else if (state.CurrentNode is Command) { if (state.PendingRequired.Any()) { var missing = string.Join(", ", state.PendingRequired); throw new CommandLineParserException(string.Concat("Missing required parameter(s): ", missing)); } if (state.CurrentNode is ExternalCommand) { result.Kind = ParseResultKind.ExternalCommand; } else if (state.CurrentNode is InternalCommand) { result.Kind = ParseResultKind.InternalCommand; } } else { // TODO - scan forward to see if this is unique // TODO - build up a pretty message throw new CommandLineParserException("Ambiguous/incomplete command!"); } return result; }
public ParserState(CommandNode startNode, Lexer lexer, IEnumerable<string> helpFlags, string helpVerb) { NamedParameters = new List<ParserNamedParameterResult>(); PositionalParameters = new List<ParserPositionalParameterResult>(); CurrentNode = startNode; ExtractParameters(CurrentNode); foreach (var flag in helpFlags) { if (flag.StartsWith("--")) { _longHelpFlags.Add(flag.Substring(2)); } else if (flag.StartsWith("-")) { _shortHelpFlags.Add(flag.Substring(1)); } } _lexer = lexer; _helpVerb = helpVerb; CurrentToken = _lexer.Pop(); }