xo-reader: refactor: splitoff defexpr state machine from exprstate
This commit is contained in:
parent
3a0a455b2c
commit
fccff55001
6 changed files with 204 additions and 320 deletions
|
|
@ -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*/
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue