Acquarella.Lexers.Lexer.GetNextToken C# (CSharp) 메소드

GetNextToken() 개인적인 메소드

private GetNextToken ( ) : Token
리턴 Token
        private Token GetNextToken()
        {
            this.SkipWhiteSpaces();

            if (this.position >= this.length)
                return null;

            int start = this.position;

            int length;

            char ch = this.text[this.position];

            if (this.IsLineComment(ch))
            {
                for (this.position++; this.position < this.length; this.position++)
                {
                    ch = this.text[this.position];
                    if (ch == '\r' || ch == '\n')
                        break;
                }

                length = this.position - start;

                return new Token(TokenType.Comment, this.text, start, length);
            }

            if (this.IsStringDelimeter(ch))
            {
                this.position++;

                while (this.position < this.length && this.text[this.position] != ch)
                    this.position++;

                if (this.position < this.length)
                    this.position++;

                length = this.position - start;

                return new Token(TokenType.String, this.text, start, length);
            }

            if (!this.IsLetterOrDigit(ch))
            {
                this.position++;

                if (this.IsOperator(ch))
                    return new Token(TokenType.Operator, this.text, start, 1);

                return new Token(TokenType.Punctuation, this.text, start, 1);
            }

            if (this.IsLetter(ch))
            {
                while (this.position < this.length && !this.IsWhiteSpace(this.text[this.position]) && this.IsLetterOrDigit(this.text[this.position]))
                    this.position++;

                length = this.position - start;

                if (this.IsKeyword(this.text.Substring(start, length)))
                    return new Token(TokenType.Keyword, this.text, start, length);

                return new Token(TokenType.Name, this.text, start, length);
            }

            if (this.IsDigit(ch))
            {
                while (this.position < this.length && this.IsDigit(this.text[this.position]))
                    this.position++;

                if (this.position < this.length - 1 && this.text[this.position] == '.' && this.IsDigit(this.text[this.position + 1]))
                {
                    this.position++;

                    while (this.position < this.length && this.IsDigit(this.text[this.position]))
                        this.position++;
                }

                length = this.position - start;

                return new Token(TokenType.Number, this.text, start, length);
            }

            this.position++;

            return new Token(TokenType.Unknown, this.text, start, 1);
        }