// Valid returned objects:
        //  - "help"
        //  - int: for choice number
        //  - Parsed.Divert
        //  - Variable declaration/assignment
        //  - Epression
        //  - Lookup debug source for character offset
        //  - Lookup debug source for runtime path
        public CommandLineInput CommandLineUserInput()
        {
            CommandLineInput result = new CommandLineInput();

            Whitespace();

            if (ParseString("help") != null)
            {
                result.isHelp = true;
                return(result);
            }

            if (ParseString("exit") != null || ParseString("quit") != null)
            {
                result.isExit = true;
                return(result);
            }

            return((CommandLineInput)OneOf(
                       DebugSource,
                       DebugPathLookup,
                       UserChoiceNumber,
                       UserImmediateModeStatement
                       ));
        }
        CommandLineInput UserImmediateModeStatement()
        {
            var statement = OneOf(SingleDivert, TempDeclarationOrAssignment, Expression);

            var inputStruct = new CommandLineInput();

            inputStruct.userImmediateModeStatement = statement;
            return(inputStruct);
        }
        CommandLineInput DebugPathLookup()
        {
            Whitespace();

            if (ParseString("DebugPath") == null)
            {
                return(null);
            }

            if (Whitespace() == null)
            {
                return(null);
            }

            var pathStr = Expect(RuntimePath, "path") as string;

            var inputStruct = new CommandLineInput();

            inputStruct.debugPathLookup = pathStr;
            return(inputStruct);
        }
        CommandLineInput UserChoiceNumber()
        {
            Whitespace();

            int?number = ParseInt();

            if (number == null)
            {
                return(null);
            }

            Whitespace();

            if (Parse(EndOfLine) == null)
            {
                return(null);
            }

            var inputStruct = new CommandLineInput();

            inputStruct.choiceInput = number;
            return(inputStruct);
        }
        CommandLineInput DebugSource()
        {
            Whitespace();

            if (ParseString("DebugSource") == null)
            {
                return(null);
            }

            Whitespace();

            var expectMsg = "character offset in parentheses, e.g. DebugSource(5)";

            if (Expect(String("("), expectMsg) == null)
            {
                return(null);
            }

            Whitespace();

            int?characterOffset = ParseInt();

            if (characterOffset == null)
            {
                Error(expectMsg);
                return(null);
            }

            Whitespace();

            Expect(String(")"), "closing parenthesis");

            var inputStruct = new CommandLineInput();

            inputStruct.debugSource = characterOffset;
            return(inputStruct);
        }