From c4c140af36069e981cac28af0279e4ad4a3d6aa2 Mon Sep 17 00:00:00 2001 From: Roland Conybeare Date: Thu, 1 Aug 2024 16:39:01 +1000 Subject: [PATCH] xo-parser: simplify: ConvertExprAccess replaces exprstate.def_lhs_td --- include/xo/parser/parser.hpp | 9 ++++----- src/parser/parser.cpp | 27 ++++++++++++--------------- 2 files changed, 16 insertions(+), 20 deletions(-) diff --git a/include/xo/parser/parser.hpp b/include/xo/parser/parser.hpp index ccba5080..75dd22dd 100644 --- a/include/xo/parser/parser.hpp +++ b/include/xo/parser/parser.hpp @@ -7,6 +7,7 @@ #include "xo/expression/Expression.hpp" #include "xo/expression/DefineExpr.hpp" +#include "xo/expression/ConvertExpr.hpp" #include "xo/tokenizer/token.hpp" #include #include @@ -49,6 +50,7 @@ namespace xo { public: using Expression = xo::ast::Expression; using DefineExprAccess = xo::ast::DefineExprAccess; + using ConvertExprAccess = xo::ast::ConvertExprAccess; using exprtype = xo::ast::exprtype; using token_type = token; using TypeDescr = xo::reflect::TypeDescr; @@ -139,17 +141,14 @@ namespace xo { /** scaffold a define-expression here **/ rp def_expr_; + rp cvt_expr_; #ifdef OBSOLETE - /** e.g. foo in - * def foo : f64 = 1 - **/ - std::string def_lhs_symbol_; -#endif /** e.g. f64 in * def foo : f64 = 1 **/ TypeDescr def_lhs_td_ = nullptr; +#endif }; /*exprstate*/ inline std::ostream & diff --git a/src/parser/parser.cpp b/src/parser/parser.cpp index e78728d9..eef5f821 100644 --- a/src/parser/parser.cpp +++ b/src/parser/parser.cpp @@ -369,10 +369,13 @@ namespace xo { case exprstatetype::def_2: this->exs_type_ = exprstatetype::def_3; - - this->def_lhs_td_ = td; + this->cvt_expr_ = ConvertExprAccess::make(td /*dest_type*/, + nullptr /*source_expr*/); + this->def_expr_->assign_rhs(this->cvt_expr_); + //this->def_lhs_td_ = td; return; + case exprstatetype::def_3: case exprstatetype::def_4: /* NOT IMPLEMENTED */ @@ -585,17 +588,12 @@ namespace xo { */ rp rhs_value = expr.get(); - if (def_lhs_td_) - rhs_value = ConvertExpr::make(def_lhs_td_, rhs_value); + if (this->cvt_expr_) + this->cvt_expr_->assign_arg(rhs_value); + else + this->def_expr_->assign_rhs(rhs_value);; - rp def_expr = this->def_expr_; - - def_expr->assign_rhs(rhs_value); - -#ifdef OBSOLETE - rp def = DefineExpr::make(this->def_lhs_symbol_, - rhs_value); -#endif + rp def_expr = this->def_expr_; p_stack->pop_exprstate(); /* NOT KOSHER. invalidates *this */ @@ -671,9 +669,8 @@ namespace xo { exprstate::print(std::ostream & os) const { os << "short_name()); + << xtag("def_expr", def_expr_) + << xtag("cvt_expr", cvt_expr_); os << ">"; }