diff --git a/include/xo/reader/expect_type_xs.hpp b/include/xo/reader/expect_type_xs.hpp index 261074f9..c75c91cb 100644 --- a/include/xo/reader/expect_type_xs.hpp +++ b/include/xo/reader/expect_type_xs.hpp @@ -17,6 +17,10 @@ namespace xo { expect_type_xs(); static std::unique_ptr make(); + + virtual void on_symbol_token(const token_type & tk, + exprstatestack * p_stack, + rp * p_emit_expr) override; }; } /*namespace scm*/ } /*namespace xo*/ diff --git a/src/reader/expect_type_xs.cpp b/src/reader/expect_type_xs.cpp index 65f0f7a9..6c4c5afb 100644 --- a/src/reader/expect_type_xs.cpp +++ b/src/reader/expect_type_xs.cpp @@ -5,8 +5,11 @@ #include "expect_type_xs.hpp" #include "exprstate.hpp" +#include "xo/reflect/Reflect.hpp" namespace xo { + using xo::reflect::Reflect; + namespace scm { std::unique_ptr expect_type_xs::make() { @@ -17,6 +20,39 @@ namespace xo { : exprstate(exprstatetype::expect_type) {} + void + expect_type_xs::on_symbol_token(const token_type & tk, + exprstatestack * p_stack, + rp * p_emit_expr) + { + const char * c_self_name = "expect_type_xs::on_symbol_token"; + + TypeDescr td = nullptr; + + /* TODO: replace with typetable lookup */ + + if (tk.text() == "f64") + td = Reflect::require(); + else if(tk.text() == "f32") + td = Reflect::require(); + else if(tk.text() == "i16") + td = Reflect::require(); + else if(tk.text() == "i32") + td = Reflect::require(); + else if(tk.text() == "i64") + td = Reflect::require(); + + if (!td) { + throw std::runtime_error + (tostr(c_self_name, + ": unknown type name", + " (expecting f64|f32|i16|i32|i64)", + xtag("typename", tk.text()))); + } + + std::unique_ptr self = p_stack->pop_exprstate(); + p_stack->top_exprstate().on_typedescr(td, p_stack, p_emit_expr); + } } /*namespace scm*/ } /*namespace xo*/ diff --git a/src/reader/exprstate.cpp b/src/reader/exprstate.cpp index aa916b0d..1b7bd878 100644 --- a/src/reader/exprstate.cpp +++ b/src/reader/exprstate.cpp @@ -180,7 +180,7 @@ namespace xo { void exprstate::on_symbol_token(const token_type & tk, exprstatestack * p_stack, - rp * p_emit_expr) + rp * /*p_emit_expr*/) { constexpr bool c_debug_flag = true; scope log(XO_DEBUG(c_debug_flag)); @@ -199,39 +199,11 @@ namespace xo { case exprstatetype::parenexpr: case exprstatetype::expect_rhs_expression: case exprstatetype::expect_symbol: + case exprstatetype::expect_type: /* unreachable - redirected to define_xs etc */ assert(false); return; - case exprstatetype::expect_type: { - TypeDescr td = nullptr; - - /* TODO: replace with typetable lookup */ - - if (tk.text() == "f64") - td = Reflect::require(); - else if(tk.text() == "f32") - td = Reflect::require(); - else if(tk.text() == "i16") - td = Reflect::require(); - else if(tk.text() == "i32") - td = Reflect::require(); - else if(tk.text() == "i64") - td = Reflect::require(); - - if (!td) { - throw std::runtime_error - (tostr(c_self_name, - ": unknown type name", - " (expecting f64|f32|i16|i32|i64)", - xtag("typename", tk.text()))); - } - - std::unique_ptr self = p_stack->pop_exprstate(); - p_stack->top_exprstate().on_typedescr(td, p_stack, p_emit_expr); - return; - } - case exprstatetype::expr_progress: /* unreachable */ assert(false);