scanToken method
Implementation
Future<void> scanToken() async {
String c = advance();
switch (c) {
case '[':
addToken(TokenType.LEFT_BRACKET);
break;
case ']':
addToken(TokenType.RIGHT_BRACKET);
break;
case '(':
addToken(TokenType.LEFT_PAREN);
break;
case ')':
addToken(TokenType.RIGHT_PAREN);
break;
case '{':
addToken(TokenType.LEFT_BRACE);
break;
case '}':
addToken(TokenType.RIGHT_BRACE);
break;
case '?':
addToken(TokenType.QUESTION);
break;
case ':':
addToken(TokenType.COLON);
break;
case ',':
addToken(TokenType.COMMA);
break;
case '.':
addToken(TokenType.DOT);
break;
case '-':
if (allow()) {
number(c);
} else {
addToken(TokenType.MINUS);
}
break;
case '+':
addToken(TokenType.PLUS);
break;
case ';':
addToken(TokenType.SEMICOLON);
break;
case '*':
addToken(TokenType.STAR);
break;
case '%':
addToken(TokenType.MOD);
break;
case '!':
if (match('=')) {
addToken(TokenType.BANG_EQUAL);
} else {
addToken(TokenType.BANG);
}
break;
case '=':
if (match('=')) {
addToken(TokenType.EQUAL_EQUAL);
} else {
addToken(TokenType.EQUAL);
}
break;
case '<':
if (match('=')) {
addToken(TokenType.LESS_EQUAL);
} else {
addToken(TokenType.LESS);
}
break;
case '>':
if (match('=')) {
addToken(TokenType.GREATER_EQUAL);
} else {
addToken(TokenType.GREATER);
}
break;
case '/':
if (match('/')) {
while (peek() != '\n' && !isAtEnd()) {
advance();
}
} else {
addToken(TokenType.SLASH);
}
break;
case ' ':
case '\r':
case '\t':
break;
case '\n':
line++;
break;
case "'":
string("'");
break;
case '"':
string('"');
break;
default:
if (isDigit(c, false)) {
number(c);
} else if (isAlpha(c)) {
await identifier();
} else {
error(line, "Unexpected character.");
}
break;
}
}