diff --git a/include/xo/reader/define_xs.hpp b/include/xo/reader/define_xs.hpp index 88e07237..d3ca7b39 100644 --- a/include/xo/reader/define_xs.hpp +++ b/include/xo/reader/define_xs.hpp @@ -38,6 +38,7 @@ namespace xo { virtual void on_typedescr(TypeDescr td, exprstatestack * /*p_stack*/, rp * /*p_emit_expr*/) override; + virtual void on_colon(exprstatestack * p_stack) override; private: /** diff --git a/src/reader/define_xs.cpp b/src/reader/define_xs.cpp index f1ce7669..7c0ed3bd 100644 --- a/src/reader/define_xs.cpp +++ b/src/reader/define_xs.cpp @@ -423,6 +423,30 @@ namespace xo { } } + void + define_xs::on_colon(exprstatestack * p_stack) { + constexpr bool c_debug_flag = true; + scope log(XO_DEBUG(c_debug_flag)); + + constexpr const char * self_name = "exprstate::on_colon"; + + /* lots of illegal states */ + if (!this->admits_colon()) + { + throw std::runtime_error(tostr(self_name, + ": unexpected colon for parsing state", + xtag("state", *this))); + } + + if (this->exs_type_ == exprstatetype::def_1) { + this->exs_type_ = exprstatetype::def_2; + + p_stack->push_exprstate(exprstate::expect_type()); + } else { + assert(false); + } + } + } /*namespace scm*/ } /*namespace xo*/ diff --git a/src/reader/exprstate.cpp b/src/reader/exprstate.cpp index 2b4b777e..d4079646 100644 --- a/src/reader/exprstate.cpp +++ b/src/reader/exprstate.cpp @@ -595,7 +595,7 @@ namespace xo { } void - exprstate::on_colon(exprstatestack * p_stack) { + exprstate::on_colon(exprstatestack * /*p_stack*/) { constexpr bool c_debug_flag = true; scope log(XO_DEBUG(c_debug_flag)); @@ -609,13 +609,7 @@ namespace xo { xtag("state", *this))); } - if (this->exs_type_ == exprstatetype::def_1) { - this->exs_type_ = exprstatetype::def_2; - - p_stack->push_exprstate(exprstate::expect_type()); - } else { - assert(false); - } + assert(false); } void