From 9a42f02f0c119d6c98e70f0c5c4cbeaaa52e5a54 Mon Sep 17 00:00:00 2001 From: Roland Conybeare Date: Sun, 18 Aug 2024 23:53:06 -0400 Subject: [PATCH] xo-reader: refactor: simplify expect_expr_xs api --- include/xo/reader/expect_expr_xs.hpp | 3 ++- src/reader/define_xs.cpp | 2 +- src/reader/expect_expr_xs.cpp | 9 +++++++-- src/reader/lambda_xs.cpp | 2 +- src/reader/progress_xs.cpp | 8 ++++---- 5 files changed, 15 insertions(+), 9 deletions(-) diff --git a/include/xo/reader/expect_expr_xs.hpp b/include/xo/reader/expect_expr_xs.hpp index 740eecc8..85686d96 100644 --- a/include/xo/reader/expect_expr_xs.hpp +++ b/include/xo/reader/expect_expr_xs.hpp @@ -17,7 +17,7 @@ namespace xo { public: expect_expr_xs(); - static std::unique_ptr expect_rhs_expression(); + static void start(exprstatestack * p_stack); virtual void on_lambda_token(const token_type & tk, exprstatestack * p_stack, @@ -40,6 +40,7 @@ namespace xo { rp * p_emit_expr) override; private: + static std::unique_ptr make(); }; } /*namespace scm*/ diff --git a/src/reader/define_xs.cpp b/src/reader/define_xs.cpp index 96514b97..20ffbd40 100644 --- a/src/reader/define_xs.cpp +++ b/src/reader/define_xs.cpp @@ -174,7 +174,7 @@ namespace xo { { this->defxs_type_ = defexprstatetype::def_5; - p_stack->push_exprstate(expect_expr_xs::expect_rhs_expression()); + expect_expr_xs::start(p_stack); } else { this->illegal_input_error(self_name, tk); } diff --git a/src/reader/expect_expr_xs.cpp b/src/reader/expect_expr_xs.cpp index fe4a1830..edc67357 100644 --- a/src/reader/expect_expr_xs.cpp +++ b/src/reader/expect_expr_xs.cpp @@ -16,11 +16,16 @@ namespace xo { namespace scm { std::unique_ptr - expect_expr_xs::expect_rhs_expression() { + expect_expr_xs::make() { return std::make_unique(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() : exprstate(exprstatetype::expect_rhs_expression) {} @@ -53,7 +58,7 @@ namespace xo { /* push lparen_0 to remember to look for subsequent rightparen. */ 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 diff --git a/src/reader/lambda_xs.cpp b/src/reader/lambda_xs.cpp index d6b1eec1..82b91ae2 100644 --- a/src/reader/lambda_xs.cpp +++ b/src/reader/lambda_xs.cpp @@ -37,7 +37,7 @@ namespace xo { if (lmxs_type_ == lambdastatetype::lm_1) { this->lmxs_type_ = lambdastatetype::lm_2; this->argl_ = argl; - p_stack->push_exprstate(expect_expr_xs::expect_rhs_expression()); + expect_expr_xs::start(p_stack); } else { exprstate::on_formal_arglist(argl, p_stack, p_emit_expr); } diff --git a/src/reader/progress_xs.cpp b/src/reader/progress_xs.cpp index 421524a2..93862147 100644 --- a/src/reader/progress_xs.cpp +++ b/src/reader/progress_xs.cpp @@ -312,7 +312,7 @@ namespace xo { this->op_type_ = tk2op(tk.tk_type()); /* 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_) { /* already have complete expression stashed. * 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)); /* 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 { /* e.g. * 6.2 + 4.9 * ... @@ -360,9 +360,9 @@ namespace xo { /* 1. replace with nested incomplete infix exprs */ 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(expect_expr_xs::expect_rhs_expression()); + expect_expr_xs::start(p_stack); } } else {