xo-reader: refactor to simplify parser+parserstatemachine

This commit is contained in:
Roland Conybeare 2025-07-22 23:09:55 -05:00
commit 81bbc080fd
10 changed files with 85 additions and 129 deletions

View file

@ -18,50 +18,35 @@
namespace xo {
using xo::ast::Expression;
//using xo::ast::GlobalEnv;
using xo::ast::LocalEnv;
//using xo::ast::DefineExpr;
//using xo::ast::ConvertExpr;
//using xo::ast::Constant;
//using xo::reflect::Reflect;
using xo::reflect::TypeDescr;
namespace scm {
// ----- parser -----
parser::parser(bool debug_flag)
: xs_stack_{}, env_stack_{}, result_{}, debug_flag_{debug_flag}
: psm_{debug_flag}
{
/* top-level environment. initially empty */
rp<LocalEnv> toplevel_env = LocalEnv::make_empty();
this->env_stack_.push_envframe(toplevel_env);
this->psm_.env_stack_.push_envframe(toplevel_env);
}
bool
parser::has_incomplete_expr() const {
/* (don't count toplevel exprseq) */
return xs_stack_.size() > 1;
return psm_.xs_stack_.size() > 1;
}
void
parser::begin_interactive_session() {
parserstatemachine psm(&xs_stack_,
&env_stack_,
&result_,
debug_flag_);
exprseq_xs::start(exprseqtype::toplevel_interactive, &psm);
exprseq_xs::start(exprseqtype::toplevel_interactive, &psm_);
}
void
parser::begin_translation_unit() {
parserstatemachine psm(&xs_stack_,
&env_stack_,
&result_,
debug_flag_);
exprseq_xs::start(exprseqtype::toplevel_batch, &psm);
exprseq_xs::start(exprseqtype::toplevel_batch, &psm_);
}
const parser_result &
@ -70,7 +55,7 @@ namespace xo {
constexpr bool c_debug_flag = true;
scope log(XO_DEBUG(c_debug_flag), xtag("tk", tk));
if (xs_stack_.empty()) {
if (psm_.xs_stack_.empty()) {
throw std::runtime_error(tostr("parser::include_token",
": parser not expecting input"
"(call parser.begin_translation_unit()..?)",
@ -79,21 +64,19 @@ namespace xo {
/* stack_ is non-empty */
log && log(xtag("top", xs_stack_.top_exprstate()));
log && log(xtag("top", psm_.xs_stack_.top_exprstate()));
parserstatemachine psm(&xs_stack_, &env_stack_, &result_, debug_flag_);
psm_.xs_stack_.top_exprstate().on_input(tk, &psm_);
xs_stack_.top_exprstate().on_input(tk, &psm);
return result_;
return psm_.result_;
} /*include_token*/
void
parser::reset_to_idle_toplevel()
{
xs_stack_.reset_to_toplevel();
env_stack_.reset_to_toplevel();
result_ = parser_result::none();
psm_.xs_stack_.reset_to_toplevel();
psm_.env_stack_.reset_to_toplevel();
psm_.result_ = parser_result::none();
} /*discard_current_state*/
void
@ -101,7 +84,7 @@ namespace xo {
os << "<parser"
<< std::endl;
xs_stack_.print(os);
psm_.xs_stack_.print(os);
os << ">" << std::endl;
}