From 4df9192586cb1b24678a0b3cb31f3ee4b7d84484 Mon Sep 17 00:00:00 2001 From: Roland Conybeare Date: Thu, 1 Aug 2024 16:56:08 +1000 Subject: [PATCH] xo-parser: feature: def may omit explicit type --- include/xo/parser/parser.hpp | 10 +++------- src/parser/parser.cpp | 24 +++++++++++++++++++++++- 2 files changed, 26 insertions(+), 8 deletions(-) diff --git a/include/xo/parser/parser.hpp b/include/xo/parser/parser.hpp index 75dd22dd..e4e8943a 100644 --- a/include/xo/parser/parser.hpp +++ b/include/xo/parser/parser.hpp @@ -141,14 +141,10 @@ namespace xo { /** scaffold a define-expression here **/ rp def_expr_; - rp cvt_expr_; - -#ifdef OBSOLETE - /** e.g. f64 in - * def foo : f64 = 1 + /** scafford a convert-expression here. + * May be nested within a def_expr **/ - TypeDescr def_lhs_td_ = nullptr; -#endif + rp cvt_expr_; }; /*exprstate*/ inline std::ostream & diff --git a/src/parser/parser.cpp b/src/parser/parser.cpp index eef5f821..79c9b73f 100644 --- a/src/parser/parser.cpp +++ b/src/parser/parser.cpp @@ -194,8 +194,27 @@ namespace xo { exprstate::admits_singleassign() const { switch(exs_type_) { case exprstatetype::expect_toplevel_expression_sequence: + + /* + * 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; @@ -203,6 +222,7 @@ namespace xo { return true; case exprstatetype::def_4: + case exprstatetype::expect_rhs_expression: /* rhs-expressions (or expressions for that matter) * may not begin with singleassign '=' @@ -437,7 +457,9 @@ namespace xo { xtag("state", *this))); } - if (this->exs_type_ == exprstatetype::def_3) { + if ((this->exs_type_ == exprstatetype::def_1) + || (this->exs_type_ == exprstatetype::def_3)) + { this->exs_type_ = exprstatetype::def_4; p_stack->push_exprstate(exprstatetype::expect_rhs_expression);