From 1ae512b261f8c1e4d83b77624b184c08800830fd Mon Sep 17 00:00:00 2001 From: Roland Conybeare Date: Thu, 27 Nov 2025 11:50:34 -0500 Subject: [PATCH] xo-interpreter: plumb initial global symtab so builtins reach parser --- examples/exprrepl/exprrepl.cpp | 5 +++-- examples/exprreplxx/exprreplxx.cpp | 4 +++- include/xo/reader/parser.hpp | 6 +++++- include/xo/reader/reader.hpp | 3 ++- src/reader/parser.cpp | 6 ++++-- src/reader/reader.cpp | 4 ++-- utest/parser.test.cpp | 5 ++++- utest/reader.test.cpp | 5 ++++- 8 files changed, 27 insertions(+), 11 deletions(-) diff --git a/examples/exprrepl/exprrepl.cpp b/examples/exprrepl/exprrepl.cpp index 6555e847..64e1c977 100644 --- a/examples/exprrepl/exprrepl.cpp +++ b/examples/exprrepl/exprrepl.cpp @@ -46,10 +46,11 @@ main() { using span_type = xo::scm::span; bool interactive = isatty(STDIN_FILENO); - bool c_debug_flag = false; - reader rdr(c_debug_flag); + auto toplevel_symtab = GlobalSymtab::make_empty(); + + reader rdr(toplevel_symtab, c_debug_flag); rdr.begin_interactive_session(); string input_str; diff --git a/examples/exprreplxx/exprreplxx.cpp b/examples/exprreplxx/exprreplxx.cpp index b338bd2e..e9d8079c 100644 --- a/examples/exprreplxx/exprreplxx.cpp +++ b/examples/exprreplxx/exprreplxx.cpp @@ -83,7 +83,9 @@ main() constexpr bool c_debug_flag = false; - reader rdr(c_debug_flag); + rp toplevel_symtab = GlobalSymtab::make_empty(); + + reader rdr(toplevel_symtab, c_debug_flag); rdr.begin_interactive_session(); string input_str; diff --git a/include/xo/reader/parser.hpp b/include/xo/reader/parser.hpp index 9ef70f83..9db626ee 100644 --- a/include/xo/reader/parser.hpp +++ b/include/xo/reader/parser.hpp @@ -9,6 +9,7 @@ #include "envframestack.hpp" #include "parser_result.hpp" #include "parserstatemachine.hpp" +#include "xo/expression/GlobalSymtab.hpp" #include namespace xo { @@ -161,9 +162,12 @@ namespace xo { /** create parser in initial state; * parser is ready to receive tokens via @ref include_token * + * At least for xo-interpreter will have non-empty symbol table. + * + * @p toplevel_symtab symbol table. * @p debug_flag true to enable debug logging **/ - explicit parser(bool debug_flag); + parser(const rp & toplevel_symtab, bool debug_flag); bool debug_flag() const { return psm_.debug_flag(); } diff --git a/include/xo/reader/reader.hpp b/include/xo/reader/reader.hpp index 546b923c..5d0ec503 100644 --- a/include/xo/reader/reader.hpp +++ b/include/xo/reader/reader.hpp @@ -8,6 +8,7 @@ #include "parser.hpp" #include "reader_error.hpp" #include "xo/expression/Expression.hpp" +#include "xo/expression/GlobalSymtab.hpp" #include "xo/expression/pretty_expression.hpp" #include "xo/tokenizer/tokenizer.hpp" @@ -78,7 +79,7 @@ namespace xo { using span_type = tokenizer_type::span_type; public: - explicit reader(bool debug_flag); + reader(const rp & toplevel_symtab, bool debug_flag); bool debug_flag() const { return parser_.debug_flag(); } diff --git a/src/reader/parser.cpp b/src/reader/parser.cpp index 2469593b..3c3f7050 100644 --- a/src/reader/parser.cpp +++ b/src/reader/parser.cpp @@ -24,13 +24,15 @@ namespace xo { namespace scm { // ----- parser ----- - parser::parser(bool debug_flag) + parser::parser(const rp & toplevel_symtab, bool debug_flag) : psm_{debug_flag} { +#ifdef OBSOLETE /* top-level environment. initially empty */ rp toplevel_env = GlobalSymtab::make_empty(); +#endif - this->psm_.env_stack_.push_envframe(toplevel_env); + this->psm_.env_stack_.push_envframe(toplevel_symtab); } bool diff --git a/src/reader/reader.cpp b/src/reader/reader.cpp index b19ea718..7bac4435 100644 --- a/src/reader/reader.cpp +++ b/src/reader/reader.cpp @@ -4,9 +4,9 @@ namespace xo { namespace scm { - reader::reader(bool debug_flag) : + reader::reader(const rp & toplevel_symtab, bool debug_flag) : tokenizer_{debug_flag}, - parser_{debug_flag} + parser_{toplevel_symtab, debug_flag} {} void diff --git a/utest/parser.test.cpp b/utest/parser.test.cpp index 004b8497..3d6f3fac 100644 --- a/utest/parser.test.cpp +++ b/utest/parser.test.cpp @@ -10,6 +10,7 @@ namespace xo { using parser_type = xo::scm::parser; using token_type = parser_type::token_type; + using xo::scm::GlobalSymtab; using xo::scm::exprstatetype; using xo::scm::define_xs; using xo::scm::defexprstatetype; @@ -23,7 +24,9 @@ namespace xo { for (std::size_t i_tc = 0; i_tc < 2; ++i_tc) { constexpr bool c_debug_flag = true; - parser_type parser(c_debug_flag); + rp toplevel_symtab = GlobalSymtab::make_empty(); + + parser_type parser(toplevel_symtab, c_debug_flag); scope log(XO_DEBUG(c_debug_flag), xtag("i_tc", i_tc)); diff --git a/utest/reader.test.cpp b/utest/reader.test.cpp index d9a55dd5..11d84edb 100644 --- a/utest/reader.test.cpp +++ b/utest/reader.test.cpp @@ -5,6 +5,7 @@ namespace xo { using xo::scm::reader; + using xo::scm::GlobalSymtab; namespace ut { namespace { @@ -30,7 +31,9 @@ namespace xo { for (std::size_t i_tc = 0; i_tc < s_testcase_v.size(); ++i_tc) { const test_case & tc = s_testcase_v[i_tc]; - reader rdr(c_debug_flag); + rp toplevel_symtab = GlobalSymtab::make_empty(); + + reader rdr(toplevel_symtab, c_debug_flag); scope log(XO_ENTER2(always, c_debug_flag, "reader.testcase"), xtag("i_tc", i_tc));