xo-reader: simplify rightparen logic
This commit is contained in:
parent
538c9d90e5
commit
fb30451684
6 changed files with 11 additions and 71 deletions
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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; }
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue