diff --git a/include/ast/BinaryOpNode.h b/include/ast/BinaryOpNode.h
index 3b62e9bb74baceda4413112229a5617a16c54f84..d085dd9264f17dada98709530cf74e14dfe4995f 100644
--- a/include/ast/BinaryOpNode.h
+++ b/include/ast/BinaryOpNode.h
@@ -6,40 +6,11 @@
 
 #include "ast/ExpressionNode.h"
 #include "ast/LiteralNode.h"
+#include "token/Token.h"
 
 namespace funk
 {
 
-/**
- * @brief Enumeration of all supported binary operators in the Funk language.
- * This enum defines both arithmetic and logical binary operations.
- */
-enum class BinaryOp
-{
-    PLUS,     ///< Addition operator (+)
-    MINUS,    ///< Subtraction operator (-)
-    MULTIPLY, ///< Multiplication operator (*)
-    DIVIDE,   ///< Division operator (/)
-    MODULO,   ///< Modulo operator (%)
-    POWER,    ///< Power operator (^)
-
-    EQUAL,         ///< Equality operator (==)
-    NOT_EQUAL,     ///< Inequality operator (!=)
-    LESS,          ///< Less than operator (<)
-    LESS_EQUAL,    ///< Less than or equal operator (<=)
-    GREATER,       ///< Greater than operator (>)
-    GREATER_EQUAL, ///< Greater than or equal operator (>=)
-    AND,           ///< Logical AND operator (&&)
-    OR,            ///< Logical OR operator (||)
-};
-
-/**
- * @brief Converts a binary operator to a string representation.
- * @param op The binary operator
- * @return String representation of the operator
- */
-String op_to_s(BinaryOp op);
-
 /**
  * @brief Class representing a binary operation in the Funk AST.
  *
@@ -56,7 +27,7 @@ public:
      * @param op The binary operator to apply
      * @param right The right-hand side expression
      */
-    BinaryOpNode(ExpressionNode* left, BinaryOp op, ExpressionNode* right);
+    BinaryOpNode(ExpressionNode* left, const Token& op, ExpressionNode* right);
 
     /**
      * @brief Virtual destructor for proper cleanup of resources.
@@ -85,7 +56,7 @@ public:
      * @brief Gets the binary operator used in this operation.
      * @return The binary operator
      */
-    BinaryOp get_op() const;
+    Token get_op() const;
 
     /**
      * @brief Gets the left-hand side expression of the binary operation.
@@ -100,7 +71,7 @@ public:
     ExpressionNode* get_right() const;
 
 private:
-    BinaryOp op;           ///< The binary operator
+    Token op;              ///< The binary operator
     ExpressionNode* left;  ///< The left-hand side expression
     ExpressionNode* right; ///< The right-hand side expression
 };
diff --git a/include/ast/UnaryOpNode.h b/include/ast/UnaryOpNode.h
index 3255594b337c5d8c3a6180621dd9fb92450fb7e8..04da111694fcfbd22684bd48cc286fcc2b64b6ab 100644
--- a/include/ast/UnaryOpNode.h
+++ b/include/ast/UnaryOpNode.h
@@ -6,26 +6,11 @@
 
 #include "ast/ExpressionNode.h"
 #include "ast/LiteralNode.h"
+#include "token/Token.h"
 
 namespace funk
 {
 
-/**
- * @brief Enumeration of all supported unary operators in the Funk language.
- */
-enum class UnaryOp
-{
-    NEGATE, ///< Negation operator (-)
-    NOT,    ///< Logical NOT operator (!)
-};
-
-/**
- * @brief Converts a unary operator to a string representation.
- * @param op The unary operator
- * @return String representation of the operator
- */
-String op_to_s(UnaryOp op);
-
 /**
  * @brief Class representing a unary operation in the Funk AST.
  *
@@ -40,7 +25,7 @@ public:
      * @param op The unary operator to apply
      * @param expr The expression to apply the operator to
      */
-    UnaryOpNode(UnaryOp op, ExpressionNode* expr);
+    UnaryOpNode(const Token& op, ExpressionNode* expr);
 
     /**
      * @brief Virtual destructor for proper cleanup of resources.
@@ -69,7 +54,7 @@ public:
      * @brief Gets the unary operator used in this operation.
      * @return The unary operator
      */
-    UnaryOp get_op() const;
+    Token get_op() const;
 
     /**
      * @brief Gets the expression that the operator is applied to.
@@ -78,8 +63,8 @@ public:
     ExpressionNode* get_expr() const;
 
 private:
-    UnaryOp op;           ///< The unary operator
+    Token op;             ///< The unary operator
     ExpressionNode* expr; ///< The expression to apply the operator to
 };
 
-} // namespace funk
\ No newline at end of file
+} // namespace funk
diff --git a/include/parser/Parser.h b/include/parser/Parser.h
index 46e06eab937fbb2a43e8c2cb7d37bd20cea9d3e3..287b64a9154043a1500bbf7e3c212a610e927cf3 100644
--- a/include/parser/Parser.h
+++ b/include/parser/Parser.h
@@ -34,9 +34,6 @@ private:
     bool check(TokenType type) const;
     bool match(TokenType expected);
 
-    BinaryOp to_binary_op(const Token& token) const;
-    UnaryOp to_unary_op(const Token& token) const;
-
     Node* parse_statement();
     Node* parse_expression();
     Node* parse_assignment();
diff --git a/source/ast/BinaryOpNode.cc b/source/ast/BinaryOpNode.cc
index 553cdd9a530c3a0d45c61c7a4f7fa68a0a11980e..bf79f2d289d34049e90f33b5174f4a90287e6ff7 100644
--- a/source/ast/BinaryOpNode.cc
+++ b/source/ast/BinaryOpNode.cc
@@ -3,8 +3,8 @@
 namespace funk
 {
 
-BinaryOpNode::BinaryOpNode(ExpressionNode* left, BinaryOp op, ExpressionNode* right) :
-    ExpressionNode(left->get_location()), op(op), left(left), right(right)
+BinaryOpNode::BinaryOpNode(ExpressionNode* left, const Token& op, ExpressionNode* right) :
+    ExpressionNode(op.get_location()), op(op), left(left), right(right)
 {
 }
 
@@ -25,22 +25,22 @@ Node* BinaryOpNode::evaluate() const
 
     try
     {
-        switch (op)
+        switch (op.get_type())
         {
-        case BinaryOp::PLUS: result = left_value + right_value; break;
-        case BinaryOp::MINUS: result = left_value - right_value; break;
-        case BinaryOp::MULTIPLY: result = left_value * right_value; break;
-        case BinaryOp::DIVIDE: result = left_value / right_value; break;
-        case BinaryOp::MODULO: result = left_value % right_value; break;
-        case BinaryOp::POWER: result = pow(left_value, right_value); break;
-        case BinaryOp::EQUAL: result = left_value == right_value; break;
-        case BinaryOp::NOT_EQUAL: result = left_value != right_value; break;
-        case BinaryOp::LESS: result = left_value < right_value; break;
-        case BinaryOp::LESS_EQUAL: result = left_value <= right_value; break;
-        case BinaryOp::GREATER: result = left_value > right_value; break;
-        case BinaryOp::GREATER_EQUAL: result = left_value >= right_value; break;
-        case BinaryOp::AND: result = left_value && right_value; break;
-        case BinaryOp::OR: result = left_value || right_value; break;
+        case TokenType::PLUS: result = left_value + right_value; break;
+        case TokenType::MINUS: result = left_value - right_value; break;
+        case TokenType::MULTIPLY: result = left_value * right_value; break;
+        case TokenType::DIVIDE: result = left_value / right_value; break;
+        case TokenType::MODULO: result = left_value % right_value; break;
+        case TokenType::POWER: result = pow(left_value, right_value); break;
+        case TokenType::EQUAL: result = left_value == right_value; break;
+        case TokenType::NOT_EQUAL: result = left_value != right_value; break;
+        case TokenType::LESS: result = left_value < right_value; break;
+        case TokenType::LESS_EQUAL: result = left_value <= right_value; break;
+        case TokenType::GREATER: result = left_value > right_value; break;
+        case TokenType::GREATER_EQUAL: result = left_value >= right_value; break;
+        case TokenType::AND: result = left_value && right_value; break;
+        case TokenType::OR: result = left_value || right_value; break;
         default: throw RuntimeError(location, "Invalid binary operator");
         }
     }
@@ -58,7 +58,7 @@ Node* BinaryOpNode::evaluate() const
 
 String BinaryOpNode::to_s() const
 {
-    return "(" + left->to_s() + " " + op_to_s(op) + " " + right->to_s() + ")";
+    return "(" + left->to_s() + " " + token_type_to_s(op.get_type()) + " " + right->to_s() + ")";
 }
 
 NodeValue BinaryOpNode::get_value() const
@@ -69,7 +69,7 @@ NodeValue BinaryOpNode::get_value() const
     return result->get_value();
 }
 
-BinaryOp BinaryOpNode::get_op() const
+Token BinaryOpNode::get_op() const
 {
     return op;
 }
@@ -84,26 +84,4 @@ ExpressionNode* BinaryOpNode::get_right() const
     return right;
 }
 
-String op_to_s(BinaryOp op)
-{
-    switch (op)
-    {
-    case BinaryOp::PLUS: return "+";
-    case BinaryOp::MINUS: return "-";
-    case BinaryOp::MULTIPLY: return "*";
-    case BinaryOp::DIVIDE: return "/";
-    case BinaryOp::MODULO: return "%";
-    case BinaryOp::POWER: return "^";
-    case BinaryOp::EQUAL: return "==";
-    case BinaryOp::NOT_EQUAL: return "!=";
-    case BinaryOp::LESS: return "<";
-    case BinaryOp::LESS_EQUAL: return "<=";
-    case BinaryOp::GREATER: return ">";
-    case BinaryOp::GREATER_EQUAL: return ">=";
-    case BinaryOp::AND: return "&&";
-    case BinaryOp::OR: return "||";
-    default: return "UNKNOWN";
-    }
-}
-
 } // namespace funk
diff --git a/source/ast/UnaryOpNode.cc b/source/ast/UnaryOpNode.cc
index 830c959561d2f70e75c252290d9da3825c03b285..1eda4a94f0d5e332a9282f0346b981f6f47e8113 100644
--- a/source/ast/UnaryOpNode.cc
+++ b/source/ast/UnaryOpNode.cc
@@ -3,8 +3,8 @@
 namespace funk
 {
 
-UnaryOpNode::UnaryOpNode(UnaryOp op, ExpressionNode* expr) :
-    ExpressionNode(expr->get_location()), op(op), expr(expr) {
+UnaryOpNode::UnaryOpNode(const Token& op, ExpressionNode* expr) :
+    ExpressionNode(op.get_location()), op(op), expr(expr) {
 
     };
 
@@ -22,10 +22,10 @@ Node* UnaryOpNode::evaluate() const
 
     try
     {
-        switch (op)
+        switch (op.get_type())
         {
-        case UnaryOp::NEGATE: result = -expr_value; break;
-        case UnaryOp::NOT: result = !expr_value; break;
+        case TokenType::MINUS: result = -expr_value; break;
+        case TokenType::NOT: result = !expr_value; break;
         default: throw RuntimeError(location, "Invalid unary operator");
         }
     }
@@ -43,7 +43,7 @@ Node* UnaryOpNode::evaluate() const
 
 String UnaryOpNode::to_s() const
 {
-    return "(" + op_to_s(op) + expr->to_s() + ")";
+    return "(" + token_type_to_s(op.get_type()) + expr->to_s() + ")";
 }
 
 NodeValue UnaryOpNode::get_value() const
@@ -54,7 +54,7 @@ NodeValue UnaryOpNode::get_value() const
     return result->get_value();
 }
 
-UnaryOp UnaryOpNode::get_op() const
+Token UnaryOpNode::get_op() const
 {
     return op;
 }
@@ -64,14 +64,4 @@ ExpressionNode* UnaryOpNode::get_expr() const
     return expr;
 }
 
-String op_to_s(UnaryOp op)
-{
-    switch (op)
-    {
-    case UnaryOp::NEGATE: return "-";
-    case UnaryOp::NOT: return "!";
-    default: return "UNKNOWN";
-    }
-}
-
-}; // namespace funk
\ No newline at end of file
+}; // namespace funk
diff --git a/source/parser/Parser.cc b/source/parser/Parser.cc
index c41db9220846074f97a00ac78a854d0c25ea02af..ae664d7382f19a7a2ad1fba5397848b63e9ccf63 100644
--- a/source/parser/Parser.cc
+++ b/source/parser/Parser.cc
@@ -57,40 +57,6 @@ bool Parser::match(TokenType expected)
     return true;
 }
 
-BinaryOp Parser::to_binary_op(const Token& token) const
-{
-    switch (token.get_type())
-    {
-    case TokenType::PLUS: return BinaryOp::PLUS;
-    case TokenType::MINUS: return BinaryOp::MINUS;
-    case TokenType::MULTIPLY: return BinaryOp::MULTIPLY;
-    case TokenType::DIVIDE: return BinaryOp::DIVIDE;
-    case TokenType::MODULO: return BinaryOp::MODULO;
-    case TokenType::POWER: return BinaryOp::POWER;
-    case TokenType::EQUAL: return BinaryOp::EQUAL;
-    case TokenType::NOT_EQUAL: return BinaryOp::NOT_EQUAL;
-    case TokenType::LESS: return BinaryOp::LESS;
-    case TokenType::LESS_EQUAL: return BinaryOp::LESS_EQUAL;
-    case TokenType::GREATER: return BinaryOp::GREATER;
-    case TokenType::GREATER_EQUAL: return BinaryOp::GREATER_EQUAL;
-    case TokenType::AND: return BinaryOp::AND;
-    case TokenType::OR: return BinaryOp::OR;
-
-    default: throw SyntaxError(token.get_location(), "Invalid binary operator: " + token.get_lexeme());
-    }
-}
-
-UnaryOp Parser::to_unary_op(const Token& token) const
-{
-    switch (token.get_type())
-    {
-    case TokenType::MINUS: return UnaryOp::NEGATE;
-    case TokenType::NOT: return UnaryOp::NOT;
-
-    default: throw SyntaxError(token.get_location(), "Invalid unary operator: " + token.get_lexeme());
-    }
-}
-
 Node* Parser::parse_statement()
 {
     LOG_DEBUG("Parse statement");
@@ -120,7 +86,7 @@ Node* Parser::parse_logical_or()
     {
         Token op{peek_prev()};
         ExpressionNode* right{dynamic_cast<ExpressionNode*>(parse_logical_and())};
-        left = new BinaryOpNode(left, to_binary_op(op), right);
+        left = new BinaryOpNode(left, op, right);
     }
 
     return left;
@@ -135,7 +101,7 @@ Node* Parser::parse_logical_and()
     {
         Token op{peek_prev()};
         ExpressionNode* right{dynamic_cast<ExpressionNode*>(parse_equality())};
-        left = new BinaryOpNode(left, to_binary_op(op), right);
+        left = new BinaryOpNode(left, op, right);
     }
 
     return left;
@@ -150,7 +116,7 @@ Node* Parser::parse_equality()
     {
         Token op{peek_prev()};
         ExpressionNode* right{dynamic_cast<ExpressionNode*>(parse_comparison())};
-        left = new BinaryOpNode(left, to_binary_op(op), right);
+        left = new BinaryOpNode(left, op, right);
     }
 
     return left;
@@ -166,7 +132,7 @@ Node* Parser::parse_comparison()
     {
         Token op{peek_prev()};
         ExpressionNode* right{dynamic_cast<ExpressionNode*>(parse_additive())};
-        left = new BinaryOpNode(left, to_binary_op(op), right);
+        left = new BinaryOpNode(left, op, right);
     }
 
     return left;
@@ -181,7 +147,7 @@ Node* Parser::parse_additive()
     {
         Token op{peek_prev()};
         ExpressionNode* right{dynamic_cast<ExpressionNode*>(parse_multiplicative())};
-        left = new BinaryOpNode(left, to_binary_op(op), right);
+        left = new BinaryOpNode(left, op, right);
     }
 
     return left;
@@ -197,7 +163,7 @@ Node* Parser::parse_multiplicative()
     {
         Token op{peek_prev()};
         ExpressionNode* right{dynamic_cast<ExpressionNode*>(parse_unary())};
-        left = new BinaryOpNode(left, to_binary_op(op), right);
+        left = new BinaryOpNode(left, op, right);
     }
 
     return left;
@@ -210,7 +176,7 @@ Node* Parser::parse_unary()
     {
         Token op{peek_prev()};
         ExpressionNode* right{dynamic_cast<ExpressionNode*>(parse_factor())};
-        return new UnaryOpNode(to_unary_op(op), right);
+        return new UnaryOpNode(op, right);
     }
 
     return parse_factor();