xo-parser: simplify: ConvertExprAccess replaces exprstate.def_lhs_td

This commit is contained in:
Roland Conybeare 2024-08-01 16:39:01 +10:00
commit c4c140af36
2 changed files with 16 additions and 20 deletions

View file

@ -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 <stack>
#include <stdexcept>
@ -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<char>;
using TypeDescr = xo::reflect::TypeDescr;
@ -139,17 +141,14 @@ namespace xo {
/** scaffold a define-expression here **/
rp<DefineExprAccess> def_expr_;
rp<ConvertExprAccess> 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 &

View file

@ -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<Expression> 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<DefineExprAccess> def_expr = this->def_expr_;
def_expr->assign_rhs(rhs_value);
#ifdef OBSOLETE
rp<Expression> def = DefineExpr::make(this->def_lhs_symbol_,
rhs_value);
#endif
rp<Expression> 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 << "<exprstate"
<< xtag("type", exs_type_)
<< xtag("def_expr", def_expr_);
if (def_lhs_td_)
os << xtag("def_lhs_td", def_lhs_td_->short_name());
<< xtag("def_expr", def_expr_)
<< xtag("cvt_expr", cvt_expr_);
os << ">";
}