diff --git a/xo-expression2/include/xo/expression2/DDefineExpr.hpp b/xo-expression2/include/xo/expression2/DDefineExpr.hpp index 94a37197..618e4161 100644 --- a/xo-expression2/include/xo/expression2/DDefineExpr.hpp +++ b/xo-expression2/include/xo/expression2/DDefineExpr.hpp @@ -25,6 +25,9 @@ namespace xo { using TypeDescr = xo::reflect::TypeDescr; public: + /** @defgroup scm-defineexpr-constructors **/ + ///@{ + /** create instance: define-expr using memory from @p mm * with lhs name @p lhs_name and rhs expression @p rhs_expr **/ @@ -35,14 +38,20 @@ namespace xo { **/ static DDefineExpr * make_empty(obj mm); + DDefineExpr(DVariable * lhs_var, + obj rhs); + + ///@} + /** @defgroup scm-definexpr-access-methods **/ + ///@{ + DVariable * lhs() const { return lhs_var_; } obj rhs() const noexcept { return rhs_; } - const DUniqueString * name() const noexcept; void assign_lhs_name(const DUniqueString * name); - /** CONCESSION. will use DUniqueString* once we have StringTable **/ - void assign_lhs_name(std::string_view name); + + ///@} /** @defgroup scm-defineexpr-expression-facet **/ ///@{ @@ -55,10 +64,9 @@ namespace xo { ///@} private: - DDefineExpr(DVariable * lhs_var, - obj rhs); + /** @defgrouop scm-defineexpr-instance-vars **/ + ///@{ - private: /** variable being defined by this expression. **/ DVariable * lhs_var_ = nullptr; @@ -68,6 +76,8 @@ namespace xo { obj rhs_; // std::set free_var_set_; + + ///@} }; } /*namespace scm*/ } /*namespace xo*/ diff --git a/xo-expression2/src/expression2/DDefineExpr.cpp b/xo-expression2/src/expression2/DDefineExpr.cpp index ada633f6..a5609246 100644 --- a/xo-expression2/src/expression2/DDefineExpr.cpp +++ b/xo-expression2/src/expression2/DDefineExpr.cpp @@ -55,15 +55,6 @@ namespace xo { lhs_var_->assign_name(name); } - void - DDefineExpr::assign_lhs_name(std::string_view name) - { - scope log(XO_DEBUG(true), "bogus impl - will require unique string"); - log && log(xtag("name", name)); - - //lhs_var_->assign_name(name); - } - void DDefineExpr::assign_valuetype(TypeDescr td) noexcept { diff --git a/xo-reader2/include/xo/reader2/ParserStateMachine.hpp b/xo-reader2/include/xo/reader2/ParserStateMachine.hpp index fb276bd0..b333dd51 100644 --- a/xo-reader2/include/xo/reader2/ParserStateMachine.hpp +++ b/xo-reader2/include/xo/reader2/ParserStateMachine.hpp @@ -69,6 +69,10 @@ namespace xo { /** pop syntax state machine from top of @ref stack_ **/ void pop_ssm(); + /** get unique string copy of @p str. Idempotent for each @p str. + **/ + const DUniqueString * intern_string(std::string_view str); + /** add variable to current local environment (innermost lexical scope) **/ void upsert_var(DVariable * var); diff --git a/xo-reader2/src/reader2/DDefineSsm.cpp b/xo-reader2/src/reader2/DDefineSsm.cpp index adf9f429..eabc1868 100644 --- a/xo-reader2/src/reader2/DDefineSsm.cpp +++ b/xo-reader2/src/reader2/DDefineSsm.cpp @@ -412,12 +412,15 @@ namespace xo { } void - DDefineSsm::on_parsed_symbol(std::string_view sym, + DDefineSsm::on_parsed_symbol(std::string_view sym_name, ParserStateMachine * p_psm) { if (this->defstate_ == defexprstatetype::def_1) { this->defstate_ = defexprstatetype::def_2; + const DUniqueString * sym + = p_psm->intern_string(sym_name); + def_expr_.data()->assign_lhs_name(sym); // if this is a genuine top-level define (i.e. nesting level = 0), @@ -448,7 +451,7 @@ namespace xo { } p_psm->illegal_input_on_symbol("DDefineSsm::on_parsed_symbol", - sym, + sym_name, this->get_expect_str()); } diff --git a/xo-reader2/src/reader2/ParserStateMachine.cpp b/xo-reader2/src/reader2/ParserStateMachine.cpp index 1766f652..ca8bba8b 100644 --- a/xo-reader2/src/reader2/ParserStateMachine.cpp +++ b/xo-reader2/src/reader2/ParserStateMachine.cpp @@ -73,6 +73,12 @@ namespace xo { this->stack_ = ParserStack::pop(stack_, parser_alloc_); } + const DUniqueString * + ParserStateMachine::intern_string(std::string_view str) + { + return stringtable_.intern(str); + } + void ParserStateMachine::upsert_var(DVariable * var) {