xo-parser: simplify: drop exprir.expr
This commit is contained in:
parent
514a2cb687
commit
216eea9d2c
2 changed files with 5 additions and 43 deletions
|
|
@ -19,7 +19,6 @@ namespace xo {
|
||||||
|
|
||||||
empty,
|
empty,
|
||||||
symbol,
|
symbol,
|
||||||
expression,
|
|
||||||
typedescr,
|
typedescr,
|
||||||
|
|
||||||
n_exprirtype
|
n_exprirtype
|
||||||
|
|
@ -51,16 +50,12 @@ namespace xo {
|
||||||
exprir(exprirtype xir_type,
|
exprir(exprirtype xir_type,
|
||||||
const std::string & x)
|
const std::string & x)
|
||||||
: xir_type_{xir_type}, symbol_name_{x} {}
|
: xir_type_{xir_type}, symbol_name_{x} {}
|
||||||
exprir(exprirtype xir_type,
|
|
||||||
rp<Expression> expr)
|
|
||||||
: xir_type_{xir_type}, expr_{std::move(expr)} {}
|
|
||||||
exprir(exprirtype xir_type,
|
exprir(exprirtype xir_type,
|
||||||
TypeDescr td)
|
TypeDescr td)
|
||||||
: xir_type_{xir_type}, td_{td} {}
|
: xir_type_{xir_type}, td_{td} {}
|
||||||
|
|
||||||
exprirtype xir_type() const { return xir_type_; }
|
exprirtype xir_type() const { return xir_type_; }
|
||||||
const std::string & symbol_name() const { return symbol_name_; }
|
const std::string & symbol_name() const { return symbol_name_; }
|
||||||
const rp<Expression> & expr() const { return expr_; }
|
|
||||||
TypeDescr td() const { return td_; }
|
TypeDescr td() const { return td_; }
|
||||||
|
|
||||||
void print(std::ostream & os) const;
|
void print(std::ostream & os) const;
|
||||||
|
|
@ -70,8 +65,6 @@ namespace xo {
|
||||||
exprirtype xir_type_ = exprirtype::invalid;
|
exprirtype xir_type_ = exprirtype::invalid;
|
||||||
/** xir_type=symbol: a symbol (type or variable) name **/
|
/** xir_type=symbol: a symbol (type or variable) name **/
|
||||||
std::string symbol_name_;
|
std::string symbol_name_;
|
||||||
/** xir_type=expression: a completed expression **/
|
|
||||||
rp<Expression> expr_;
|
|
||||||
/** xir_type=typedescr: object identifying/describing a datatype **/
|
/** xir_type=typedescr: object identifying/describing a datatype **/
|
||||||
TypeDescr td_ = nullptr;
|
TypeDescr td_ = nullptr;
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -28,8 +28,6 @@ namespace xo {
|
||||||
return "empty";
|
return "empty";
|
||||||
case exprirtype::symbol:
|
case exprirtype::symbol:
|
||||||
return "symbol";
|
return "symbol";
|
||||||
case exprirtype::expression:
|
|
||||||
return "expression";
|
|
||||||
case exprirtype::typedescr:
|
case exprirtype::typedescr:
|
||||||
return "typedescr";
|
return "typedescr";
|
||||||
case exprirtype::n_exprirtype:
|
case exprirtype::n_exprirtype:
|
||||||
|
|
@ -43,8 +41,7 @@ namespace xo {
|
||||||
exprir::print(std::ostream & os) const {
|
exprir::print(std::ostream & os) const {
|
||||||
os << "<exprir"
|
os << "<exprir"
|
||||||
<< xtag("type", xir_type_)
|
<< xtag("type", xir_type_)
|
||||||
<< xtag("symbol_name", symbol_name_)
|
<< xtag("symbol_name", symbol_name_);
|
||||||
<< xtag("expr", expr_);
|
|
||||||
if (td_)
|
if (td_)
|
||||||
os << xtag("td", td_->short_name());
|
os << xtag("td", td_->short_name());
|
||||||
os << ">";
|
os << ">";
|
||||||
|
|
@ -576,8 +573,8 @@ namespace xo {
|
||||||
|
|
||||||
void
|
void
|
||||||
exprstate::on_exprir(const exprir & ir,
|
exprstate::on_exprir(const exprir & ir,
|
||||||
exprstatestack * p_stack,
|
exprstatestack * /*p_stack*/,
|
||||||
rp<Expression> * p_emit_expr)
|
rp<Expression> * /*p_emit_expr*/)
|
||||||
{
|
{
|
||||||
constexpr bool c_debug_flag = true;
|
constexpr bool c_debug_flag = true;
|
||||||
scope log(XO_DEBUG(c_debug_flag));
|
scope log(XO_DEBUG(c_debug_flag));
|
||||||
|
|
@ -592,11 +589,6 @@ namespace xo {
|
||||||
* parser::include_token() returns
|
* parser::include_token() returns
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if (ir.xir_type() == exprirtype::expression) {
|
|
||||||
*p_emit_expr = ir.expr();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* NOT IMPLEMENTED */
|
/* NOT IMPLEMENTED */
|
||||||
assert(false);
|
assert(false);
|
||||||
return;
|
return;
|
||||||
|
|
@ -619,31 +611,8 @@ namespace xo {
|
||||||
assert(false);
|
assert(false);
|
||||||
return;
|
return;
|
||||||
case exprstatetype::def_4:
|
case exprstatetype::def_4:
|
||||||
/* have all the ingredients to create an expression
|
assert(false);
|
||||||
* representing a definition
|
return;
|
||||||
*
|
|
||||||
* 1. if ir_type is a symbol, interpret as variable name.
|
|
||||||
* Need to be able to locate variable by type
|
|
||||||
* 2. if ir_type is an expression, adopt as rhs
|
|
||||||
*/
|
|
||||||
if (ir.xir_type() == exprirtype::expression) {
|
|
||||||
/* TODO: do something with def_lhs_td */
|
|
||||||
|
|
||||||
rp<Expression> rhs_value = ir.expr();
|
|
||||||
|
|
||||||
if (def_lhs_td_)
|
|
||||||
rhs_value = ConvertExpr::make(def_lhs_td_, rhs_value);
|
|
||||||
|
|
||||||
rp<Expression> def = DefineExpr::make(this->def_lhs_symbol_,
|
|
||||||
rhs_value);
|
|
||||||
|
|
||||||
p_stack->pop_exprstate();
|
|
||||||
return p_stack->top_exprstate().on_expr(def,
|
|
||||||
p_stack, p_emit_expr);
|
|
||||||
} else {
|
|
||||||
assert(false);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
case exprstatetype::expect_rhs_expression:
|
case exprstatetype::expect_rhs_expression:
|
||||||
case exprstatetype::expect_type:
|
case exprstatetype::expect_type:
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue