xo-reader: refactor: splitoff defexpr state machine from exprstate

This commit is contained in:
Roland Conybeare 2024-08-08 15:11:50 -04:00
commit fccff55001
6 changed files with 204 additions and 320 deletions

View file

@ -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<DefineExprAccess> def_expr);
virtual ~define_xs() = default;
static const define_xs * from(const exprstate * x) { return dynamic_cast<const define_xs *>(x); }
static std::unique_ptr<define_xs> def_0(rp<DefineExprAccess> 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*/

View file

@ -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 {

View file

@ -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

View file

@ -10,40 +10,31 @@ namespace xo {
}
define_xs::define_xs(rp<DefineExprAccess> 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<Expression> * /* 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<Expression> 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<Expression> * /*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<Expression> * /*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<Expression> expr = this->def_expr_;
std::unique_ptr<exprstate> 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 {

View file

@ -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<Expression> expr = this->gen_expr_;
std::unique_ptr<exprstate> self = p_stack->pop_exprstate(); /* NOT KOSHER. invalidates *this */
std::unique_ptr<exprstate> 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<Expression> expr = this->gen_expr_;
std::unique_ptr<exprstate> self = p_stack->pop_exprstate(); /* NOT KOSHER. invalidates *this */
std::unique_ptr<exprstate> 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;

View file

@ -4,12 +4,15 @@
*/
#include "xo/reader/parser.hpp"
#include "xo/reader/define_xs.hpp"
#include <catch2/catch.hpp>
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);