diff --git a/include/xo/reader/expect_expr_xs.hpp b/include/xo/reader/expect_expr_xs.hpp index 6e039c79..d826b5ae 100644 --- a/include/xo/reader/expect_expr_xs.hpp +++ b/include/xo/reader/expect_expr_xs.hpp @@ -19,6 +19,10 @@ namespace xo { static std::unique_ptr expect_rhs_expression(); + virtual void on_f64_token(const token_type & tk, + exprstatestack * p_stack, + rp * p_emit_expr) override; + private: }; diff --git a/include/xo/reader/exprstate.hpp b/include/xo/reader/exprstate.hpp index 1a0219e6..2ac8cf67 100644 --- a/include/xo/reader/exprstate.hpp +++ b/include/xo/reader/exprstate.hpp @@ -96,8 +96,10 @@ namespace xo { virtual bool admits_leftparen() const; /** truee iff this parsing state admits a rightparen ')' as next token **/ virtual bool admits_rightparen() const; +#ifdef OBSOLETE /** true iff this parsing state admits a 64-bit floating point literal token **/ virtual bool admits_f64() const; +#endif /** update exprstate in response to incoming token @p tk, * forward instructions to parent parser diff --git a/include/xo/reader/paren_xs.hpp b/include/xo/reader/paren_xs.hpp index 670a62c3..31e3e45c 100644 --- a/include/xo/reader/paren_xs.hpp +++ b/include/xo/reader/paren_xs.hpp @@ -31,16 +31,14 @@ namespace xo { static std::unique_ptr lparen_0(); -#ifdef OBSOLETE - virtual bool admits_definition() const override; -#endif + bool admits_f64() 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_leftparen() const override; virtual bool admits_rightparen() const override; - virtual bool admits_f64() const override; virtual void on_expr(ref::brw expr, exprstatestack * p_stack, diff --git a/include/xo/reader/progress_xs.hpp b/include/xo/reader/progress_xs.hpp index 9df42717..9131b048 100644 --- a/include/xo/reader/progress_xs.hpp +++ b/include/xo/reader/progress_xs.hpp @@ -22,16 +22,14 @@ namespace xo { static std::unique_ptr make(rp valex); -#ifdef OBSOLETE - virtual bool admits_definition() const override; -#endif + bool admits_f64() 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_leftparen() const override; virtual bool admits_rightparen() const override; - virtual bool admits_f64() const override; virtual void on_expr(ref::brw expr, exprstatestack * p_stack, diff --git a/src/reader/define_xs.cpp b/src/reader/define_xs.cpp index 5dc5c760..ad6c994f 100644 --- a/src/reader/define_xs.cpp +++ b/src/reader/define_xs.cpp @@ -425,12 +425,7 @@ namespace xo { constexpr const char * self_name = "exprstate::on_f64"; - if (!this->admits_f64()) - { - this->illegal_input_error(self_name, tk); - } - - assert(false); + this->illegal_input_error(self_name, tk); } void diff --git a/src/reader/expect_expr_xs.cpp b/src/reader/expect_expr_xs.cpp index ddc75aa6..78a69be2 100644 --- a/src/reader/expect_expr_xs.cpp +++ b/src/reader/expect_expr_xs.cpp @@ -4,8 +4,12 @@ */ #include "expect_expr_xs.hpp" +#include "progress_xs.hpp" +#include "xo/expression/Constant.hpp" namespace xo { + using xo::ast::Constant; + namespace scm { std::unique_ptr @@ -18,6 +22,26 @@ namespace xo { : exprstate(exprstatetype::expect_rhs_expression) {} + void + expect_expr_xs::on_f64_token(const token_type & tk, + exprstatestack * p_stack, + rp * /*p_emit_expr*/) + { + constexpr bool c_debug_flag = true; + scope log(XO_DEBUG(c_debug_flag)); + + //constexpr const char * self_name = "exprstate::on_f64_token"; + + /* e.g. + * def pi = 3.14159265; + * \---tk---/ + */ + p_stack->push_exprstate + (progress_xs::make + (Constant::make(tk.f64_value()))); + } + + } /*namespace scm*/ } /*namespace xo*/ diff --git a/src/reader/exprstate.cpp b/src/reader/exprstate.cpp index 88154353..8161f62e 100644 --- a/src/reader/exprstate.cpp +++ b/src/reader/exprstate.cpp @@ -257,19 +257,18 @@ namespace xo { return false; } +#ifdef OBSOLETE bool exprstate::admits_f64() const { switch (exs_type_) { case exprstatetype::expect_toplevel_expression_sequence: case exprstatetype::defexpr: case exprstatetype::parenexpr: + case exprstatetype::expect_rhs_expression: /* unreachable - redirects to define_xs */ assert(false); return false; - case exprstatetype::expect_rhs_expression: - return true; - case exprstatetype::expect_symbol: case exprstatetype::expect_type: return false; @@ -287,6 +286,7 @@ namespace xo { return false; } +#endif void exprstate::on_def_token(const token_type & tk, @@ -522,7 +522,7 @@ namespace xo { void exprstate::on_f64_token(const token_type & tk, - exprstatestack * p_stack, + exprstatestack * /*p_stack*/, rp * /*p_emit_expr*/) { constexpr bool c_debug_flag = true; @@ -530,24 +530,7 @@ namespace xo { constexpr const char * self_name = "exprstate::on_f64"; - if (!this->admits_f64()) - { - throw std::runtime_error(tostr(self_name, - ": unexpected floating-point literal for parsing state", - xtag("state", *this))); - } - - if (this->exs_type_ == exprstatetype::expect_rhs_expression) { - /* e.g. - * def pi = 3.14159265; - * \---tk---/ - */ - p_stack->push_exprstate - (progress_xs::make - (Constant::make(tk.f64_value()))); - } else { - assert(false); - } + this->illegal_input_error(self_name, tk); } void