#include "scanner.hh" #include "token.hh" #include "error_handler.hh" #include "object.hh" #include extern ErrorHandler error_handler; std::vector Scanner::scan_tokens() { while (!is_at_end()) { start = current; scan_token(); } tokens.push_back(Token(TokenType::EOFILE, "", Object{}, line)); return tokens; } bool Scanner::is_at_end() { return current >= code.size(); } void Scanner::scan_token() { char c = advance(); switch (c) { case '(': add_token(TokenType::LEFT_PAREN); break; case ')': add_token(TokenType::RIGHT_PAREN); break; case '{': add_token(TokenType::LEFT_BRACE); break; case '}': add_token(TokenType::RIGHT_BRACE); break; case ',': add_token(TokenType::COMMA); break; case '.': add_token(TokenType::DOT); break; case '-': add_token(TokenType::MINUS); break; case '+': add_token(TokenType::PLUS); break; case ';': add_token(TokenType::SEMICOLON); break; case '*': add_token(TokenType::STAR); break; default: error_handler.error(line, "Unexpected character."); break; } } char Scanner::advance() { return code.at(current++); } void Scanner::add_token(TokenType type) { add_token(type, Object{}); } void Scanner::add_token(TokenType type, Object literal) { std::string text = code.substr(start, current - start); tokens.push_back(Token(type, text, literal, line)); }