diff --git a/src/token/type.hpp b/src/token/type.hpp index 254c734..e86978a 100644 --- a/src/token/type.hpp +++ b/src/token/type.hpp @@ -1,60 +1,50 @@ #pragma once +#include #include +#include -enum class TokenType { - ILLEGAL, - EOF_, +namespace lexer { - IDENT, - INT, +// X-macro list of token types and their string representations +#define TOKEN_LIST \ + X(ILLEGAL, "ILLEGAL") \ + X(EOF_, "EOF") \ + X(IDENT, "IDENT") \ + X(INT, "INT") \ + X(ASSIGN, "=") \ + X(PLUS, "+") \ + X(COMMA, ",") \ + X(SEMICOLON, ";") \ + X(LPAREN, "(") \ + X(RPAREN, ")") \ + X(LBRACE, "{") \ + X(RBRACE, "}") \ + X(FUNCTION, "FUNCTION") \ + X(LET, "LET") - ASSIGN, - PLUS, + // Define the TokenType enum using the X-macro + enum class TokenType { +#define X(name, str) name, + TOKEN_LIST +#undef X + }; - COMMA, - SEMICOLON, + // Array mapping enum values to their string representations + static constexpr std:: + array(TokenType::LET) + 1> + tokenTypeStrings = { +#define X(name, str) str, + TOKEN_LIST +#undef X + }; - LPAREN, - RPAREN, - LBRACE, - RBRACE, - - FUNCTION, - LET -}; - -inline std::ostream& operator<<(std::ostream& os, TokenType tt) { - switch (tt) { - case TokenType::ILLEGAL: - return os << "ILLEGAL"; - case TokenType::EOF_: - return os << "EOF"; - case TokenType::IDENT: - return os << "IDENT"; - case TokenType::INT: - return os << "INT"; - case TokenType::ASSIGN: - return os << "="; - case TokenType::PLUS: - return os << "+"; - case TokenType::COMMA: - return os << ","; - case TokenType::SEMICOLON: - return os << ";"; - case TokenType::LPAREN: - return os << "("; - case TokenType::RPAREN: - return os << ")"; - case TokenType::LBRACE: - return os << "{"; - case TokenType::RBRACE: - return os << "}"; - case TokenType::FUNCTION: - return os << "FUNCTION"; - case TokenType::LET: - return os << "LET"; - default: + // Stream insertion operator using the lookup array + inline std::ostream& operator<<(std::ostream& os, TokenType type) { + auto idx = static_cast(type); + if (idx < tokenTypeStrings.size()) + return os << tokenTypeStrings[idx]; return os << "Unknown"; } -} + +} // namespace lexer