From 4efd7f25e8b6435dd30bf2dabaf2af751a4dab9c Mon Sep 17 00:00:00 2001 From: ZhuangYumin Date: Mon, 6 Nov 2023 15:25:53 +0800 Subject: [PATCH] upd: finish Prework --- Prework/calc.h | 107 +++++++++++++++++++++++++++++++++++++++++++++-- Prework/test.cpp | 4 +- 2 files changed, 105 insertions(+), 6 deletions(-) diff --git a/Prework/calc.h b/Prework/calc.h index c98573e..024cbbd 100644 --- a/Prework/calc.h +++ b/Prework/calc.h @@ -3,7 +3,106 @@ #include "visitor.h" -struct calculator : visitor { - /// TODO: 完成所有需求 - ~calculator() override = default; -}; +struct calculator : visitor +{ + /// TODO: 完成所有需求 + ~calculator() override = default; + std::any visit_num(num_node *ctx) override + { + // 处理 num_node 节点的逻辑 + long long *p_long_long = std::any_cast(&ctx->number); + double *p_double = std::any_cast(&ctx->number); + std::any res; + if (p_long_long != nullptr) + res = std::any((long long)*p_long_long); + else if (p_double != nullptr) + res = std::any((double)*p_double); + else + res = std::any((long long)0); + return res; + } + + std::any visit_add(add_node *ctx) override + { + // 处理 add_node 节点的逻辑 + std::any l_res = this->visit(ctx->lnode); + std::any r_res = this->visit(ctx->rnode); + long long *p_l_long_long = std::any_cast(&l_res); + long long *p_r_long_long = std::any_cast(&r_res); + double *p_l_double = std::any_cast(&l_res); + double *p_r_double = std::any_cast(&r_res); + if((p_l_long_long!=nullptr)&&(p_r_long_long!=nullptr)) + return std::any((long long)(*p_l_long_long + *p_r_long_long)); + else if((p_l_double!=nullptr)&&(p_r_double!=nullptr)) + return std::any((double)(*p_l_double + *p_r_double)); + else if((p_l_long_long!=nullptr)&&(p_r_double!=nullptr)) + return std::any((double)(*p_l_long_long + *p_r_double)); + else if((p_l_double!=nullptr)&&(p_r_long_long!=nullptr)) + return std::any((double)(*p_l_double + *p_r_long_long)); + else + return std::any((long long)0); + } + + std::any visit_sub(sub_node *ctx) override + { + // 处理 sub_node 节点的逻辑 + std::any l_res = this->visit(ctx->lnode); + std::any r_res = this->visit(ctx->rnode); + long long *p_l_long_long = std::any_cast(&l_res); + long long *p_r_long_long = std::any_cast(&r_res); + double *p_l_double = std::any_cast(&l_res); + double *p_r_double = std::any_cast(&r_res); + if((p_l_long_long!=nullptr)&&(p_r_long_long!=nullptr)) + return std::any((long long)(*p_l_long_long - *p_r_long_long)); + else if((p_l_double!=nullptr)&&(p_r_double!=nullptr)) + return std::any((double)(*p_l_double - *p_r_double)); + else if((p_l_long_long!=nullptr)&&(p_r_double!=nullptr)) + return std::any((double)(*p_l_long_long - *p_r_double)); + else if((p_l_double!=nullptr)&&(p_r_long_long!=nullptr)) + return std::any((double)(*p_l_double - *p_r_long_long)); + else + return std::any((long long)0); + } + + std::any visit_mul(mul_node *ctx) override + { + // 处理 mul_node 节点的逻辑 + std::any l_res = this->visit(ctx->lnode); + std::any r_res = this->visit(ctx->rnode); + long long *p_l_long_long = std::any_cast(&l_res); + long long *p_r_long_long = std::any_cast(&r_res); + double *p_l_double = std::any_cast(&l_res); + double *p_r_double = std::any_cast(&r_res); + if((p_l_long_long!=nullptr)&&(p_r_long_long!=nullptr)) + return std::any((long long)(*p_l_long_long * *p_r_long_long)); + else if((p_l_double!=nullptr)&&(p_r_double!=nullptr)) + return std::any((double)(*p_l_double * *p_r_double)); + else if((p_l_long_long!=nullptr)&&(p_r_double!=nullptr)) + return std::any((double)(*p_l_long_long * *p_r_double)); + else if((p_l_double!=nullptr)&&(p_r_long_long!=nullptr)) + return std::any((double)(*p_l_double * *p_r_long_long)); + else + return std::any((long long)0); + } + + std::any visit_div(div_node *ctx) override + { + // 处理 div_node 节点的逻辑 + std::any l_res = this->visit(ctx->lnode); + std::any r_res = this->visit(ctx->rnode); + long long *p_l_long_long = std::any_cast(&l_res); + long long *p_r_long_long = std::any_cast(&r_res); + double *p_l_double = std::any_cast(&l_res); + double *p_r_double = std::any_cast(&r_res); + if((p_l_long_long!=nullptr)&&(p_r_long_long!=nullptr)) + return std::any((long long)(*p_l_long_long / *p_r_long_long)); + else if((p_l_double!=nullptr)&&(p_r_double!=nullptr)) + return std::any((double)(*p_l_double / *p_r_double)); + else if((p_l_long_long!=nullptr)&&(p_r_double!=nullptr)) + return std::any((double)(*p_l_long_long / *p_r_double)); + else if((p_l_double!=nullptr)&&(p_r_long_long!=nullptr)) + return std::any((double)(*p_l_double / *p_r_long_long)); + else + return std::any((long long)0); + } +}; \ No newline at end of file diff --git a/Prework/test.cpp b/Prework/test.cpp index ddb0a6b..d758d82 100644 --- a/Prework/test.cpp +++ b/Prework/test.cpp @@ -8,7 +8,7 @@ node *generate(int); // Expected: 17711 signed main() { - node *root = generate(20); + node *root = generate(3); visitor *calc = new calculator; auto result = calc->visit(root); if (auto value = std::any_cast (&result)) { @@ -18,7 +18,7 @@ signed main() { } return 0; } - + // 生成器,小孩子不懂写着玩的 node *generate(int depth) {