Пример #1
0
        public TestScriptToken(TestScriptTokenType type, string code, int startIndex, int length)
        {
            Type = type;

            Code = code;

            StartIndex = startIndex;

            Length = length;
        }
Пример #2
0
 public TestScriptKeyword(string keyword, TestScriptTokenType tokenType)
 {
     Keyword   = keyword;
     TokenType = tokenType;
 }
Пример #3
0
        public TestScriptToken NextToken()
        {
            TestScriptToken token = null;

            char c = IgnoreWhiteSpaceAndComment();

            switch (c)
            {
            case ':':
                token       = new TestScriptToken(TestScriptTokenType.Colon, Code, CurrentPos, 1);
                CurrentPos += 1;
                break;

            case '(':
                token       = new TestScriptToken(TestScriptTokenType.LeftParen, Code, CurrentPos, 1);
                CurrentPos += 1;
                break;

            case ')':
                token       = new TestScriptToken(TestScriptTokenType.RightParen, Code, CurrentPos, 1);
                CurrentPos += 1;
                break;

            case ',':
                token       = new TestScriptToken(TestScriptTokenType.Comma, Code, CurrentPos, 1);
                CurrentPos += 1;
                break;

            case ';':
                token       = new TestScriptToken(TestScriptTokenType.Semicolon, Code, CurrentPos, 1);
                CurrentPos += 1;
                break;

            case '\0':
                token = new TestScriptToken(TestScriptTokenType.EndOfFile, Code, CurrentPos, 0);
                break;

            case '"':
            {
                char startChar = Peek();

                int len   = 0;
                int start = CurrentPos;

                while (true)
                {
                    len += 1;

                    CurrentPos += 1;

                    if (Peek() == '\\')
                    {
                        len += 1;

                        CurrentPos += 1;
                    }
                    else if (Peek() == startChar)
                    {
                        len += 1;

                        CurrentPos += 1;

                        break;
                    }
                    else if (Peek() == '\0')
                    {
                        throw new Exception("字符串未结束");
                    }
                }

                token = new TestScriptToken(TestScriptTokenType.String, Code, start, len);
            }
            break;

            default:
                if (char.IsDigit(c))
                {
                    int len   = 0;
                    int start = CurrentPos;

                    do
                    {
                        len += 1;

                        CurrentPos += 1;
                    }while (char.IsDigit(Peek()));

                    token = new TestScriptToken(TestScriptTokenType.Integer, Code, start, len);
                }
                else if (char.IsLetter(c))
                {
                    int len   = 0;
                    int start = CurrentPos;

                    do
                    {
                        len += 1;

                        CurrentPos += 1;

                        c = Peek();
                    }while (char.IsLetterOrDigit(c) || c == '_');

                    TestScriptTokenType type = m_KeywordTable.Match(Code, start, len);

                    token = new TestScriptToken(type, Code, start, len);
                }
                break;
            }

            if (token == null)
            {
                token = new TestScriptToken(TestScriptTokenType.Unknow, Code, CurrentPos, 0);
            }

            return(token);
        }