2025-06-08 15:08:45 +01:00

54 lines
1.4 KiB
C++

#include "scanner.hh"
#include "token.hh"
#include "error_handler.hh"
#include "object.hh"
#include <vector>
extern ErrorHandler error_handler;
std::vector<Token> 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));
}