xo-reader: refactor: simplify expect_expr_xs api

This commit is contained in:
Roland Conybeare 2024-08-18 23:53:06 -04:00
commit 9a42f02f0c
5 changed files with 15 additions and 9 deletions

View file

@ -17,7 +17,7 @@ namespace xo {
public: public:
expect_expr_xs(); expect_expr_xs();
static std::unique_ptr<expect_expr_xs> expect_rhs_expression(); static void start(exprstatestack * p_stack);
virtual void on_lambda_token(const token_type & tk, virtual void on_lambda_token(const token_type & tk,
exprstatestack * p_stack, exprstatestack * p_stack,
@ -40,6 +40,7 @@ namespace xo {
rp<Expression> * p_emit_expr) override; rp<Expression> * p_emit_expr) override;
private: private:
static std::unique_ptr<expect_expr_xs> make();
}; };
} /*namespace scm*/ } /*namespace scm*/

View file

@ -174,7 +174,7 @@ namespace xo {
{ {
this->defxs_type_ = defexprstatetype::def_5; this->defxs_type_ = defexprstatetype::def_5;
p_stack->push_exprstate(expect_expr_xs::expect_rhs_expression()); expect_expr_xs::start(p_stack);
} else { } else {
this->illegal_input_error(self_name, tk); this->illegal_input_error(self_name, tk);
} }

View file

@ -16,11 +16,16 @@ namespace xo {
namespace scm { namespace scm {
std::unique_ptr<expect_expr_xs> std::unique_ptr<expect_expr_xs>
expect_expr_xs::expect_rhs_expression() { expect_expr_xs::make() {
return std::make_unique<expect_expr_xs>(expect_expr_xs()); return std::make_unique<expect_expr_xs>(expect_expr_xs());
} }
void
expect_expr_xs::start(exprstatestack * p_stack) {
p_stack->push_exprstate(expect_expr_xs::make());
}
expect_expr_xs::expect_expr_xs() expect_expr_xs::expect_expr_xs()
: exprstate(exprstatetype::expect_rhs_expression) : exprstate(exprstatetype::expect_rhs_expression)
{} {}
@ -53,7 +58,7 @@ namespace xo {
/* push lparen_0 to remember to look for subsequent rightparen. */ /* push lparen_0 to remember to look for subsequent rightparen. */
p_stack->push_exprstate(paren_xs::lparen_0()); p_stack->push_exprstate(paren_xs::lparen_0());
p_stack->push_exprstate(expect_expr_xs::expect_rhs_expression()); expect_expr_xs::start(p_stack);
} }
void void

View file

@ -37,7 +37,7 @@ namespace xo {
if (lmxs_type_ == lambdastatetype::lm_1) { if (lmxs_type_ == lambdastatetype::lm_1) {
this->lmxs_type_ = lambdastatetype::lm_2; this->lmxs_type_ = lambdastatetype::lm_2;
this->argl_ = argl; this->argl_ = argl;
p_stack->push_exprstate(expect_expr_xs::expect_rhs_expression()); expect_expr_xs::start(p_stack);
} else { } else {
exprstate::on_formal_arglist(argl, p_stack, p_emit_expr); exprstate::on_formal_arglist(argl, p_stack, p_emit_expr);
} }

View file

@ -312,7 +312,7 @@ namespace xo {
this->op_type_ = tk2op(tk.tk_type()); this->op_type_ = tk2op(tk.tk_type());
/* infix operator must be followed by non-empty expression */ /* infix operator must be followed by non-empty expression */
p_stack->push_exprstate(expect_expr_xs::expect_rhs_expression()); expect_expr_xs::start(p_stack);
} else if (rhs_) { } else if (rhs_) {
/* already have complete expression stashed. /* already have complete expression stashed.
* behavior depends on operator precedence for tk with stored operator * behavior depends on operator precedence for tk with stored operator
@ -341,7 +341,7 @@ namespace xo {
p_stack->push_exprstate(progress_xs::make(expr, op2)); p_stack->push_exprstate(progress_xs::make(expr, op2));
/* infix operator must be followed by non-empty expression */ /* infix operator must be followed by non-empty expression */
p_stack->push_exprstate(expect_expr_xs::expect_rhs_expression()); expect_expr_xs::start(p_stack);
} else { } else {
/* e.g. /* e.g.
* 6.2 + 4.9 * ... * 6.2 + 4.9 * ...
@ -360,9 +360,9 @@ namespace xo {
/* 1. replace with nested incomplete infix exprs */ /* 1. replace with nested incomplete infix exprs */
p_stack->push_exprstate(progress_xs::make(lhs_, op_type_)); p_stack->push_exprstate(progress_xs::make(lhs_, op_type_));
p_stack->push_exprstate(expect_expr_xs::expect_rhs_expression()); expect_expr_xs::start(p_stack);
p_stack->push_exprstate(progress_xs::make(rhs_, op2)); p_stack->push_exprstate(progress_xs::make(rhs_, op2));
p_stack->push_exprstate(expect_expr_xs::expect_rhs_expression()); expect_expr_xs::start(p_stack);
} }
} else { } else {