xo-reader: parserstatemachine -> consolidate on_expr() args
This commit is contained in:
parent
355f73b2a1
commit
bdf75d5620
14 changed files with 29 additions and 47 deletions
|
|
@ -75,8 +75,7 @@ namespace xo {
|
|||
defexprstatetype defxs_type() const { return defxs_type_; }
|
||||
|
||||
virtual void on_expr(ref::brw<Expression> expr,
|
||||
exprstatestack * p_stack,
|
||||
rp<Expression> * p_emit_expr) override;
|
||||
parserstatemachine * p_psm) override;
|
||||
virtual void on_symbol(const std::string & symbol_name,
|
||||
parserstatemachine * p_psm) override;
|
||||
virtual void on_typedescr(TypeDescr td,
|
||||
|
|
|
|||
|
|
@ -33,8 +33,7 @@ namespace xo {
|
|||
|
||||
/** update exprstate in response to a successfully-parsed subexpression **/
|
||||
virtual void on_expr(ref::brw<Expression> expr,
|
||||
exprstatestack * p_stack,
|
||||
rp<Expression> * p_emit_expr) override;
|
||||
parserstatemachine * p_psm) override;
|
||||
|
||||
private:
|
||||
static std::unique_ptr<expect_expr_xs> make();
|
||||
|
|
|
|||
|
|
@ -33,8 +33,7 @@ namespace xo {
|
|||
virtual void on_typedescr(TypeDescr td,
|
||||
parserstatemachine * p_psm) override;
|
||||
virtual void on_expr(ref::brw<Expression> expr,
|
||||
exprstatestack * p_stack,
|
||||
rp<Expression> * p_emit_expr) override;
|
||||
parserstatemachine * p_psm) override;
|
||||
|
||||
private:
|
||||
static std::unique_ptr<exprseq_xs> make();
|
||||
|
|
|
|||
|
|
@ -95,8 +95,7 @@ namespace xo {
|
|||
|
||||
/** update exprstate in response to a successfully-parsed subexpression **/
|
||||
virtual void on_expr(ref::brw<Expression> expr,
|
||||
exprstatestack * p_stack,
|
||||
rp<Expression> * p_emit_expr);
|
||||
parserstatemachine * p_psm);
|
||||
|
||||
/** update exprstate when expecting a symbol **/
|
||||
virtual void on_symbol(const std::string & symbol,
|
||||
|
|
|
|||
|
|
@ -47,8 +47,7 @@ namespace xo {
|
|||
virtual void on_formal_arglist(const std::vector<rp<Variable>> & argl,
|
||||
parserstatemachine * p_psm) override;
|
||||
virtual void on_expr(ref::brw<Expression> expr,
|
||||
exprstatestack * p_stack,
|
||||
rp<Expression> * p_emit_expr) override;
|
||||
parserstatemachine * p_psm) override;
|
||||
virtual void on_semicolon_token(const token_type & tk,
|
||||
parserstatemachine * p_psm) override;
|
||||
|
||||
|
|
|
|||
|
|
@ -35,8 +35,7 @@ namespace xo {
|
|||
bool admits_rightparen() const;
|
||||
|
||||
virtual void on_expr(ref::brw<Expression> expr,
|
||||
exprstatestack * p_stack,
|
||||
rp<Expression> * p_emit_expr) override;
|
||||
parserstatemachine * p_psm) override;
|
||||
virtual void on_symbol(const std::string & symbol,
|
||||
parserstatemachine * p_psm) override;
|
||||
virtual void on_typedescr(TypeDescr td,
|
||||
|
|
|
|||
|
|
@ -56,8 +56,7 @@ namespace xo {
|
|||
bool admits_f64() const;
|
||||
|
||||
virtual void on_expr(ref::brw<Expression> expr,
|
||||
exprstatestack * p_stack,
|
||||
rp<Expression> * p_emit_expr) override;
|
||||
parserstatemachine * p_psm) override;
|
||||
virtual void on_symbol_token(const token_type & tk,
|
||||
parserstatemachine * p_psm) override;
|
||||
virtual void on_typedescr(TypeDescr td,
|
||||
|
|
|
|||
|
|
@ -30,8 +30,7 @@ namespace xo {
|
|||
|
||||
void
|
||||
define_xs::on_expr(ref::brw<Expression> expr,
|
||||
exprstatestack * p_stack,
|
||||
rp<Expression> * p_emit_expr)
|
||||
parserstatemachine * p_psm)
|
||||
{
|
||||
if (this->defxs_type_ == defexprstatetype::def_5) {
|
||||
/* have all the ingredients to create an expression
|
||||
|
|
@ -54,7 +53,7 @@ namespace xo {
|
|||
return;
|
||||
}
|
||||
|
||||
exprstate::on_expr(expr, p_stack, p_emit_expr);
|
||||
exprstate::on_expr(expr, p_psm);
|
||||
}
|
||||
|
||||
void
|
||||
|
|
@ -133,7 +132,6 @@ namespace xo {
|
|||
scope log(XO_DEBUG(c_debug_flag));
|
||||
|
||||
auto p_stack = p_psm->p_stack_;
|
||||
auto p_emit_expr = p_psm->p_emit_expr_;
|
||||
|
||||
//constexpr const char * self_name = "exprstate::on_semicolon";
|
||||
|
||||
|
|
@ -142,9 +140,7 @@ namespace xo {
|
|||
|
||||
std::unique_ptr<exprstate> self = p_stack->pop_exprstate();
|
||||
|
||||
p_stack->top_exprstate().on_expr(expr,
|
||||
p_stack,
|
||||
p_emit_expr);
|
||||
p_stack->top_exprstate().on_expr(expr, p_psm);
|
||||
} else {
|
||||
exprstate::on_semicolon_token(tk, p_psm);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -118,8 +118,7 @@ namespace xo {
|
|||
|
||||
void
|
||||
expect_expr_xs::on_expr(ref::brw<Expression> expr,
|
||||
exprstatestack * p_stack,
|
||||
rp<Expression> * p_emit_expr)
|
||||
parserstatemachine * p_psm)
|
||||
{
|
||||
constexpr bool c_debug_flag = true;
|
||||
scope log(XO_DEBUG(c_debug_flag));
|
||||
|
|
@ -127,12 +126,11 @@ namespace xo {
|
|||
log && log(xtag("exstype", this->exs_type_),
|
||||
xtag("expr", expr));
|
||||
|
||||
auto p_stack = p_psm->p_stack_;
|
||||
|
||||
std::unique_ptr<exprstate> self = p_stack->pop_exprstate();
|
||||
|
||||
p_stack->top_exprstate().on_expr(expr,
|
||||
p_stack,
|
||||
p_emit_expr);
|
||||
p_stack->top_exprstate().on_expr(expr, p_psm);
|
||||
} /*on_expr*/
|
||||
|
||||
} /*namespace scm*/
|
||||
|
|
|
|||
|
|
@ -3,6 +3,7 @@
|
|||
#include "exprseq_xs.hpp"
|
||||
#include "define_xs.hpp"
|
||||
#include "expect_symbol_xs.hpp"
|
||||
#include "parserstatemachine.hpp"
|
||||
|
||||
namespace xo {
|
||||
namespace scm {
|
||||
|
|
@ -60,8 +61,7 @@ namespace xo {
|
|||
|
||||
void
|
||||
exprseq_xs::on_expr(ref::brw<Expression> expr,
|
||||
exprstatestack * /*p_stack*/,
|
||||
rp<Expression> * p_emit_expr)
|
||||
parserstatemachine * p_psm)
|
||||
{
|
||||
/* toplevel expression sequence accepts an
|
||||
* arbitrary number of expressions.
|
||||
|
|
@ -69,6 +69,8 @@ namespace xo {
|
|||
* parser::include_token() returns
|
||||
*/
|
||||
|
||||
auto p_emit_expr = p_psm->p_emit_expr_;
|
||||
|
||||
*p_emit_expr = expr.promote();
|
||||
} /*on_expr*/
|
||||
|
||||
|
|
|
|||
|
|
@ -346,8 +346,7 @@ namespace xo {
|
|||
|
||||
void
|
||||
exprstate::on_expr(ref::brw<Expression> expr,
|
||||
exprstatestack * /*p_stack*/,
|
||||
rp<Expression> * /*p_emit_expr*/)
|
||||
parserstatemachine * /*p_psm*/)
|
||||
{
|
||||
constexpr bool c_debug_flag = true;
|
||||
scope log(XO_DEBUG(c_debug_flag));
|
||||
|
|
|
|||
|
|
@ -59,14 +59,13 @@ namespace xo {
|
|||
|
||||
void
|
||||
lambda_xs::on_expr(ref::brw<Expression> expr,
|
||||
exprstatestack * p_stack,
|
||||
rp<Expression> * p_emit_expr)
|
||||
parserstatemachine * p_psm)
|
||||
{
|
||||
if (lmxs_type_ == lambdastatetype::lm_2) {
|
||||
this->lmxs_type_ = lambdastatetype::lm_3;
|
||||
this->body_ = expr.promote();
|
||||
} else {
|
||||
exprstate::on_expr(expr, p_stack, p_emit_expr);
|
||||
exprstate::on_expr(expr, p_psm);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -75,7 +74,6 @@ namespace xo {
|
|||
parserstatemachine * p_psm)
|
||||
{
|
||||
auto p_stack = p_psm->p_stack_;
|
||||
auto p_emit_expr = p_psm->p_emit_expr_;
|
||||
|
||||
if (lmxs_type_ == lambdastatetype::lm_3) {
|
||||
/* done! */
|
||||
|
|
@ -86,7 +84,7 @@ namespace xo {
|
|||
|
||||
rp<Lambda> lm = Lambda::make(name, argl_, body_);
|
||||
|
||||
p_stack->top_exprstate().on_expr(lm, p_stack, p_emit_expr);
|
||||
p_stack->top_exprstate().on_expr(lm, p_psm);
|
||||
p_stack->top_exprstate().on_semicolon_token(tk, p_psm);
|
||||
|
||||
return;
|
||||
|
|
|
|||
|
|
@ -152,11 +152,10 @@ namespace xo {
|
|||
rp<Expression> expr = this->gen_expr_;
|
||||
|
||||
auto p_stack = p_psm->p_stack_;
|
||||
auto p_emit_expr = p_psm->p_emit_expr_;
|
||||
|
||||
std::unique_ptr<exprstate> self = p_stack->pop_exprstate();
|
||||
|
||||
p_stack->top_exprstate().on_expr(expr, p_stack, p_emit_expr);
|
||||
p_stack->top_exprstate().on_expr(expr, p_psm);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -174,8 +173,7 @@ namespace xo {
|
|||
|
||||
void
|
||||
paren_xs::on_expr(ref::brw<Expression> expr,
|
||||
exprstatestack * p_stack,
|
||||
rp<Expression> * /*p_emit_expr*/)
|
||||
parserstatemachine * p_psm)
|
||||
{
|
||||
constexpr bool c_debug_flag = true;
|
||||
scope log(XO_DEBUG(c_debug_flag));
|
||||
|
|
@ -186,6 +184,8 @@ namespace xo {
|
|||
switch (this->parenxs_type_) {
|
||||
case parenexprstatetype::lparen_0: {
|
||||
this->parenxs_type_ = parenexprstatetype::lparen_1; /* wants on_rightparen */
|
||||
auto p_stack = p_psm->p_stack_;
|
||||
|
||||
progress_xs::start(expr.promote(), p_stack);
|
||||
|
||||
return;
|
||||
|
|
|
|||
|
|
@ -134,8 +134,7 @@ namespace xo {
|
|||
|
||||
void
|
||||
progress_xs::on_expr(ref::brw<Expression> expr,
|
||||
exprstatestack * /*p_stack*/,
|
||||
rp<Expression> * /*p_emit_expr*/)
|
||||
parserstatemachine * /*p_psm*/)
|
||||
{
|
||||
/* note: previous token probably an operator,
|
||||
* handled from progress_xs::on_operator_token(),
|
||||
|
|
@ -200,15 +199,13 @@ namespace xo {
|
|||
scope log(XO_DEBUG(c_debug_flag));
|
||||
|
||||
auto p_stack = p_psm->p_stack_;
|
||||
auto p_emit_expr = p_psm->p_emit_expr_;
|
||||
|
||||
rp<Expression> expr = this->assemble_expr();
|
||||
|
||||
std::unique_ptr<exprstate> self = p_stack->pop_exprstate();
|
||||
|
||||
p_stack->top_exprstate().on_expr(expr,
|
||||
p_stack,
|
||||
p_emit_expr);
|
||||
p_stack->top_exprstate().on_expr(expr, p_psm);
|
||||
|
||||
/* control here on input like:
|
||||
* (1.234;
|
||||
*
|
||||
|
|
@ -261,7 +258,6 @@ namespace xo {
|
|||
constexpr const char * self_name = "progress_xs::on_rightparen";
|
||||
|
||||
auto p_stack = p_psm->p_stack_;
|
||||
auto p_emit_expr = p_psm->p_emit_expr_;
|
||||
|
||||
/* stack may be something like:
|
||||
*
|
||||
|
|
@ -286,7 +282,7 @@ namespace xo {
|
|||
|
||||
log && log(xtag("stack", p_stack));
|
||||
|
||||
p_stack->top_exprstate().on_expr(expr, p_stack, p_emit_expr);
|
||||
p_stack->top_exprstate().on_expr(expr, p_psm);
|
||||
|
||||
/* now deliver rightparen */
|
||||
p_stack->top_exprstate().on_rightparen_token(tk, p_psm);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue