scanToken method

Future<void> scanToken()

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