From 15e1e506595920c3f7ce74cb92fdbdff040e5f5c Mon Sep 17 00:00:00 2001 From: Roland Conybeare Date: Thu, 22 Jan 2026 17:41:40 -0500 Subject: [PATCH] xo-reader2: accept parsed expression at top level.. --- include/xo/reader2/ParserResult.hpp | 6 ++++++ include/xo/reader2/ParserStateMachine.hpp | 4 ++++ src/reader2/DExprSeqState.cpp | 12 +++++------- src/reader2/ParserResult.cpp | 10 ++++++++++ src/reader2/ParserStateMachine.cpp | 9 ++++++++- 5 files changed, 33 insertions(+), 8 deletions(-) diff --git a/include/xo/reader2/ParserResult.hpp b/include/xo/reader2/ParserResult.hpp index 45064d32..6592c7da 100644 --- a/include/xo/reader2/ParserResult.hpp +++ b/include/xo/reader2/ParserResult.hpp @@ -41,6 +41,12 @@ namespace xo { std::string_view error_src_fn, const DString * error_description); + /** create ParserResult for parsing success; + * parsing yields expression @p expr + **/ + static ParserResult expression(std::string_view ssm, + obj expr); + /** create ParserResult for a parsing error. * Reporting detailed message @p errmsg * from syntax state machine @p ssm diff --git a/include/xo/reader2/ParserStateMachine.hpp b/include/xo/reader2/ParserStateMachine.hpp index 42c8af64..b838efe5 100644 --- a/include/xo/reader2/ParserStateMachine.hpp +++ b/include/xo/reader2/ParserStateMachine.hpp @@ -148,6 +148,10 @@ namespace xo { /** @defgroup scm-parserstatemachine-error-entrypoints error entry points **/ ///@{ + /** capture result expression @p expr **/ + void capture_result(std::string_view ssm_anme, + obj expr); + /** capture error message @p errmsg from @p ssm_name, * as current state machine output. * diff --git a/src/reader2/DExprSeqState.cpp b/src/reader2/DExprSeqState.cpp index e67790d5..33a68c15 100644 --- a/src/reader2/DExprSeqState.cpp +++ b/src/reader2/DExprSeqState.cpp @@ -218,18 +218,16 @@ namespace xo { DExprSeqState::on_parsed_expression(obj expr, ParserStateMachine * p_psm) { - p_psm->illegal_parsed_expression("DExprSeqState::on_parsed_expression", - expr, - this->get_expect_str()); + // toplevel expr sequence accepts an arbitrary number of expressions. + + p_psm->capture_result("DExprSeqState::on_parsed_expression", expr); } void DExprSeqState::on_parsed_expression_with_semicolon(obj expr, - ParserStateMachine * p_psm) + ParserStateMachine * p_psm) { - p_psm->illegal_parsed_expression("DExprSeqState::on_parsed_expression_with_semicolon", - expr, - this->get_expect_str()); + p_psm->capture_result("DExprSeqState::on_parsed_expression_with_semicolon", expr); } bool diff --git a/src/reader2/ParserResult.cpp b/src/reader2/ParserResult.cpp index 312538b1..974724d9 100644 --- a/src/reader2/ParserResult.cpp +++ b/src/reader2/ParserResult.cpp @@ -36,6 +36,16 @@ namespace xo { error_description_{error_description} {} + ParserResult + ParserResult::expression(std::string_view ssm_name, + obj expr) + { + return ParserResult(parser_result_type::expression, + expr, + ssm_name, + nullptr); + } + ParserResult ParserResult::error(std::string_view ssm_name, const DString * errmsg) diff --git a/src/reader2/ParserStateMachine.cpp b/src/reader2/ParserStateMachine.cpp index 66e4703e..80841fd8 100644 --- a/src/reader2/ParserStateMachine.cpp +++ b/src/reader2/ParserStateMachine.cpp @@ -288,6 +288,13 @@ namespace xo { stack_->top().on_semicolon_token(tk, this); } + void + ParserStateMachine::capture_result(std::string_view ssm_name, + obj expr) + { + this->result_ = ParserResult::expression(ssm_name, expr); + } + void ParserStateMachine::capture_error(std::string_view ssm_name, const DString * errmsg) @@ -321,7 +328,7 @@ namespace xo { void ParserStateMachine::illegal_input_on_symbol(std::string_view ssm_name, std::string_view sym, - std::string_view expect_str) + std::string_view expect_str) { // TODO: // - want to write error message using DArena