diff --git a/Makefile b/Makefile index 465efe9..17c05cf 100644 --- a/Makefile +++ b/Makefile @@ -13,7 +13,7 @@ CLOX_OUT = clox all: cclox clox cclox: ${CCLOX_SRC} - ${CXX} ${CFLAGS} ${CCLOX_SRC} -o ${CCLOX_OUT} + ${CXX} -std=c++20 ${CFLAGS} ${CCLOX_SRC} -o ${CCLOX_OUT} clox: ${CLOX_SRC} ${CC} ${CFLAGS} ${CLOX_SRC} -o ${CLOX_OUT} diff --git a/cclox_src/main.cc b/cclox_src/main.cc index 20bc34c..79fde3d 100644 --- a/cclox_src/main.cc +++ b/cclox_src/main.cc @@ -17,24 +17,14 @@ int main(int argc, char *argv[]) { // // run_interpreter(argc, argv); - ExprPtr left = std::make_shared( - make_expr( - Unary{ - Token{TokenType::MINUS, "-", Object{}, 1}, - std::make_shared(make_expr(Literal{123})) - } - ) - ); + Token unary_op{TokenType::MINUS, "-", Object{}, 1}; + ExprPtr left = UnaryExprPtr(unary_op, LiteralExprPtr(123)); Token op{TokenType::STAR, "*", Object{}, 1}; - ExprPtr right = std::make_shared( - make_expr( - Grouping{std::make_shared(make_expr(Literal{45.67}))} - ) - ); + ExprPtr right = GroupingExprPtr(LiteralExprPtr(45.67)); - Expr expr = {ExprType::BINARY, Binary{left, op, right}}; + Expr expr = BinaryExpr(left, op, right); AstPrinter printer{}; std::cout << printer.print(expr) << '\n'; diff --git a/cclox_src/parser/expr.cc b/cclox_src/parser/expr.cc index e1072e6..5e3af02 100644 --- a/cclox_src/parser/expr.cc +++ b/cclox_src/parser/expr.cc @@ -5,26 +5,6 @@ #include #include -template <> -Expr make_expr(Binary value) { - return Expr(ExprType::BINARY, value); -} - -template <> -Expr make_expr(Grouping value) { - return Expr(ExprType::GROUPING, value); -} - -template <> -Expr make_expr(Literal value) { - return Expr(ExprType::LITERAL, value); -} - -template <> -Expr make_expr(Unary value) { - return Expr(ExprType::UNARY, value); -} - std::string AstPrinter::print(const Expr &expr) { switch (expr.type) { case ExprType::BINARY: { diff --git a/cclox_src/parser/expr.hh b/cclox_src/parser/expr.hh index cab62f5..7e42b06 100644 --- a/cclox_src/parser/expr.hh +++ b/cclox_src/parser/expr.hh @@ -6,33 +6,55 @@ #include #include +#define BinaryExpr(LEFT, OP, RIGHT) ( \ + Expr{ \ + .type = ExprType::BINARY, \ + .value = Binary{.left = LEFT, .op = OP, .right = RIGHT} \ + } \ + ) +#define GroupingExpr(EXPR) ( \ + Expr{ \ + .type = ExprType::GROUPING, \ + .value = Grouping{.expression = EXPR} \ + } \ + ) +#define LiteralExpr(VALUE) ( \ + Expr{ \ + .type = ExprType::LITERAL, \ + .value = Literal{.value = VALUE} \ + } \ + ) +#define UnaryExpr(OP, RIGHT) ( \ + Expr{ \ + .type = ExprType::UNARY, \ + .value = Unary{.op = OP, .right = RIGHT} \ + } \ + ) + +#define BinaryExprPtr(LEFT, OP, RIGHT) (std::make_shared(BinaryExpr(LEFT, OP, RIGHT))) +#define GroupingExprPtr(EXPR) (std::make_shared(GroupingExpr(EXPR))) +#define LiteralExprPtr(VALUE) (std::make_shared(LiteralExpr(VALUE))) +#define UnaryExprPtr(OP, RIGHT) (std::make_shared(UnaryExpr(OP, RIGHT))) + struct Expr; using ExprPtr = std::shared_ptr; struct Binary { - Binary(ExprPtr left, Token op, ExprPtr right) : left{left}, op{op}, right{right} {}; - ExprPtr left; Token op; ExprPtr right; }; struct Grouping { - Grouping(ExprPtr expr) : expression{expr} {}; - ExprPtr expression; }; struct Literal { - Literal(Object value) : value{value} {}; - Object value; }; struct Unary { - Unary(Token op, ExprPtr right) : op{op}, right{right} {}; - Token op; ExprPtr right; }; @@ -47,14 +69,10 @@ enum class ExprType { using Expression = std::variant; struct Expr { - Expr(ExprType type, Expression value) : type{type}, value{value} {} ExprType type; Expression value; }; -template -Expr make_expr(T value); - class AstPrinter { public: std::string print(const Expr &expr);