From 2d40b9337c5f9a02b16cea551e84faddebebce83 Mon Sep 17 00:00:00 2001 From: CHatingPython Date: Fri, 7 Aug 2026 11:23:16 +0200 Subject: [PATCH] feat(furc/AST): add binary and unary operations --- furc/include/furc/front/ast.hpp | 56 +++++++++++++++++++++++++++++++ furc/include/furc/front/token.hpp | 6 ++++ 2 files changed, 62 insertions(+) diff --git a/furc/include/furc/front/ast.hpp b/furc/include/furc/front/ast.hpp index e49ea38..830d0e0 100644 --- a/furc/include/furc/front/ast.hpp +++ b/furc/include/furc/front/ast.hpp @@ -102,6 +102,9 @@ class expr_node : public stmt_node { public: enum expr_type_e { Literal, + + BinaryOp, + UnaryOp, }; public: category_e category() const override { return ast_node_cat::Expression; } @@ -111,6 +114,59 @@ public: virtual expr_type_e expr_type() const = 0; }; +struct binary_op_expr_node final : public expr_node { + enum binary_op_type { + Add = 0, + Sub, + Mul, + Div, + Mod, + + Shl, + Shr, + BinAnd, + BinOr, + BinXor, + And, + Or, + + Equals, + NotEquals, + LessThan, + LessEquals, + GreaterThan, + GreaterEquals, + }; + + expr_type_e expr_type() const override { return BinaryOp; } + + expr_node* lhs; + expr_node* rhs; + binary_op_type type; +}; + +struct unary_op_expr_node final : public expr_node { + enum unary_op_type { + Positive = 0, + Negative, + PreInc, + PreDec, + PostInc, + PostDec, + BinNot, + Not, + + Sizeof, + Pointerof, + Lengthof, + }; + + expr_type_e expr_type() const override { return UnaryOp; } + + expr_node* lhs; + unary_op_type type; +}; + class lit_node : public expr_node { public: enum lit_type_e { diff --git a/furc/include/furc/front/token.hpp b/furc/include/furc/front/token.hpp index ff896ca..79350e0 100644 --- a/furc/include/furc/front/token.hpp +++ b/furc/include/furc/front/token.hpp @@ -31,6 +31,8 @@ struct token { Star, /**< `*` */ Slash, /**< `/` */ Percent, /**< `%` */ + DblLT, /**< `<<` */ + DblGT, /**< `>>` */ Ampersand, /**< `&` */ Pipe, /**< `|` */ Hat, /**< `^` */ @@ -39,6 +41,7 @@ struct token { DblPlus, /**< `++` */ DblMinus, /**< `--` */ + Tilde, /**< `~` */ ExMark, /**< `!` */ CatEars, /**< `^^` */ @@ -144,6 +147,8 @@ struct token { case token::Star: return os << "*"; case token::Slash: return os << "/"; case token::Percent: return os << "%"; + case token::DblLT: return os << "<<"; + case token::DblGT: return os << ">>"; case token::Ampersand: return os << "&"; case token::Pipe: return os << "|"; case token::Hat: return os << "^"; @@ -151,6 +156,7 @@ struct token { case token::DblPipe: return os << "||"; case token::DblPlus: return os << "++"; case token::DblMinus: return os << "--"; + case token::Tilde: return os << "~"; case token::ExMark: return os << "!"; case token::CatEars: return os << "^^"; case token::Equals: return os << "=";