diff --git a/example/readerreplxx/readerreplxx.cpp b/example/readerreplxx/readerreplxx.cpp index 5d74dc06..341893cf 100644 --- a/example/readerreplxx/readerreplxx.cpp +++ b/example/readerreplxx/readerreplxx.cpp @@ -110,6 +110,8 @@ namespace { pps.prettyn(expr_pr); + p_reader->reset_result(); + *p_input = remaining; return true; diff --git a/include/xo/reader2/SchematikaReader.hpp b/include/xo/reader2/SchematikaReader.hpp index 540c19bc..fd26a4ec 100644 --- a/include/xo/reader2/SchematikaReader.hpp +++ b/include/xo/reader2/SchematikaReader.hpp @@ -56,6 +56,9 @@ namespace xo { /** consume input @p input_cstr **/ const ReaderResult & read_expr(span_type input_span, bool eof); + /** reset @ref result_ to nominal value **/ + void reset_result(); + /** reset to known starting point after encountering an error. * - remainder of stashed current line. * Necesary for well-formatted error reporting. diff --git a/src/reader2/DExprSeqState.cpp b/src/reader2/DExprSeqState.cpp index c6e53ba2..1d7aea93 100644 --- a/src/reader2/DExprSeqState.cpp +++ b/src/reader2/DExprSeqState.cpp @@ -11,6 +11,8 @@ #include #include #include +#include +#include #include namespace xo { @@ -221,6 +223,26 @@ namespace xo { DExprSeqState::on_bool_token(const Token & tk, ParserStateMachine * p_psm) { + switch (seqtype_) { + case exprseqtype::toplevel_interactive: + { + auto dvalue = DBoolean::box(p_psm->expr_alloc(), + tk.bool_value()); + auto * dconst = DConstant::make(p_psm->expr_alloc(), dvalue); + auto expr = with_facet::mkobj(dconst); + + DProgressSsm::start(p_psm->parser_alloc(), + expr, + p_psm); + return; + } + case exprseqtype::toplevel_batch: + break; + case exprseqtype::N: + assert(false); // unreachable + break; + } + p_psm->illegal_input_on_token("DExprSeqState::on_bool_token", tk, this->get_expect_str()); diff --git a/src/reader2/SchematikaReader.cpp b/src/reader2/SchematikaReader.cpp index 8aa85bf8..4dd8600c 100644 --- a/src/reader2/SchematikaReader.cpp +++ b/src/reader2/SchematikaReader.cpp @@ -142,6 +142,12 @@ namespace xo { return this->result_; } + void + SchematikaReader::reset_result() + { + this->parser_.reset_result(); + } + void SchematikaReader::reset_to_idle_toplevel() {