From e205d6744321d26c87ffbf9b2862bc0118c808a1 Mon Sep 17 00:00:00 2001 From: CHatingPython Date: Tue, 26 May 2026 14:32:12 +0200 Subject: [PATCH] Introduce binop_expression_node Signed-off-by: CHatingPython --- furc/include/furc/ast/expression.hpp | 35 +++++++++++++++++++++++++++- furc/src/ast.cpp | 19 +++++++++++++++ 2 files changed, 53 insertions(+), 1 deletion(-) diff --git a/furc/include/furc/ast/expression.hpp b/furc/include/furc/ast/expression.hpp index 059a1d6..195cd35 100644 --- a/furc/include/furc/ast/expression.hpp +++ b/furc/include/furc/ast/expression.hpp @@ -8,7 +8,8 @@ namespace furc { namespace ast { enum class expression_node_t { - Literal + Literal, + Binop }; class expression_node : public statement_node { @@ -22,6 +23,38 @@ protected: bool equal(const node& rhs) const override; }; +using expression_node_h = node_handle; + +enum class binop_expression_node_t { + Add, + Sub, + Mul, + Div, + Mod, +}; + +class binop_expression_node : public expression_node { +public: + binop_expression_node(binop_expression_node_t type, expression_node_h&& lhs, expression_node_h&& rhs) + : m_type(type), m_lhs(std::move(lhs)), m_rhs(std::move(rhs)) {} + + binop_expression_node_t type() const { return m_type; }; + const expression_node_h& lhs() const { return m_lhs; }; + const expression_node_h& rhs() const { return m_rhs; }; +public: + expression_node_t expression_type() const override { return expression_node_t::Binop; } + + std::ostream& print(std::ostream& os) const override; +protected: + bool equal(const node& rhs) const override; +private: + binop_expression_node_t m_type; + expression_node_h m_lhs; + expression_node_h m_rhs; +}; + +using binop_expression_node_h = node_handle; + } // namespace ast } // namespace furc diff --git a/furc/src/ast.cpp b/furc/src/ast.cpp index e4e0720..3fb956c 100644 --- a/furc/src/ast.cpp +++ b/furc/src/ast.cpp @@ -34,6 +34,25 @@ bool expression_node::equal(const node& rhs) const { return expression_type() == reinterpret_cast(rhs).expression_type(); } +std::ostream& operator<<(std::ostream& os, binop_expression_node_t type) { + switch (type) { + case binop_expression_node_t::Add: return os << '+'; + case binop_expression_node_t::Sub: return os << '-'; + case binop_expression_node_t::Mul: return os << '*'; + case binop_expression_node_t::Div: return os << '/'; + case binop_expression_node_t::Mod: return os << '%'; + } +} + +std::ostream& binop_expression_node::print(std::ostream& os) const { + return os << *m_lhs << ' ' << m_type << ' ' << *m_rhs; +} + +bool binop_expression_node::equal(const node& rhsNode) const { + const auto& rhs = reinterpret_cast(rhsNode); + return expression_node::equal(rhsNode) && m_type == rhs.m_type && m_lhs == rhs.m_lhs && m_rhs == rhs.m_rhs; +} + bool declaration_node::equal(const node& rhs) const { return declaration_type() == reinterpret_cast(rhs).declaration_type(); }