From 149536b182f86086ac36dec0b24ca801714d86df Mon Sep 17 00:00:00 2001 From: Roland Conybeare Date: Thu, 8 Aug 2024 14:16:12 -0400 Subject: [PATCH] xo-reader: refactor: mv on_semicolon for def-expr to define_xs --- include/xo/reader/define_xs.hpp | 2 ++ src/reader/define_xs.cpp | 28 ++++++++++++++++++++++++++++ src/reader/exprstate.cpp | 8 -------- 3 files changed, 30 insertions(+), 8 deletions(-) diff --git a/include/xo/reader/define_xs.hpp b/include/xo/reader/define_xs.hpp index d3ca7b39..b83ada71 100644 --- a/include/xo/reader/define_xs.hpp +++ b/include/xo/reader/define_xs.hpp @@ -39,6 +39,8 @@ namespace xo { exprstatestack * /*p_stack*/, rp * /*p_emit_expr*/) override; virtual void on_colon(exprstatestack * p_stack) override; + virtual void on_semicolon(exprstatestack * p_stack, + rp * /*p_emit_expr*/) override; private: /** diff --git a/src/reader/define_xs.cpp b/src/reader/define_xs.cpp index 7c0ed3bd..d5513bf2 100644 --- a/src/reader/define_xs.cpp +++ b/src/reader/define_xs.cpp @@ -447,6 +447,34 @@ namespace xo { } } + void + define_xs::on_semicolon(exprstatestack * p_stack, + rp * p_emit_expr) + { + constexpr bool c_debug_flag = true; + scope log(XO_DEBUG(c_debug_flag)); + + constexpr const char * self_name = "exprstate::on_semicolon"; + + if (!this->admits_semicolon()) + { + throw std::runtime_error(tostr(self_name, + ": unexpected semicolon for parsing state", + xtag("state", *this))); + } + + if (this->exs_type_ == exprstatetype::def_5) { + rp expr = this->def_expr_; + + std::unique_ptr self = p_stack->pop_exprstate(); + + p_stack->top_exprstate().on_expr(expr, + p_stack, + p_emit_expr); + } else { + assert(false); + } + } } /*namespace scm*/ } /*namespace xo*/ diff --git a/src/reader/exprstate.cpp b/src/reader/exprstate.cpp index d4079646..77a376c3 100644 --- a/src/reader/exprstate.cpp +++ b/src/reader/exprstate.cpp @@ -652,14 +652,6 @@ namespace xo { */ p_stack->top_exprstate().on_semicolon(p_stack, p_emit_expr); - } else if (this->exs_type_ == exprstatetype::def_5) { - rp expr = this->def_expr_; - - std::unique_ptr self = p_stack->pop_exprstate(); /* NOT KOSHER. invalidates *this */ - - p_stack->top_exprstate().on_expr(expr, - p_stack, - p_emit_expr); } else { assert(false); }