示例#1
0
 public ParserContext(ParserConfiguration configuration, string text)
 {
     Configuration = configuration;
     Result = new ParseResult();
     Lexer = new Lexer(text);
     Mapper = new CommandMapper(Configuration.Commands);
 }
示例#2
0
文件: Parser.cs 项目: cj525/yaclops
        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;
        }
示例#3
0
        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();
        }