diff --git a/include/xo/reader/define_xs.hpp b/include/xo/reader/define_xs.hpp index 50c76da5..ebb7b161 100644 --- a/include/xo/reader/define_xs.hpp +++ b/include/xo/reader/define_xs.hpp @@ -75,8 +75,7 @@ namespace xo { defexprstatetype defxs_type() const { return defxs_type_; } virtual void on_expr(ref::brw expr, - exprstatestack * p_stack, - rp * p_emit_expr) override; + parserstatemachine * p_psm) override; virtual void on_symbol(const std::string & symbol_name, parserstatemachine * p_psm) override; virtual void on_typedescr(TypeDescr td, diff --git a/include/xo/reader/expect_expr_xs.hpp b/include/xo/reader/expect_expr_xs.hpp index 3808e7bc..90477c72 100644 --- a/include/xo/reader/expect_expr_xs.hpp +++ b/include/xo/reader/expect_expr_xs.hpp @@ -33,8 +33,7 @@ namespace xo { /** update exprstate in response to a successfully-parsed subexpression **/ virtual void on_expr(ref::brw expr, - exprstatestack * p_stack, - rp * p_emit_expr) override; + parserstatemachine * p_psm) override; private: static std::unique_ptr make(); diff --git a/include/xo/reader/exprseq_xs.hpp b/include/xo/reader/exprseq_xs.hpp index 2d2cec7b..e1808a15 100644 --- a/include/xo/reader/exprseq_xs.hpp +++ b/include/xo/reader/exprseq_xs.hpp @@ -33,8 +33,7 @@ namespace xo { virtual void on_typedescr(TypeDescr td, parserstatemachine * p_psm) override; virtual void on_expr(ref::brw expr, - exprstatestack * p_stack, - rp * p_emit_expr) override; + parserstatemachine * p_psm) override; private: static std::unique_ptr make(); diff --git a/include/xo/reader/exprstate.hpp b/include/xo/reader/exprstate.hpp index 0f9362ab..d2c58d67 100644 --- a/include/xo/reader/exprstate.hpp +++ b/include/xo/reader/exprstate.hpp @@ -95,8 +95,7 @@ namespace xo { /** update exprstate in response to a successfully-parsed subexpression **/ virtual void on_expr(ref::brw expr, - exprstatestack * p_stack, - rp * p_emit_expr); + parserstatemachine * p_psm); /** update exprstate when expecting a symbol **/ virtual void on_symbol(const std::string & symbol, diff --git a/include/xo/reader/lambda_xs.hpp b/include/xo/reader/lambda_xs.hpp index b60f14a6..5ad0adfb 100644 --- a/include/xo/reader/lambda_xs.hpp +++ b/include/xo/reader/lambda_xs.hpp @@ -47,8 +47,7 @@ namespace xo { virtual void on_formal_arglist(const std::vector> & argl, parserstatemachine * p_psm) override; virtual void on_expr(ref::brw expr, - exprstatestack * p_stack, - rp * p_emit_expr) override; + parserstatemachine * p_psm) override; virtual void on_semicolon_token(const token_type & tk, parserstatemachine * p_psm) override; diff --git a/include/xo/reader/paren_xs.hpp b/include/xo/reader/paren_xs.hpp index a45a516a..0fd6bf86 100644 --- a/include/xo/reader/paren_xs.hpp +++ b/include/xo/reader/paren_xs.hpp @@ -35,8 +35,7 @@ namespace xo { bool admits_rightparen() const; virtual void on_expr(ref::brw expr, - exprstatestack * p_stack, - rp * p_emit_expr) override; + parserstatemachine * p_psm) override; virtual void on_symbol(const std::string & symbol, parserstatemachine * p_psm) override; virtual void on_typedescr(TypeDescr td, diff --git a/include/xo/reader/progress_xs.hpp b/include/xo/reader/progress_xs.hpp index 92f3df04..6436b117 100644 --- a/include/xo/reader/progress_xs.hpp +++ b/include/xo/reader/progress_xs.hpp @@ -56,8 +56,7 @@ namespace xo { bool admits_f64() const; virtual void on_expr(ref::brw expr, - exprstatestack * p_stack, - rp * p_emit_expr) override; + parserstatemachine * p_psm) override; virtual void on_symbol_token(const token_type & tk, parserstatemachine * p_psm) override; virtual void on_typedescr(TypeDescr td, diff --git a/src/reader/define_xs.cpp b/src/reader/define_xs.cpp index 30938ce7..58006125 100644 --- a/src/reader/define_xs.cpp +++ b/src/reader/define_xs.cpp @@ -30,8 +30,7 @@ namespace xo { void define_xs::on_expr(ref::brw expr, - exprstatestack * p_stack, - rp * p_emit_expr) + parserstatemachine * p_psm) { if (this->defxs_type_ == defexprstatetype::def_5) { /* have all the ingredients to create an expression @@ -54,7 +53,7 @@ namespace xo { return; } - exprstate::on_expr(expr, p_stack, p_emit_expr); + exprstate::on_expr(expr, p_psm); } void @@ -133,7 +132,6 @@ namespace xo { scope log(XO_DEBUG(c_debug_flag)); auto p_stack = p_psm->p_stack_; - auto p_emit_expr = p_psm->p_emit_expr_; //constexpr const char * self_name = "exprstate::on_semicolon"; @@ -142,9 +140,7 @@ namespace xo { std::unique_ptr self = p_stack->pop_exprstate(); - p_stack->top_exprstate().on_expr(expr, - p_stack, - p_emit_expr); + p_stack->top_exprstate().on_expr(expr, p_psm); } else { exprstate::on_semicolon_token(tk, p_psm); } diff --git a/src/reader/expect_expr_xs.cpp b/src/reader/expect_expr_xs.cpp index 123f52da..74afec19 100644 --- a/src/reader/expect_expr_xs.cpp +++ b/src/reader/expect_expr_xs.cpp @@ -118,8 +118,7 @@ namespace xo { void expect_expr_xs::on_expr(ref::brw expr, - exprstatestack * p_stack, - rp * p_emit_expr) + parserstatemachine * p_psm) { constexpr bool c_debug_flag = true; scope log(XO_DEBUG(c_debug_flag)); @@ -127,12 +126,11 @@ namespace xo { log && log(xtag("exstype", this->exs_type_), xtag("expr", expr)); + auto p_stack = p_psm->p_stack_; std::unique_ptr self = p_stack->pop_exprstate(); - p_stack->top_exprstate().on_expr(expr, - p_stack, - p_emit_expr); + p_stack->top_exprstate().on_expr(expr, p_psm); } /*on_expr*/ } /*namespace scm*/ diff --git a/src/reader/exprseq_xs.cpp b/src/reader/exprseq_xs.cpp index 2d9d7053..44f28624 100644 --- a/src/reader/exprseq_xs.cpp +++ b/src/reader/exprseq_xs.cpp @@ -3,6 +3,7 @@ #include "exprseq_xs.hpp" #include "define_xs.hpp" #include "expect_symbol_xs.hpp" +#include "parserstatemachine.hpp" namespace xo { namespace scm { @@ -60,8 +61,7 @@ namespace xo { void exprseq_xs::on_expr(ref::brw expr, - exprstatestack * /*p_stack*/, - rp * p_emit_expr) + parserstatemachine * p_psm) { /* toplevel expression sequence accepts an * arbitrary number of expressions. @@ -69,6 +69,8 @@ namespace xo { * parser::include_token() returns */ + auto p_emit_expr = p_psm->p_emit_expr_; + *p_emit_expr = expr.promote(); } /*on_expr*/ diff --git a/src/reader/exprstate.cpp b/src/reader/exprstate.cpp index db501154..1b9644b6 100644 --- a/src/reader/exprstate.cpp +++ b/src/reader/exprstate.cpp @@ -346,8 +346,7 @@ namespace xo { void exprstate::on_expr(ref::brw expr, - exprstatestack * /*p_stack*/, - rp * /*p_emit_expr*/) + parserstatemachine * /*p_psm*/) { constexpr bool c_debug_flag = true; scope log(XO_DEBUG(c_debug_flag)); diff --git a/src/reader/lambda_xs.cpp b/src/reader/lambda_xs.cpp index 7aaf657d..fbde492a 100644 --- a/src/reader/lambda_xs.cpp +++ b/src/reader/lambda_xs.cpp @@ -59,14 +59,13 @@ namespace xo { void lambda_xs::on_expr(ref::brw expr, - exprstatestack * p_stack, - rp * p_emit_expr) + parserstatemachine * p_psm) { if (lmxs_type_ == lambdastatetype::lm_2) { this->lmxs_type_ = lambdastatetype::lm_3; this->body_ = expr.promote(); } else { - exprstate::on_expr(expr, p_stack, p_emit_expr); + exprstate::on_expr(expr, p_psm); } } @@ -75,7 +74,6 @@ namespace xo { parserstatemachine * p_psm) { auto p_stack = p_psm->p_stack_; - auto p_emit_expr = p_psm->p_emit_expr_; if (lmxs_type_ == lambdastatetype::lm_3) { /* done! */ @@ -86,7 +84,7 @@ namespace xo { rp lm = Lambda::make(name, argl_, body_); - p_stack->top_exprstate().on_expr(lm, p_stack, p_emit_expr); + p_stack->top_exprstate().on_expr(lm, p_psm); p_stack->top_exprstate().on_semicolon_token(tk, p_psm); return; diff --git a/src/reader/paren_xs.cpp b/src/reader/paren_xs.cpp index 6f94b37f..b9dde8f4 100644 --- a/src/reader/paren_xs.cpp +++ b/src/reader/paren_xs.cpp @@ -152,11 +152,10 @@ namespace xo { rp expr = this->gen_expr_; auto p_stack = p_psm->p_stack_; - auto p_emit_expr = p_psm->p_emit_expr_; std::unique_ptr self = p_stack->pop_exprstate(); - p_stack->top_exprstate().on_expr(expr, p_stack, p_emit_expr); + p_stack->top_exprstate().on_expr(expr, p_psm); } } @@ -174,8 +173,7 @@ namespace xo { void paren_xs::on_expr(ref::brw expr, - exprstatestack * p_stack, - rp * /*p_emit_expr*/) + parserstatemachine * p_psm) { constexpr bool c_debug_flag = true; scope log(XO_DEBUG(c_debug_flag)); @@ -186,6 +184,8 @@ namespace xo { switch (this->parenxs_type_) { case parenexprstatetype::lparen_0: { this->parenxs_type_ = parenexprstatetype::lparen_1; /* wants on_rightparen */ + auto p_stack = p_psm->p_stack_; + progress_xs::start(expr.promote(), p_stack); return; diff --git a/src/reader/progress_xs.cpp b/src/reader/progress_xs.cpp index d319bcf1..6b474db3 100644 --- a/src/reader/progress_xs.cpp +++ b/src/reader/progress_xs.cpp @@ -134,8 +134,7 @@ namespace xo { void progress_xs::on_expr(ref::brw expr, - exprstatestack * /*p_stack*/, - rp * /*p_emit_expr*/) + parserstatemachine * /*p_psm*/) { /* note: previous token probably an operator, * handled from progress_xs::on_operator_token(), @@ -200,15 +199,13 @@ namespace xo { scope log(XO_DEBUG(c_debug_flag)); auto p_stack = p_psm->p_stack_; - auto p_emit_expr = p_psm->p_emit_expr_; rp expr = this->assemble_expr(); std::unique_ptr self = p_stack->pop_exprstate(); - p_stack->top_exprstate().on_expr(expr, - p_stack, - p_emit_expr); + p_stack->top_exprstate().on_expr(expr, p_psm); + /* control here on input like: * (1.234; * @@ -261,7 +258,6 @@ namespace xo { constexpr const char * self_name = "progress_xs::on_rightparen"; auto p_stack = p_psm->p_stack_; - auto p_emit_expr = p_psm->p_emit_expr_; /* stack may be something like: * @@ -286,7 +282,7 @@ namespace xo { log && log(xtag("stack", p_stack)); - p_stack->top_exprstate().on_expr(expr, p_stack, p_emit_expr); + p_stack->top_exprstate().on_expr(expr, p_psm); /* now deliver rightparen */ p_stack->top_exprstate().on_rightparen_token(tk, p_psm);