xo-parser: simplify: ConvertExprAccess replaces exprstate.def_lhs_td
This commit is contained in:
parent
4e9b41645f
commit
c4c140af36
2 changed files with 16 additions and 20 deletions
|
|
@ -7,6 +7,7 @@
|
||||||
|
|
||||||
#include "xo/expression/Expression.hpp"
|
#include "xo/expression/Expression.hpp"
|
||||||
#include "xo/expression/DefineExpr.hpp"
|
#include "xo/expression/DefineExpr.hpp"
|
||||||
|
#include "xo/expression/ConvertExpr.hpp"
|
||||||
#include "xo/tokenizer/token.hpp"
|
#include "xo/tokenizer/token.hpp"
|
||||||
#include <stack>
|
#include <stack>
|
||||||
#include <stdexcept>
|
#include <stdexcept>
|
||||||
|
|
@ -49,6 +50,7 @@ namespace xo {
|
||||||
public:
|
public:
|
||||||
using Expression = xo::ast::Expression;
|
using Expression = xo::ast::Expression;
|
||||||
using DefineExprAccess = xo::ast::DefineExprAccess;
|
using DefineExprAccess = xo::ast::DefineExprAccess;
|
||||||
|
using ConvertExprAccess = xo::ast::ConvertExprAccess;
|
||||||
using exprtype = xo::ast::exprtype;
|
using exprtype = xo::ast::exprtype;
|
||||||
using token_type = token<char>;
|
using token_type = token<char>;
|
||||||
using TypeDescr = xo::reflect::TypeDescr;
|
using TypeDescr = xo::reflect::TypeDescr;
|
||||||
|
|
@ -139,17 +141,14 @@ namespace xo {
|
||||||
|
|
||||||
/** scaffold a define-expression here **/
|
/** scaffold a define-expression here **/
|
||||||
rp<DefineExprAccess> def_expr_;
|
rp<DefineExprAccess> def_expr_;
|
||||||
|
rp<ConvertExprAccess> cvt_expr_;
|
||||||
|
|
||||||
#ifdef OBSOLETE
|
#ifdef OBSOLETE
|
||||||
/** e.g. foo in
|
|
||||||
* def foo : f64 = 1
|
|
||||||
**/
|
|
||||||
std::string def_lhs_symbol_;
|
|
||||||
#endif
|
|
||||||
/** e.g. f64 in
|
/** e.g. f64 in
|
||||||
* def foo : f64 = 1
|
* def foo : f64 = 1
|
||||||
**/
|
**/
|
||||||
TypeDescr def_lhs_td_ = nullptr;
|
TypeDescr def_lhs_td_ = nullptr;
|
||||||
|
#endif
|
||||||
}; /*exprstate*/
|
}; /*exprstate*/
|
||||||
|
|
||||||
inline std::ostream &
|
inline std::ostream &
|
||||||
|
|
|
||||||
|
|
@ -369,10 +369,13 @@ namespace xo {
|
||||||
|
|
||||||
case exprstatetype::def_2:
|
case exprstatetype::def_2:
|
||||||
this->exs_type_ = exprstatetype::def_3;
|
this->exs_type_ = exprstatetype::def_3;
|
||||||
|
this->cvt_expr_ = ConvertExprAccess::make(td /*dest_type*/,
|
||||||
this->def_lhs_td_ = td;
|
nullptr /*source_expr*/);
|
||||||
|
this->def_expr_->assign_rhs(this->cvt_expr_);
|
||||||
|
//this->def_lhs_td_ = td;
|
||||||
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
case exprstatetype::def_3:
|
case exprstatetype::def_3:
|
||||||
case exprstatetype::def_4:
|
case exprstatetype::def_4:
|
||||||
/* NOT IMPLEMENTED */
|
/* NOT IMPLEMENTED */
|
||||||
|
|
@ -585,17 +588,12 @@ namespace xo {
|
||||||
*/
|
*/
|
||||||
rp<Expression> rhs_value = expr.get();
|
rp<Expression> rhs_value = expr.get();
|
||||||
|
|
||||||
if (def_lhs_td_)
|
if (this->cvt_expr_)
|
||||||
rhs_value = ConvertExpr::make(def_lhs_td_, rhs_value);
|
this->cvt_expr_->assign_arg(rhs_value);
|
||||||
|
else
|
||||||
|
this->def_expr_->assign_rhs(rhs_value);;
|
||||||
|
|
||||||
rp<DefineExprAccess> def_expr = this->def_expr_;
|
rp<Expression> 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
|
|
||||||
|
|
||||||
p_stack->pop_exprstate(); /* NOT KOSHER. invalidates *this */
|
p_stack->pop_exprstate(); /* NOT KOSHER. invalidates *this */
|
||||||
|
|
||||||
|
|
@ -671,9 +669,8 @@ namespace xo {
|
||||||
exprstate::print(std::ostream & os) const {
|
exprstate::print(std::ostream & os) const {
|
||||||
os << "<exprstate"
|
os << "<exprstate"
|
||||||
<< xtag("type", exs_type_)
|
<< xtag("type", exs_type_)
|
||||||
<< xtag("def_expr", def_expr_);
|
<< xtag("def_expr", def_expr_)
|
||||||
if (def_lhs_td_)
|
<< xtag("cvt_expr", cvt_expr_);
|
||||||
os << xtag("def_lhs_td", def_lhs_td_->short_name());
|
|
||||||
os << ">";
|
os << ">";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue