xo-reader: + on_expr_with_semicolon() [wip, utest not passing]

This commit is contained in:
Roland Conybeare 2024-08-28 09:33:58 -04:00
commit bc30b34bc2
11 changed files with 88 additions and 2 deletions

View file

@ -81,6 +81,8 @@ namespace xo {
virtual void on_expr(ref::brw<Expression> expr,
parserstatemachine * p_psm) override;
virtual void on_expr_with_semicolon(ref::brw<Expression> expr,
parserstatemachine * p_psm) override;
virtual void on_symbol(const std::string & symbol_name,
parserstatemachine * p_psm) override;
virtual void on_typedescr(TypeDescr td,

View file

@ -47,6 +47,12 @@ namespace xo {
/** update exprstate in response to a successfully-parsed subexpression **/
virtual void on_expr(ref::brw<Expression> 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<Expression> expr,
parserstatemachine * p_psm) override;
private:
static std::unique_ptr<expect_expr_xs> make(bool allow_defs,

View file

@ -107,6 +107,10 @@ namespace xo {
virtual void on_expr(ref::brw<Expression> 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<Expression> expr,
parserstatemachine * p_psm);
/** update exprstate when expecting a symbol **/
virtual void on_symbol(const std::string & symbol,
parserstatemachine * p_psm);

View file

@ -48,6 +48,8 @@ namespace xo {
parserstatemachine * p_psm) override;
virtual void on_expr(ref::brw<Expression> expr,
parserstatemachine * p_psm) override;
virtual void on_expr_with_semicolon(ref::brw<Expression> expr,
parserstatemachine * p_psm) override;
virtual void on_semicolon_token(const token_type & tk,
parserstatemachine * p_psm) override;

View file

@ -45,10 +45,13 @@ namespace xo {
// ----- parsing outputs -----
void on_expr(ref::brw<Expression> expr);
void on_expr_with_semicolon(ref::brw<Expression> 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);

View file

@ -88,6 +88,13 @@ namespace xo {
}
exprstate::on_expr(expr, p_psm);
void
define_xs::on_expr_with_semicolon(ref::brw<Expression> 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

View file

@ -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<Expression> 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<exprstate> self = p_psm->pop_exprstate();
p_psm->on_expr_with_semicolon(expr);
} /*on_expr_with_semicolon*/
} /*namespace scm*/
} /*namespace xo*/

View file

@ -387,6 +387,19 @@ namespace xo {
assert(false);
} /*on_expr*/
void
exprstate::on_expr_with_semicolon(ref::brw<Expression> 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*/)

View file

@ -66,6 +66,14 @@ namespace xo {
}
}
void
lambda_xs::on_expr_with_semicolon(ref::brw<Expression> 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)

View file

@ -48,6 +48,32 @@ namespace xo {
p_env_stack_->pop_envframe();
}
void
parserstatemachine::on_expr(ref::brw<Expression> 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<Expression> 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)
{

View file

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