xo-parser: refactor: exprstate::on_symbol splits symbol from exprir

This commit is contained in:
Roland Conybeare 2024-08-01 13:32:15 +10:00
commit 44fdba132c
2 changed files with 52 additions and 12 deletions

View file

@ -47,15 +47,17 @@ namespace xo {
public:
exprir() = default;
#ifdef OBSOLETE
exprir(exprirtype xir_type,
const std::string & x)
: xir_type_{xir_type}, symbol_name_{x} {}
#endif
exprir(exprirtype xir_type,
TypeDescr td)
: xir_type_{xir_type}, td_{td} {}
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_; }
TypeDescr td() const { return td_; }
void print(std::ostream & os) const;
@ -63,8 +65,10 @@ namespace xo {
private:
/** IR type code **/
exprirtype xir_type_ = exprirtype::invalid;
#ifdef OBSOLETE
/** xir_type=symbol: a symbol (type or variable) name **/
std::string symbol_name_;
#endif
/** xir_type=typedescr: object identifying/describing a datatype **/
TypeDescr td_ = nullptr;
};
@ -220,6 +224,10 @@ namespace xo {
void on_expr(ref::brw<Expression> expr,
exprstatestack * p_stack,
rp<Expression> * p_emit_expr);
/** update exprstate when expecting a symbol **/
void on_symbol(const std::string & symbol,
exprstatestack * p_stack,
rp<Expression> * p_emit_expr);
/** update exprstate in response to IR (intermediate representation)
* from nested parsing task
**/

View file

@ -40,8 +40,8 @@ namespace xo {
void
exprir::print(std::ostream & os) const {
os << "<exprir"
<< xtag("type", xir_type_)
<< xtag("symbol_name", symbol_name_);
<< xtag("type", xir_type_);
//<< xtag("symbol_name", symbol_name_);
if (td_)
os << xtag("td", td_->short_name());
os << ">";
@ -310,8 +310,8 @@ namespace xo {
/* have to do pop first */
p_stack->pop_exprstate();
p_stack->top_exprstate().on_exprir(exprir(exprirtype::symbol, tk.text()), p_stack, p_emit_expr);
//return expraction::pop(exprir(exprirtype::symbol, tk.text()));
p_stack->top_exprstate().on_symbol(tk.text(),
p_stack, p_emit_expr);
return;
case exprstatetype::expect_type: {
@ -572,15 +572,10 @@ namespace xo {
}
void
exprstate::on_exprir(const exprir & ir,
exprstate::on_symbol(const std::string & symbol_name,
exprstatestack * /*p_stack*/,
rp<Expression> * /*p_emit_expr*/)
{
constexpr bool c_debug_flag = true;
scope log(XO_DEBUG(c_debug_flag));
log && log(xtag("ir", ir));
log && log(xtag("state", *this));
switch(this->exs_type_) {
case exprstatetype::expect_toplevel_expression_sequence:
/* toplevel expression sequence accepts an
@ -594,9 +589,46 @@ namespace xo {
return;
case exprstatetype::def_0:
this->exs_type_ = exprstatetype::def_1;
this->def_lhs_symbol_ = ir.symbol_name();
this->def_lhs_symbol_ = symbol_name;
return;
case exprstatetype::def_1:
case exprstatetype::def_2:
case exprstatetype::def_3:
case exprstatetype::def_4:
/* NOT IMPLEMENTED */
assert(false);
return;
case exprstatetype::expect_rhs_expression:
case exprstatetype::expect_type:
case exprstatetype::expect_symbol:
/* unreachable
* (this exprstate issues pop instruction from exprstate::on_input()
*/
assert(false);
return;
case exprstatetype::invalid:
case exprstatetype::n_exprstatetype:
/* unreachable */
assert(false);
return;
}
}
void
exprstate::on_exprir(const exprir & ir,
exprstatestack * /*p_stack*/,
rp<Expression> * /*p_emit_expr*/)
{
constexpr bool c_debug_flag = true;
scope log(XO_DEBUG(c_debug_flag));
log && log(xtag("ir", ir));
log && log(xtag("state", *this));
switch(this->exs_type_) {
case exprstatetype::expect_toplevel_expression_sequence:
case exprstatetype::def_0:
case exprstatetype::def_1:
/* NOT IMPLEMENTED */
assert(false);