From fccff550011b9645573e1cdb48c000e881d65e23 Mon Sep 17 00:00:00 2001 From: Roland Conybeare Date: Thu, 8 Aug 2024 15:11:50 -0400 Subject: [PATCH] xo-reader: refactor: splitoff defexpr state machine from exprstate --- include/xo/reader/define_xs.hpp | 17 ++ include/xo/reader/exprstate.hpp | 5 + include/xo/reader/parser.hpp | 11 ++ src/reader/define_xs.cpp | 311 +++++++++++--------------------- src/reader/exprstate.cpp | 133 +++----------- utest/parser.test.cpp | 45 +++-- 6 files changed, 203 insertions(+), 319 deletions(-) diff --git a/include/xo/reader/define_xs.hpp b/include/xo/reader/define_xs.hpp index de1fb44d..0f872007 100644 --- a/include/xo/reader/define_xs.hpp +++ b/include/xo/reader/define_xs.hpp @@ -10,6 +10,19 @@ namespace xo { namespace scm { + enum class defexprstatetype { + invalid = -1, + + def_0, + def_1, + def_2, + def_3, + def_4, + def_5, + + n_defexprstatetype, + }; + /** @class define_xs * @brief state to provide parsing of a define-expression **/ @@ -18,8 +31,11 @@ namespace xo { define_xs(rp def_expr); virtual ~define_xs() = default; + static const define_xs * from(const exprstate * x) { return dynamic_cast(x); } static std::unique_ptr def_0(rp def_expr); + defexprstatetype defxs_type() const { return defxs_type_; } + virtual bool admits_definition() const override; virtual bool admits_symbol() const override; virtual bool admits_colon() const override; @@ -71,6 +87,7 @@ namespace xo { * (done): definition complete, pop exprstate from stack * **/ + defexprstatetype defxs_type_; }; } /*namespace scm*/ } /*namespace xo*/ diff --git a/include/xo/reader/exprstate.hpp b/include/xo/reader/exprstate.hpp index 75a955ce..ea37b934 100644 --- a/include/xo/reader/exprstate.hpp +++ b/include/xo/reader/exprstate.hpp @@ -20,12 +20,15 @@ namespace xo { /** toplevel of some translation unit **/ expect_toplevel_expression_sequence, + defexpr, +#ifdef OBSOLETE def_0, def_1, def_2, def_3, def_4, def_5, +#endif /* lparen_0: look for expression; capture + advance to lparen_1 */ lparen_0, @@ -63,6 +66,8 @@ namespace xo { }; #endif + class define_xs; + /** state associated with a partially-parsed expression. **/ class exprstate { diff --git a/include/xo/reader/parser.hpp b/include/xo/reader/parser.hpp index fb760081..3211fd0c 100644 --- a/include/xo/reader/parser.hpp +++ b/include/xo/reader/parser.hpp @@ -167,6 +167,17 @@ namespace xo { return exprstatetype::invalid; } + exprstate const * i_exstate(std::size_t i) const { + std::size_t z = xs_stack_.size(); + + if (i < z) { + return xs_stack_[i].get(); + } + + /* out of bounds */ + return nullptr; + } + /** true iff parser contains state for an incomplete expression. * For this to be true, parser must have consumed at least one token * since end of last toplevel expression diff --git a/src/reader/define_xs.cpp b/src/reader/define_xs.cpp index f5859c23..15ff0130 100644 --- a/src/reader/define_xs.cpp +++ b/src/reader/define_xs.cpp @@ -10,40 +10,31 @@ namespace xo { } define_xs::define_xs(rp def_expr) - : exprstate(exprstatetype::def_0, + : exprstate(exprstatetype::defexpr, nullptr /*gen_expr*/, - def_expr) + def_expr), + defxs_type_{defexprstatetype::def_0} {} bool define_xs::admits_definition() const { - switch (exs_type_) { - case exprstatetype::expect_toplevel_expression_sequence: - /* unreachable */ - assert(false); - return false; + switch (defxs_type_) { - case exprstatetype::def_0: - case exprstatetype::def_1: - case exprstatetype::def_2: - case exprstatetype::def_3: - case exprstatetype::def_4: - case exprstatetype::def_5: + case defexprstatetype::def_0: + case defexprstatetype::def_1: + case defexprstatetype::def_2: + case defexprstatetype::def_3: + case defexprstatetype::def_4: + case defexprstatetype::def_5: /* note for def_4: * rhs could certainly be a function body that contains * nested defines; but then immediately-enclosing-exprstate * would be a block */ return false; - case exprstatetype::lparen_0: - case exprstatetype::lparen_1: - case exprstatetype::expect_rhs_expression: - case exprstatetype::expect_symbol: - case exprstatetype::expect_type: - case exprstatetype::expr_progress: - case exprstatetype::invalid: - case exprstatetype::n_exprstatetype: + case defexprstatetype::invalid: + case defexprstatetype::n_defexprstatetype: /* unreachable */ assert(false); return false; @@ -54,28 +45,18 @@ namespace xo { bool define_xs::admits_symbol() const { - switch (exs_type_) { - case exprstatetype::expect_toplevel_expression_sequence: - /* unreachable */ - assert(false); + switch (defxs_type_) { + + case defexprstatetype::def_0: + case defexprstatetype::def_1: + case defexprstatetype::def_2: + case defexprstatetype::def_3: + case defexprstatetype::def_4: + case defexprstatetype::def_5: return false; - case exprstatetype::def_0: - case exprstatetype::def_1: - case exprstatetype::def_2: - case exprstatetype::def_3: - case exprstatetype::def_4: - case exprstatetype::def_5: - return false; - - case exprstatetype::lparen_0: - case exprstatetype::lparen_1: - case exprstatetype::expect_rhs_expression: - case exprstatetype::expect_symbol: - case exprstatetype::expect_type: - case exprstatetype::expr_progress: - case exprstatetype::invalid: - case exprstatetype::n_exprstatetype: + case defexprstatetype::invalid: + case defexprstatetype::n_defexprstatetype: /* unreachable */ assert(false); return false; @@ -86,32 +67,22 @@ namespace xo { bool define_xs::admits_colon() const { - switch (exs_type_) { - case exprstatetype::expect_toplevel_expression_sequence: - /* unreachable */ - assert(false); + switch (defxs_type_) { + + case defexprstatetype::def_0: return false; - case exprstatetype::def_0: - return false; - - case exprstatetype::def_1: + case defexprstatetype::def_1: return true; - case exprstatetype::def_2: - case exprstatetype::def_3: - case exprstatetype::def_4: - case exprstatetype::def_5: + case defexprstatetype::def_2: + case defexprstatetype::def_3: + case defexprstatetype::def_4: + case defexprstatetype::def_5: return false; - case exprstatetype::lparen_0: - case exprstatetype::lparen_1: - case exprstatetype::expect_rhs_expression: - case exprstatetype::expect_symbol: - case exprstatetype::expect_type: - case exprstatetype::expr_progress: - case exprstatetype::invalid: - case exprstatetype::n_exprstatetype: + case defexprstatetype::invalid: + case defexprstatetype::n_defexprstatetype: /* unreachable */ assert(false); return false; @@ -122,27 +93,19 @@ namespace xo { bool define_xs::admits_semicolon() const { - switch (exs_type_) { - case exprstatetype::expect_toplevel_expression_sequence: - /* unreachable */ - assert(false); + switch (defxs_type_) { + + case defexprstatetype::def_0: + case defexprstatetype::def_1: + case defexprstatetype::def_2: + case defexprstatetype::def_3: + case defexprstatetype::def_4: return false; - case exprstatetype::def_0: - case exprstatetype::def_1: - case exprstatetype::def_2: - case exprstatetype::def_3: - case exprstatetype::def_4: - return false; - case exprstatetype::def_5: + case defexprstatetype::def_5: return true; - case exprstatetype::lparen_0: - case exprstatetype::lparen_1: - case exprstatetype::expect_rhs_expression: - case exprstatetype::expect_symbol: - case exprstatetype::expect_type: - case exprstatetype::expr_progress: - case exprstatetype::invalid: - case exprstatetype::n_exprstatetype: + + case defexprstatetype::invalid: + case defexprstatetype::n_defexprstatetype: /* unreachable */ assert(false); return false; @@ -153,11 +116,7 @@ namespace xo { bool define_xs::admits_singleassign() const { - switch (exs_type_) { - case exprstatetype::expect_toplevel_expression_sequence: - /* unreachable */ - assert(false); - return false; + switch (defxs_type_) { /* * def foo = 1 ; @@ -173,31 +132,24 @@ namespace xo { * * note that we skip from def_1 -> def_4 if '=' instead of ':' */ - case exprstatetype::def_0: + case defexprstatetype::def_0: return false; - case exprstatetype::def_1: + case defexprstatetype::def_1: return true; - case exprstatetype::def_2: + case defexprstatetype::def_2: return false; - case exprstatetype::def_3: + case defexprstatetype::def_3: return true; - case exprstatetype::def_4: - case exprstatetype::def_5: + case defexprstatetype::def_4: + case defexprstatetype::def_5: return false; - case exprstatetype::lparen_0: - case exprstatetype::lparen_1: - case exprstatetype::expect_rhs_expression: - case exprstatetype::expect_symbol: - case exprstatetype::expect_type: - case exprstatetype::expr_progress: - case exprstatetype::invalid: - case exprstatetype::n_exprstatetype: - /* unreachable */ + case defexprstatetype::invalid: + case defexprstatetype::n_defexprstatetype: /* unreachable */ assert(false); return false; @@ -208,18 +160,14 @@ namespace xo { bool define_xs::admits_leftparen() const { - switch (exs_type_) { - case exprstatetype::expect_toplevel_expression_sequence: - /* unreachable */ - assert(false); - return false; + switch (defxs_type_) { - case exprstatetype::def_0: - case exprstatetype::def_1: - case exprstatetype::def_2: - case exprstatetype::def_3: - case exprstatetype::def_4: - case exprstatetype::def_5: + case defexprstatetype::def_0: + case defexprstatetype::def_1: + case defexprstatetype::def_2: + case defexprstatetype::def_3: + case defexprstatetype::def_4: + case defexprstatetype::def_5: /* input like * def foo : f64 = ( * ^ ^ ^ ^ ^ @@ -233,14 +181,8 @@ namespace xo { */ return false; - case exprstatetype::lparen_0: - case exprstatetype::lparen_1: - case exprstatetype::expect_rhs_expression: - case exprstatetype::expect_type: - case exprstatetype::expect_symbol: - case exprstatetype::expr_progress: - case exprstatetype::invalid: - case exprstatetype::n_exprstatetype: + case defexprstatetype::invalid: + case defexprstatetype::n_defexprstatetype: /* unreachable */ assert(false); return false; @@ -251,28 +193,18 @@ namespace xo { bool define_xs::admits_rightparen() const { - switch (exs_type_) { - case exprstatetype::expect_toplevel_expression_sequence: - /* unreachable */ - assert(false); + switch (defxs_type_) { + + case defexprstatetype::def_0: + case defexprstatetype::def_1: + case defexprstatetype::def_2: + case defexprstatetype::def_3: + case defexprstatetype::def_4: + case defexprstatetype::def_5: return false; - case exprstatetype::def_0: - case exprstatetype::def_1: - case exprstatetype::def_2: - case exprstatetype::def_3: - case exprstatetype::def_4: - case exprstatetype::def_5: - return false; - - case exprstatetype::lparen_0: - case exprstatetype::lparen_1: - case exprstatetype::expect_rhs_expression: - case exprstatetype::expect_type: - case exprstatetype::expect_symbol: - case exprstatetype::expr_progress: - case exprstatetype::invalid: - case exprstatetype::n_exprstatetype: + case defexprstatetype::invalid: + case defexprstatetype::n_defexprstatetype: /* unreachable */ assert(false); return false; @@ -286,19 +218,16 @@ namespace xo { exprstatestack * /* p_stack */, rp * /* p_emit_expr */) { - switch (this->exs_type_) { - case exprstatetype::expect_toplevel_expression_sequence: - assert(false); - return; + switch (this->defxs_type_) { - case exprstatetype::def_0: - case exprstatetype::def_1: - case exprstatetype::def_2: - case exprstatetype::def_3: + case defexprstatetype::def_0: + case defexprstatetype::def_1: + case defexprstatetype::def_2: + case defexprstatetype::def_3: /* NOT IMPLEMENTED */ assert(false); return; - case exprstatetype::def_4: { + case defexprstatetype::def_4: { /* have all the ingredients to create an expression * representing a definition * @@ -315,22 +244,16 @@ namespace xo { rp def_expr = this->def_expr_; - this->exs_type_ = exprstatetype::def_5; + this->defxs_type_ = defexprstatetype::def_5; return; } - case exprstatetype::def_5: + case defexprstatetype::def_5: assert(false); return; - case exprstatetype::lparen_0: - case exprstatetype::lparen_1: - case exprstatetype::expect_rhs_expression: - case exprstatetype::expect_type: - case exprstatetype::expect_symbol: - case exprstatetype::expr_progress: - case exprstatetype::invalid: - case exprstatetype::n_exprstatetype: + case defexprstatetype::invalid: + case defexprstatetype::n_defexprstatetype: /* unreachable */ assert(false); return; @@ -342,34 +265,24 @@ namespace xo { exprstatestack * /*p_stack*/, rp * /*p_emit_expr*/) { - switch (this->exs_type_) { - case exprstatetype::expect_toplevel_expression_sequence: - /* unreachable */ - assert(false); - return; - case exprstatetype::def_0: - this->exs_type_ = exprstatetype::def_1; + switch (this->defxs_type_) { + case defexprstatetype::def_0: + this->defxs_type_ = defexprstatetype::def_1; this->def_expr_->assign_lhs_name(symbol_name); //this->def_lhs_symbol_ = symbol_name; return; - case exprstatetype::def_1: - case exprstatetype::def_2: - case exprstatetype::def_3: - case exprstatetype::def_4: - case exprstatetype::def_5: + case defexprstatetype::def_1: + case defexprstatetype::def_2: + case defexprstatetype::def_3: + case defexprstatetype::def_4: + case defexprstatetype::def_5: /* NOT IMPLEMENTED */ assert(false); return; - case exprstatetype::lparen_0: - case exprstatetype::lparen_1: - case exprstatetype::expect_rhs_expression: - case exprstatetype::expect_type: - case exprstatetype::expect_symbol: - case exprstatetype::expr_progress: - case exprstatetype::invalid: - case exprstatetype::n_exprstatetype: + case defexprstatetype::invalid: + case defexprstatetype::n_defexprstatetype: /* unreachable */ assert(false); return; @@ -381,20 +294,16 @@ namespace xo { exprstatestack * /*p_stack*/, rp * /*p_emit_expr*/) { - switch (this->exs_type_) { - case exprstatetype::expect_toplevel_expression_sequence: - /* unreachable */ - assert(false); - return; + switch (this->defxs_type_) { - case exprstatetype::def_0: - case exprstatetype::def_1: + case defexprstatetype::def_0: + case defexprstatetype::def_1: /* NOT IMPLEMENTED (ill-formed program) */ assert(false); return; - case exprstatetype::def_2: - this->exs_type_ = exprstatetype::def_3; + case defexprstatetype::def_2: + this->defxs_type_ = defexprstatetype::def_3; this->cvt_expr_ = ConvertExprAccess::make(td /*dest_type*/, nullptr /*source_expr*/); this->def_expr_->assign_rhs(this->cvt_expr_); @@ -402,21 +311,15 @@ namespace xo { return; - case exprstatetype::def_3: - case exprstatetype::def_4: - case exprstatetype::def_5: + case defexprstatetype::def_3: + case defexprstatetype::def_4: + case defexprstatetype::def_5: /* NOT IMPLEMENTED */ assert(false); return; - case exprstatetype::lparen_0: - case exprstatetype::lparen_1: - case exprstatetype::expect_rhs_expression: - case exprstatetype::expect_type: - case exprstatetype::expect_symbol: - case exprstatetype::expr_progress: - case exprstatetype::invalid: - case exprstatetype::n_exprstatetype: + case defexprstatetype::invalid: + case defexprstatetype::n_defexprstatetype: /* unreachable */ assert(false); return; @@ -438,8 +341,8 @@ namespace xo { xtag("state", *this))); } - if (this->exs_type_ == exprstatetype::def_1) { - this->exs_type_ = exprstatetype::def_2; + if (this->defxs_type_ == defexprstatetype::def_1) { + this->defxs_type_ = defexprstatetype::def_2; p_stack->push_exprstate(exprstate::expect_type()); } else { @@ -463,7 +366,7 @@ namespace xo { xtag("state", *this))); } - if (this->exs_type_ == exprstatetype::def_5) { + if (this->defxs_type_ == defexprstatetype::def_5) { rp expr = this->def_expr_; std::unique_ptr self = p_stack->pop_exprstate(); @@ -491,10 +394,10 @@ namespace xo { xtag("state", *this))); } - if ((this->exs_type_ == exprstatetype::def_1) - || (this->exs_type_ == exprstatetype::def_3)) + if ((this->defxs_type_ == defexprstatetype::def_1) + || (this->defxs_type_ == defexprstatetype::def_3)) { - this->exs_type_ = exprstatetype::def_4; + this->defxs_type_ = defexprstatetype::def_4; p_stack->push_exprstate(exprstate::expect_rhs_expression()); } else { diff --git a/src/reader/exprstate.cpp b/src/reader/exprstate.cpp index a0e9b0c7..c61ecc60 100644 --- a/src/reader/exprstate.cpp +++ b/src/reader/exprstate.cpp @@ -20,18 +20,8 @@ namespace xo { return "?invalid"; case exprstatetype::expect_toplevel_expression_sequence: return "expect_toplevel_expression_sequence"; - case exprstatetype::def_0: - return "def_0"; - case exprstatetype::def_1: - return "def_1"; - case exprstatetype::def_2: - return "def_2"; - case exprstatetype::def_3: - return "def_3"; - case exprstatetype::def_4: - return "def_4"; - case exprstatetype::def_5: - return "def_5"; + case exprstatetype::defexpr: + return "defexpr"; case exprstatetype::lparen_0: return "lparen_0"; case exprstatetype::lparen_1: @@ -57,12 +47,7 @@ namespace xo { case exprstatetype::expect_toplevel_expression_sequence: return true; - case exprstatetype::def_0: - case exprstatetype::def_1: - case exprstatetype::def_2: - case exprstatetype::def_3: - case exprstatetype::def_4: - case exprstatetype::def_5: + case exprstatetype::defexpr: /* unreachable */ assert(false); return false; @@ -90,12 +75,7 @@ namespace xo { case exprstatetype::expect_toplevel_expression_sequence: return false; - case exprstatetype::def_0: - case exprstatetype::def_1: - case exprstatetype::def_2: - case exprstatetype::def_3: - case exprstatetype::def_4: - case exprstatetype::def_5: + case exprstatetype::defexpr: /* unreachable */ assert(false); return false; @@ -129,16 +109,12 @@ namespace xo { exprstate::admits_colon() const { switch (exs_type_) { case exprstatetype::expect_toplevel_expression_sequence: - case exprstatetype::def_0: + + case exprstatetype::defexpr: + /* unreachable -- redirects to define_xs::admits_colon() */ + assert(false); return false; - case exprstatetype::def_1: - return true; - - case exprstatetype::def_2: - case exprstatetype::def_3: - case exprstatetype::def_4: - case exprstatetype::def_5: case exprstatetype::lparen_0: case exprstatetype::lparen_1: case exprstatetype::expect_rhs_expression: @@ -165,14 +141,7 @@ namespace xo { exprstate::admits_semicolon() const { switch (exs_type_) { case exprstatetype::expect_toplevel_expression_sequence: - case exprstatetype::def_0: - case exprstatetype::def_1: - case exprstatetype::def_2: - case exprstatetype::def_3: - case exprstatetype::def_4: - return false; - case exprstatetype::def_5: - return true; + case exprstatetype::defexpr: case exprstatetype::lparen_0: case exprstatetype::lparen_1: case exprstatetype::expect_rhs_expression: @@ -208,21 +177,11 @@ namespace xo { * * note that we skip from def_1 -> def_4 if '=' instead of ':' */ - case exprstatetype::def_0: + case exprstatetype::defexpr: + /* unreachable - redirects to define_xs */ + assert(false); return false; - case exprstatetype::def_1: - return true; - - case exprstatetype::def_2: - return false; - - case exprstatetype::def_3: - return true; - - case exprstatetype::def_4: - case exprstatetype::def_5: - case exprstatetype::lparen_0: case exprstatetype::lparen_1: case exprstatetype::expect_rhs_expression: @@ -249,12 +208,10 @@ namespace xo { exprstate::admits_f64() const { switch (exs_type_) { case exprstatetype::expect_toplevel_expression_sequence: - case exprstatetype::def_0: - case exprstatetype::def_1: - case exprstatetype::def_2: - case exprstatetype::def_3: - case exprstatetype::def_4: - case exprstatetype::def_5: + + case exprstatetype::defexpr: + /* unreachable - redirects to define_xs */ + assert(false); return false; case exprstatetype::lparen_0: @@ -297,13 +254,8 @@ namespace xo { */ return false; - case exprstatetype::def_0: - case exprstatetype::def_1: - case exprstatetype::def_2: - case exprstatetype::def_3: - case exprstatetype::def_4: - case exprstatetype::def_5: - /* unreachable */ + case exprstatetype::defexpr: + /* unreachable - redirects to define_xs */ assert(false); return false; @@ -343,13 +295,8 @@ namespace xo { case exprstatetype::expect_toplevel_expression_sequence: return false; - case exprstatetype::def_0: - case exprstatetype::def_1: - case exprstatetype::def_2: - case exprstatetype::def_3: - case exprstatetype::def_4: - case exprstatetype::def_5: - /* unreachable */ + case exprstatetype::defexpr: + /* unreachable - redirects to define_xs */ assert(false); return false; @@ -442,13 +389,8 @@ namespace xo { xtag("symbol", tk))); break; - case exprstatetype::def_0: - case exprstatetype::def_1: - case exprstatetype::def_2: - case exprstatetype::def_3: - case exprstatetype::def_4: - case exprstatetype::def_5: - /* unreachable */ + case exprstatetype::defexpr: + /* unreachable - redirects to define_xs */ assert(false); return; @@ -558,13 +500,8 @@ namespace xo { switch (this->exs_type_) { case exprstatetype::expect_toplevel_expression_sequence: - case exprstatetype::def_0: - case exprstatetype::def_1: - case exprstatetype::def_2: - case exprstatetype::def_3: - case exprstatetype::def_4: - case exprstatetype::def_5: - /* unreachable */ + case exprstatetype::defexpr: + /* unreachable - redirects to define_xs */ assert(false); return; @@ -728,7 +665,7 @@ namespace xo { /* right paren confirms stack expression */ rp expr = this->gen_expr_; - std::unique_ptr self = p_stack->pop_exprstate(); /* NOT KOSHER. invalidates *this */ + std::unique_ptr self = p_stack->pop_exprstate(); if (p_stack->empty()) { throw std::runtime_error(tostr(self_name, @@ -744,7 +681,7 @@ namespace xo { } else if (this->exs_type_ == exprstatetype::lparen_1) { rp expr = this->gen_expr_; - std::unique_ptr self = p_stack->pop_exprstate(); /* NOT KOSHER. invalidates *this */ + std::unique_ptr self = p_stack->pop_exprstate(); p_stack->top_exprstate().on_expr(expr, p_stack, p_emit_expr); } @@ -891,13 +828,8 @@ namespace xo { *p_emit_expr = expr.promote(); return; - case exprstatetype::def_0: - case exprstatetype::def_1: - case exprstatetype::def_2: - case exprstatetype::def_3: - case exprstatetype::def_4: - case exprstatetype::def_5: - /* unreachable. see define_xs::on_expr() */ + case exprstatetype::defexpr: + /* unreachable. redirects to define_xs::on_expr() */ assert(false); return; @@ -962,13 +894,8 @@ namespace xo { /* NOT IMPLEMENTED */ assert(false); return; - case exprstatetype::def_0: - case exprstatetype::def_1: - case exprstatetype::def_2: - case exprstatetype::def_3: - case exprstatetype::def_4: - case exprstatetype::def_5: - /* unreachable */ + case exprstatetype::defexpr: + /* unreachable - redirects to define_xs */ assert(false); return; diff --git a/utest/parser.test.cpp b/utest/parser.test.cpp index 58910bda..8611a40a 100644 --- a/utest/parser.test.cpp +++ b/utest/parser.test.cpp @@ -4,12 +4,15 @@ */ #include "xo/reader/parser.hpp" +#include "xo/reader/define_xs.hpp" #include namespace xo { using parser_type = xo::scm::parser; using token_type = parser_type::token_type; using xo::scm::exprstatetype; + using xo::scm::define_xs; + using xo::scm::defexprstatetype; using std::cerr; using std::endl; @@ -45,8 +48,11 @@ namespace xo { CHECK(parser.stack_size() == 3); if (parser.stack_size() > 0) CHECK(parser.i_exstype(0) == exprstatetype::expect_symbol); - if (parser.stack_size() > 1) - CHECK(parser.i_exstype(1) == exprstatetype::def_0); + if (parser.stack_size() > 1) { + CHECK(parser.i_exstype(1) == exprstatetype::defexpr); + REQUIRE(define_xs::from(parser.i_exstate(1)) != nullptr); + CHECK(define_xs::from(parser.i_exstate(1))->defxs_type() == defexprstatetype::def_0); + } if (parser.stack_size() > 2) CHECK(parser.i_exstype(2) == exprstatetype::expect_toplevel_expression_sequence); @@ -71,8 +77,11 @@ namespace xo { * def_1 */ CHECK(parser.stack_size() == 2); - if (parser.stack_size() > 0) - CHECK(parser.i_exstype(0) == exprstatetype::def_1); + if (parser.stack_size() > 0) { + CHECK(parser.i_exstype(0) == exprstatetype::defexpr); + REQUIRE(define_xs::from(parser.i_exstate(0)) != nullptr); + CHECK(define_xs::from(parser.i_exstate(0))->defxs_type() == defexprstatetype::def_1); + } if (parser.stack_size() > 1) CHECK(parser.i_exstype(1) == exprstatetype::expect_toplevel_expression_sequence); @@ -104,8 +113,11 @@ namespace xo { CHECK(parser.stack_size() == 3); if (parser.stack_size() > 0) CHECK(parser.i_exstype(0) == exprstatetype::expect_type); - if (parser.stack_size() > 1) - CHECK(parser.i_exstype(1) == exprstatetype::def_2); + if (parser.stack_size() > 1) { + CHECK(parser.i_exstype(1) == exprstatetype::defexpr); + REQUIRE(define_xs::from(parser.i_exstate(1)) != nullptr); + CHECK(define_xs::from(parser.i_exstate(1))->defxs_type() == defexprstatetype::def_2); + } if (parser.stack_size() > 2) CHECK(parser.i_exstype(2) == exprstatetype::expect_toplevel_expression_sequence); @@ -132,8 +144,11 @@ namespace xo { * def_3 */ CHECK(parser.stack_size() == 2); - if (parser.stack_size() > 0) - CHECK(parser.i_exstype(0) == exprstatetype::def_3); + if (parser.stack_size() > 0) { + CHECK(parser.i_exstype(0) == exprstatetype::defexpr); + REQUIRE(define_xs::from(parser.i_exstate(0)) != nullptr); + CHECK(define_xs::from(parser.i_exstate(0))->defxs_type() == defexprstatetype::def_3); + } if (parser.stack_size() > 1) CHECK(parser.i_exstype(1) == exprstatetype::expect_toplevel_expression_sequence); @@ -176,8 +191,11 @@ namespace xo { CHECK(parser.stack_size() == 3); if (parser.stack_size() > 0) CHECK(parser.i_exstype(0) == exprstatetype::expect_rhs_expression); - if (parser.stack_size() > 1) - CHECK(parser.i_exstype(1) == exprstatetype::def_4); + if (parser.stack_size() > 1) { + CHECK(parser.i_exstype(1) == exprstatetype::defexpr); + REQUIRE(define_xs::from(parser.i_exstate(1)) != nullptr); + CHECK(define_xs::from(parser.i_exstate(1))->defxs_type() == defexprstatetype::def_4); + } if (parser.stack_size() > 2) CHECK(parser.i_exstype(2) == exprstatetype::expect_toplevel_expression_sequence); @@ -212,8 +230,11 @@ namespace xo { CHECK(parser.i_exstype(0) == exprstatetype::expr_progress); if (parser.stack_size() > 1) CHECK(parser.i_exstype(1) == exprstatetype::expect_rhs_expression); - if (parser.stack_size() > 2) - CHECK(parser.i_exstype(2) == exprstatetype::def_4); + if (parser.stack_size() > 2) { + CHECK(parser.i_exstype(2) == exprstatetype::defexpr); + REQUIRE(define_xs::from(parser.i_exstate(2)) != nullptr); + CHECK(define_xs::from(parser.i_exstate(2))->defxs_type() == defexprstatetype::def_4); + } if (parser.stack_size() > 3) CHECK(parser.i_exstype(3) == exprstatetype::expect_toplevel_expression_sequence);