xo-reader: simplify rightparen logic

This commit is contained in:
Roland Conybeare 2024-08-09 20:45:06 -04:00
commit fb30451684
6 changed files with 11 additions and 71 deletions

View file

@ -42,15 +42,12 @@ namespace xo {
defexprstatetype defxs_type() const { return defxs_type_; }
#ifdef OBSOLETE
bool admits_leftparen() const;
#endif
bool admits_rightparen() const;
virtual bool admits_symbol() const override;
virtual bool admits_colon() const override;
virtual bool admits_semicolon() const override;
virtual bool admits_singleassign() const override;
virtual bool admits_rightparen() const override;
// virtual void on_f64(..) override
virtual void on_expr(ref::brw<Expression> expr,
@ -69,11 +66,6 @@ namespace xo {
rp<Expression> * /*p_emit_expr*/) override;
virtual void on_singleassign_token(const token_type & tk,
exprstatestack * p_stack) override;
#ifdef OBSOLETE
virtual void on_leftparen_token(const token_type & tk,
exprstatestack * p_stack,
rp<Expression> * /*p_emit_expr*/) override;
#endif
virtual void on_rightparen_token(const token_type & tk,
exprstatestack * p_stack,
rp<Expression> * /*p_emit_expr*/) override;

View file

@ -90,9 +90,9 @@ namespace xo {
#ifdef OBSOLETE
/** true iff this parsing state admits a leftparen '(' as next token **/
virtual bool admits_leftparen() const;
#endif
/** truee iff this parsing state admits a rightparen ')' as next token **/
virtual bool admits_rightparen() const;
#endif
/** update exprstate in response to incoming token @p tk,
* forward instructions to parent parser

View file

@ -32,6 +32,7 @@ namespace xo {
static std::unique_ptr<paren_xs> lparen_0();
bool admits_f64() const;
bool admits_rightparen() const;
virtual bool admits_symbol() const override;
virtual bool admits_colon() const override;
@ -40,7 +41,6 @@ namespace xo {
#ifdef OBSOLETE
virtual bool admits_leftparen() const override;
#endif
virtual bool admits_rightparen() const override;
virtual void on_expr(ref::brw<Expression> expr,
exprstatestack * p_stack,

View file

@ -30,8 +30,8 @@ namespace xo {
virtual bool admits_singleassign() const override;
#ifdef OBSOLETE
virtual bool admits_leftparen() const override;
#endif
virtual bool admits_rightparen() const override;
#endif
virtual void on_expr(ref::brw<Expression> expr,
exprstatestack * p_stack,

View file

@ -180,50 +180,6 @@ namespace xo {
}
#ifdef OBSOLETE
bool
exprstate::admits_leftparen() const {
switch (exs_type_) {
case exprstatetype::expect_toplevel_expression_sequence:
/* input like
* (function(blah...))
* not allowed at toplevel;
* creates ambiguity e.g. consider
* x := foo
* (bar)
*
* is rhs 'foo' or 'foo(bar)'
*/
return false;
case exprstatetype::defexpr:
case exprstatetype::parenexpr:
case exprstatetype::expect_rhs_expression:
/* unreachable - redirects to define_xs etc */
assert(false);
return false;
case exprstatetype::expect_type:
return false;
case exprstatetype::expect_symbol:
return false;
case exprstatetype::expr_progress:
/* unreachable */
assert(false);
return false;
case exprstatetype::invalid:
case exprstatetype::n_exprstatetype:
/* unreachable */
assert(false);
return false;
}
return false;
}
#endif
bool
exprstate::admits_rightparen() const {
switch (exs_type_) {
@ -255,6 +211,7 @@ namespace xo {
return false;
}
#endif
void
exprstate::on_def_token(const token_type & tk,
@ -428,7 +385,7 @@ namespace xo {
constexpr bool c_debug_flag = true;
scope log(XO_DEBUG(c_debug_flag));
constexpr const char * self_name = "exprstate::on_singleassign";
constexpr const char * self_name = "exprstate::on_singleassign_token";
if (!this->admits_singleassign())
{
@ -448,13 +405,13 @@ namespace xo {
constexpr bool c_debug_flag = true;
scope log(XO_DEBUG(c_debug_flag));
constexpr const char * self_name = "exprstate::on_leftparen";
constexpr const char * self_name = "exprstate::on_leftparen_token";
this->illegal_input_error(self_name, tk);
}
void
exprstate::on_rightparen_token(const token_type & /*tk*/,
exprstate::on_rightparen_token(const token_type & tk,
exprstatestack * /*p_stack*/,
rp<Expression> * /*p_emit_expr*/)
{
@ -463,18 +420,7 @@ namespace xo {
constexpr const char * self_name = "exprstate::on_rightparen";
if (!this->admits_rightparen())
{
throw std::runtime_error(tostr(self_name,
": unexpected rightparen ')' for parsing state",
xtag("state", *this)));
}
if (this->exs_type_ == exprstatetype::expr_progress
|| this->exs_type_ == exprstatetype::parenexpr) {
/* unreachable -- see progress_xs::on_rightparen() etc */
assert(false);
}
this->illegal_input_error(self_name, tk);
}
void

View file

@ -26,11 +26,13 @@ namespace xo {
bool
progress_xs::admits_singleassign() const { return false; }
#ifdef OBSOLETE
bool
progress_xs::admits_rightparen() const {
/* satisfies expression form */
return true;
}
#endif
bool
progress_xs::admits_f64() const { return false; }