diff --git a/include/xo/reader/define_xs.hpp b/include/xo/reader/define_xs.hpp index 13b3d558..880dd309 100644 --- a/include/xo/reader/define_xs.hpp +++ b/include/xo/reader/define_xs.hpp @@ -81,6 +81,8 @@ namespace xo { virtual void on_expr(ref::brw expr, parserstatemachine * p_psm) override; + virtual void on_expr_with_semicolon(ref::brw expr, + 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 c3e8a513..646a803a 100644 --- a/include/xo/reader/expect_expr_xs.hpp +++ b/include/xo/reader/expect_expr_xs.hpp @@ -47,6 +47,12 @@ namespace xo { /** update exprstate in response to a successfully-parsed subexpression **/ virtual void on_expr(ref::brw expr, parserstatemachine * p_psm) override; + /** update exprstate in response to a successfully-parsed subexpression, + * that's terminated by semicolon ';' + **/ + virtual void on_expr_with_semicolon(ref::brw expr, + parserstatemachine * p_psm) override; + private: static std::unique_ptr make(bool allow_defs, diff --git a/include/xo/reader/exprstate.hpp b/include/xo/reader/exprstate.hpp index 8c5c9d6a..a6acad1f 100644 --- a/include/xo/reader/exprstate.hpp +++ b/include/xo/reader/exprstate.hpp @@ -107,6 +107,10 @@ namespace xo { virtual void on_expr(ref::brw expr, parserstatemachine * p_psm); + /** update exprstate in response to a successfully-parsed subexpression, that ends with semicolon **/ + virtual void on_expr_with_semicolon(ref::brw expr, + parserstatemachine * p_psm); + /** update exprstate when expecting a symbol **/ virtual void on_symbol(const std::string & symbol, parserstatemachine * p_psm); diff --git a/include/xo/reader/lambda_xs.hpp b/include/xo/reader/lambda_xs.hpp index 79c084ab..830135a3 100644 --- a/include/xo/reader/lambda_xs.hpp +++ b/include/xo/reader/lambda_xs.hpp @@ -48,6 +48,8 @@ namespace xo { parserstatemachine * p_psm) override; virtual void on_expr(ref::brw expr, parserstatemachine * p_psm) override; + virtual void on_expr_with_semicolon(ref::brw expr, + parserstatemachine * p_psm) override; virtual void on_semicolon_token(const token_type & tk, parserstatemachine * p_psm) override; diff --git a/include/xo/reader/parserstatemachine.hpp b/include/xo/reader/parserstatemachine.hpp index ac3c5cd8..065513c5 100644 --- a/include/xo/reader/parserstatemachine.hpp +++ b/include/xo/reader/parserstatemachine.hpp @@ -45,10 +45,13 @@ namespace xo { // ----- parsing outputs ----- + void on_expr(ref::brw expr); + void on_expr_with_semicolon(ref::brw expr); void on_symbol(const std::string & symbol); // ---- parsing inputs ----- + void on_semicolon_token(const token_type & tk); void on_leftbrace_token(const token_type & tk); void on_rightbrace_token(const token_type & tk); diff --git a/src/reader/define_xs.cpp b/src/reader/define_xs.cpp index 88ddb9d3..d251652a 100644 --- a/src/reader/define_xs.cpp +++ b/src/reader/define_xs.cpp @@ -88,6 +88,13 @@ namespace xo { } exprstate::on_expr(expr, p_psm); + void + define_xs::on_expr_with_semicolon(ref::brw expr, + parserstatemachine * p_psm) + { + this->on_expr(expr, p_psm); + /* semicolon is allowed to terminate def expr */ + this->on_semicolon_token(token_type::semicolon(), p_psm); } void diff --git a/src/reader/expect_expr_xs.cpp b/src/reader/expect_expr_xs.cpp index 3fe2aacf..af27d720 100644 --- a/src/reader/expect_expr_xs.cpp +++ b/src/reader/expect_expr_xs.cpp @@ -195,6 +195,21 @@ namespace xo { p_psm->top_exprstate().on_expr(expr, p_psm); } /*on_expr*/ + void + expect_expr_xs::on_expr_with_semicolon(ref::brw expr, + parserstatemachine * p_psm) + { + constexpr bool c_debug_flag = true; + scope log(XO_DEBUG(c_debug_flag)); + + log && log(xtag("exstype", this->exs_type_), + xtag("expr", expr.promote())); + + std::unique_ptr self = p_psm->pop_exprstate(); + + p_psm->on_expr_with_semicolon(expr); + } /*on_expr_with_semicolon*/ + } /*namespace scm*/ } /*namespace xo*/ diff --git a/src/reader/exprstate.cpp b/src/reader/exprstate.cpp index f472b070..550e20d0 100644 --- a/src/reader/exprstate.cpp +++ b/src/reader/exprstate.cpp @@ -387,6 +387,19 @@ namespace xo { assert(false); } /*on_expr*/ + void + exprstate::on_expr_with_semicolon(ref::brw expr, + parserstatemachine * /*p_psm*/) + { + constexpr bool c_debug_flag = true; + scope log(XO_DEBUG(c_debug_flag)); + + log && log(xtag("exstype", this->exs_type_), + xtag("expr", expr)); + + assert(false); + } /*on_expr_with_semicolon*/ + void exprstate::on_symbol(const std::string & symbol_name, parserstatemachine * /*p_psm*/) diff --git a/src/reader/lambda_xs.cpp b/src/reader/lambda_xs.cpp index 00fb5c0e..8aed4511 100644 --- a/src/reader/lambda_xs.cpp +++ b/src/reader/lambda_xs.cpp @@ -66,6 +66,14 @@ namespace xo { } } + void + lambda_xs::on_expr_with_semicolon(ref::brw expr, + parserstatemachine * p_psm) + { + this->on_expr(expr, p_psm); + this->on_semicolon_token(token_type::semicolon(), p_psm); + } + void lambda_xs::on_semicolon_token(const token_type & tk, parserstatemachine * p_psm) diff --git a/src/reader/parserstatemachine.cpp b/src/reader/parserstatemachine.cpp index 9ed21d0a..44700814 100644 --- a/src/reader/parserstatemachine.cpp +++ b/src/reader/parserstatemachine.cpp @@ -48,6 +48,32 @@ namespace xo { p_env_stack_->pop_envframe(); } + void + parserstatemachine::on_expr(ref::brw x) + { + constexpr bool c_debug_flag = true; + scope log(XO_DEBUG(c_debug_flag)); + + log && log(xtag("x", x), + xtag("psm", *this)); + + this->p_stack_ + ->top_exprstate().on_expr(x, this); + } + + void + parserstatemachine::on_expr_with_semicolon(ref::brw x) + { + constexpr bool c_debug_flag = true; + scope log(XO_DEBUG(c_debug_flag)); + + log && log(xtag("x", x), + xtag("psm", *this)); + + this->p_stack_ + ->top_exprstate().on_expr_with_semicolon(x, this); + } + void parserstatemachine::on_symbol(const std::string & x) { diff --git a/src/reader/progress_xs.cpp b/src/reader/progress_xs.cpp index fcb32142..d716bd0c 100644 --- a/src/reader/progress_xs.cpp +++ b/src/reader/progress_xs.cpp @@ -215,7 +215,7 @@ namespace xo { } void - progress_xs::on_semicolon_token(const token_type & tk, + progress_xs::on_semicolon_token(const token_type & /*tk*/, parserstatemachine * p_psm) { /* note: implementation parllels .on_rightparen_token() */ @@ -227,7 +227,7 @@ namespace xo { std::unique_ptr self = p_psm->pop_exprstate(); - p_psm->top_exprstate().on_expr(expr, p_psm); + p_psm->on_expr_with_semicolon(expr); /* control here on input like: * (1.234;