private void scanToken() { char c = advance(); switch (c) { 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.COMMA); break; case '.': addToken(TokenType.DOT); break; case '-': addToken(TokenType.MINUS); break; case '+': addToken(TokenType.PLUS); break; case ';': addToken(TokenType.SEMICOLON); break; case '*': addToken(TokenType.STAR); break; case '?': addToken(TokenType.QUEST); break; case ':': addToken(TokenType.COLON); break; case '!': addToken(match('=')? TokenType.BANG_EQUAL: TokenType.BANG); break; case '=': addToken(match('=')? TokenType.EQUAL_EQUAL: TokenType.EQUAL); break; case '<': addToken(match('=')? TokenType.LESS_EQUAL: TokenType.LESS); break; case '>': addToken(match('=')? TokenType.GREATER_EQUAL: 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 '"': scanString(); break; default: if (isDigit(c)) { scanNumber(); } else if (isAlpha(c)) { scanIdentifier(); } else { Lox.error(line, $"Unexpected character '{c}'"); }; break; } }