xo-reader: refactor to simplify parser+parserstatemachine
This commit is contained in:
parent
ce760bd5cf
commit
81bbc080fd
10 changed files with 85 additions and 129 deletions
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue