diff --git a/include/xo/reader/define_xs.hpp b/include/xo/reader/define_xs.hpp index 4cd4a297..2f3e0879 100644 --- a/include/xo/reader/define_xs.hpp +++ b/include/xo/reader/define_xs.hpp @@ -24,6 +24,7 @@ namespace xo { 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 void on_f64(..) override virtual void on_expr(ref::brw expr, diff --git a/src/reader/define_xs.cpp b/src/reader/define_xs.cpp index 85efffea..449eaeb6 100644 --- a/src/reader/define_xs.cpp +++ b/src/reader/define_xs.cpp @@ -146,6 +146,60 @@ namespace xo { return false; } + bool + define_xs::admits_singleassign() const { + switch (exs_type_) { + case exprstatetype::expect_toplevel_expression_sequence: + /* unreachable */ + assert(false); + return false; + + /* + * def foo = 1 ; + * def foo : f64 = 1 ; + * ^ ^ ^ ^ ^ ^ ^ + * | | | | | | (done) + * | | | | | def_4:expect_rhs_expression + * | | | | def_3 + * | | | def_2:expect_type + * | | def_1 + * | def_0:expect_symbol + * expect_toplevel_expression_sequence + * + * note that we skip from def_1 -> def_4 if '=' instead of ':' + */ + case exprstatetype::def_0: + return false; + + case exprstatetype::def_1: + return true; + + case exprstatetype::def_2: + return false; + + case exprstatetype::def_3: + return true; + + case exprstatetype::def_4: + case exprstatetype::def_5: + 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 */ + /* unreachable */ + assert(false); + return false; + } + + return false; + } void define_xs::on_expr(ref::brw expr, exprstatestack * /* p_stack */,