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);
}