diff --git a/include/xo/reader/define_xs.hpp b/include/xo/reader/define_xs.hpp index c872a58b..41bf90d4 100644 --- a/include/xo/reader/define_xs.hpp +++ b/include/xo/reader/define_xs.hpp @@ -20,6 +20,8 @@ namespace xo { static std::unique_ptr def_0(rp def_expr); + virtual bool admits_definition() const override; + // virtual void on_f64(..) override virtual void on_expr(ref::brw expr, exprstatestack * p_stack, rp * p_emit_expr) override; diff --git a/src/reader/define_xs.cpp b/src/reader/define_xs.cpp index 09148c9e..5da374ad 100644 --- a/src/reader/define_xs.cpp +++ b/src/reader/define_xs.cpp @@ -10,6 +10,43 @@ namespace xo { def_expr) {} + bool + define_xs::admits_definition() const + { + switch (exs_type_) { + case exprstatetype::expect_toplevel_expression_sequence: + /* unreachable */ + assert(false); + 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: + /* 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: + /* unreachable */ + assert(false); + return false; + } + + return false; + } + void define_xs::on_expr(ref::brw expr, exprstatestack * /* p_stack */, diff --git a/src/reader/parser.cpp b/src/reader/parser.cpp index 8e0df1ef..e5700bdd 100644 --- a/src/reader/parser.cpp +++ b/src/reader/parser.cpp @@ -70,11 +70,7 @@ namespace xo { case exprstatetype::def_3: case exprstatetype::def_4: case exprstatetype::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 - */ + /* unreachable */ return false; case exprstatetype::lparen_0: case exprstatetype::lparen_1: