Esempio n. 1
0
        public static string[] Tokenize(string args)
        {
            var argList = new List <string>();

            ArgLexerState state = ArgLexerState.InArg, lastState = ArgLexerState.InArg;
            var           buffer = new StringBuilder();

            for (int i = 0; i < args.Length; i++)
            {
                var c = args[i];

                switch (state)
                {
                case ArgLexerState.InEscapeChar:
                    switch (c)
                    {
                    case '"':
                        buffer.Append(c);
                        state = lastState;
                        break;

                    default:
                        throw new InvalidOperationException();
                    }

                    break;

                default:
                    switch (c)
                    {
                    case ' ':
                        switch (state)
                        {
                        case ArgLexerState.InArg:
                            if (buffer.Length != 0)
                            {
                                argList.Add(buffer.ToString());
                            }

                            buffer.Clear();
                            break;

                        case ArgLexerState.InQuotedArg:
                            buffer.Append(' ');
                            break;

                        default:
                            throw new InvalidOperationException();
                        }
                        break;

                    case '"':
                        switch (state)
                        {
                        case ArgLexerState.InArg:
                            if (buffer.Length != 0)
                            {
                                argList.Add(buffer.ToString());
                            }

                            buffer.Clear();
                            state = ArgLexerState.InQuotedArg;
                            break;

                        case ArgLexerState.InQuotedArg:
                            if (buffer.Length != 0)
                            {
                                argList.Add(buffer.ToString());
                            }

                            buffer.Clear();
                            state = ArgLexerState.InArg;
                            break;
                        }

                        break;

                    case '^':
                        lastState = state;
                        state     = ArgLexerState.InEscapeChar;
                        break;

                    default:
                        buffer.Append(c);
                        break;
                    }

                    break;
                }
            }

            if (buffer.Length != 0)
            {
                switch (state)
                {
                case ArgLexerState.InArg:
                    argList.Add(buffer.ToString());
                    break;

                default:
                    throw new InvalidOperationException();
                }
            }

            return(argList.ToArray());
        }
Esempio n. 2
0
        public static List <ArgToken> GetTokenInfo(string args)
        {
            var argList = new List <ArgToken>();

            ArgLexerState state = ArgLexerState.InArg, lastState = ArgLexerState.InArg;
            var           buffer = new StringBuilder();
            var           offset = -1;
            var           i      = 0;

            void add(int nextOffset)
            {
                var end = i + nextOffset;

                if (buffer.Length > 0)
                {
                    argList.Add(
                        new ArgToken(
                            state == ArgLexerState.InArg ? ArgTokenType.Arg : ArgTokenType.QuotedArg,
                            offset,
                            end,
                            args.Substring(offset, end - offset),
                            buffer.ToString()));

                    buffer.Clear();
                }

                offset = end;
            }

            for (i = 0; i < args.Length; i++)
            {
                var c = args[i];

                if (offset == -1)
                {
                    offset = i;
                }

                switch (state)
                {
                case ArgLexerState.InEscapeChar:
                    switch (c)
                    {
                    case '"':
                        buffer.Append(c);
                        state = lastState;
                        break;

                    case '^':
                        buffer.Append('^');
                        state = lastState;
                        break;

                    default:
                        throw new InvalidOperationException();
                    }

                    break;

                default:
                    switch (c)
                    {
                    case ' ':
                        switch (state)
                        {
                        case ArgLexerState.InArg:
                            add(1);
                            break;

                        case ArgLexerState.InQuotedArg:
                            buffer.Append(' ');
                            break;

                        default:
                            throw new InvalidOperationException();
                        }
                        break;

                    case '"':
                        switch (state)
                        {
                        case ArgLexerState.InArg:
                            add(0);
                            state = ArgLexerState.InQuotedArg;
                            break;

                        case ArgLexerState.InQuotedArg:
                            add(1);
                            state = ArgLexerState.InArg;
                            break;
                        }

                        break;

                    case '^':
                        lastState = state;
                        state     = ArgLexerState.InEscapeChar;
                        break;

                    default:
                        buffer.Append(c);
                        break;
                    }

                    break;
                }
            }

            if (buffer.Length != 0)
            {
                switch (state)
                {
                case ArgLexerState.InArg:
                    add(0);
                    break;

                default:
                    throw new InvalidOperationException();
                }
            }

            return(argList);
        }