From 56e259d7eda31e99b3fb2c0e0925dd81ea18cf79 Mon Sep 17 00:00:00 2001 From: Abdelrahman Said Date: Wed, 18 Jun 2025 22:57:52 +0100 Subject: [PATCH] Slightly improved version of the parser --- cclox_src/main.cc | 17 +++++++++++++---- cclox_src/parser/expr.cc | 20 ++++++++++++++++++++ cclox_src/parser/expr.hh | 3 +++ 3 files changed, 36 insertions(+), 4 deletions(-) diff --git a/cclox_src/main.cc b/cclox_src/main.cc index 76f035a..20bc34c 100644 --- a/cclox_src/main.cc +++ b/cclox_src/main.cc @@ -17,13 +17,22 @@ int main(int argc, char *argv[]) { // // run_interpreter(argc, argv); - ExprPtr literal = std::make_shared(ExprType::LITERAL, Literal{123}); - ExprPtr left = std::make_shared(ExprType::UNARY, Unary{Token{TokenType::MINUS, "-", Object{}, 1}, literal}); + ExprPtr left = std::make_shared( + make_expr( + Unary{ + Token{TokenType::MINUS, "-", Object{}, 1}, + std::make_shared(make_expr(Literal{123})) + } + ) + ); Token op{TokenType::STAR, "*", Object{}, 1}; - ExprPtr gliteral = std::make_shared(ExprType::LITERAL, Literal{45.67}); - ExprPtr right = std::make_shared(ExprType::GROUPING, gliteral); + ExprPtr right = std::make_shared( + make_expr( + Grouping{std::make_shared(make_expr(Literal{45.67}))} + ) + ); Expr expr = {ExprType::BINARY, Binary{left, op, right}}; diff --git a/cclox_src/parser/expr.cc b/cclox_src/parser/expr.cc index 5e3af02..e1072e6 100644 --- a/cclox_src/parser/expr.cc +++ b/cclox_src/parser/expr.cc @@ -5,6 +5,26 @@ #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 41c5fdc..cab62f5 100644 --- a/cclox_src/parser/expr.hh +++ b/cclox_src/parser/expr.hh @@ -52,6 +52,9 @@ struct Expr { Expression value; }; +template +Expr make_expr(T value); + class AstPrinter { public: std::string print(const Expr &expr);