From 8189197d63fd5fde4a17fc90bd0817c73b40ef6f Mon Sep 17 00:00:00 2001 From: Roland Conybeare Date: Wed, 21 Jan 2026 17:35:01 -0500 Subject: [PATCH] xo-reader2: DefineSsm: respond to = token --- xo-facet/include/xo/facet/obj.hpp | 7 +++- xo-reader2/include/xo/reader2/DDefineSsm.hpp | 7 ++++ .../include/xo/reader2/ParserStateMachine.hpp | 3 ++ .../include/xo/reader2/SchematikaParser.hpp | 16 +++++++++ xo-reader2/src/reader2/CMakeLists.txt | 1 + xo-reader2/src/reader2/ParserStateMachine.cpp | 6 ++++ xo-reader2/src/reader2/SchematikaParser.cpp | 18 +++++++--- xo-reader2/src/reader2/syntaxstatetype.cpp | 34 +++++++++++++++++++ xo-reader2/utest/SchematikaParser.test.cpp | 24 +++++++++++++ 9 files changed, 111 insertions(+), 5 deletions(-) create mode 100644 xo-reader2/src/reader2/syntaxstatetype.cpp diff --git a/xo-facet/include/xo/facet/obj.hpp b/xo-facet/include/xo/facet/obj.hpp index b50bf65e..3983cecf 100644 --- a/xo-facet/include/xo/facet/obj.hpp +++ b/xo-facet/include/xo/facet/obj.hpp @@ -103,7 +103,12 @@ namespace xo { return *this; } - /** safe downcast from variant. null if downcast fails **/ + /** safe downcast from variant. null if downcast fails + * + * Use: + * obj x = ...; + * obj quux = obj::from(x); + **/ static obj from(const OObject & other) { return obj(other.template downcast()); } diff --git a/xo-reader2/include/xo/reader2/DDefineSsm.hpp b/xo-reader2/include/xo/reader2/DDefineSsm.hpp index 5308f77a..ed17a1b2 100644 --- a/xo-reader2/include/xo/reader2/DDefineSsm.hpp +++ b/xo-reader2/include/xo/reader2/DDefineSsm.hpp @@ -98,6 +98,13 @@ namespace xo { obj expr_mm, ParserStateMachine * p_psm); + ///@} + /** @defgroup scm-definessm-access-methods **/ + ///@{ + + /** identify define-expression state **/ + defexprstatetype defstate() const noexcept { return defstate_; } + ///@} /** @defgroup scm-define-ssm-facet syntaxstatemachine facet methods **/ ///@{ diff --git a/xo-reader2/include/xo/reader2/ParserStateMachine.hpp b/xo-reader2/include/xo/reader2/ParserStateMachine.hpp index bcd8f557..7e3bcabb 100644 --- a/xo-reader2/include/xo/reader2/ParserStateMachine.hpp +++ b/xo-reader2/include/xo/reader2/ParserStateMachine.hpp @@ -54,6 +54,9 @@ namespace xo { /** true iff state machine currently has incomplete expression **/ bool has_incomplete_expr() const noexcept; + /** top of parser stack **/ + obj top_ssm() const; + ///@} /** @defgroup scm-parserstatemachine-bookkeeping bookkeeping methods **/ diff --git a/xo-reader2/include/xo/reader2/SchematikaParser.hpp b/xo-reader2/include/xo/reader2/SchematikaParser.hpp index 300980fb..aecc3c9a 100644 --- a/xo-reader2/include/xo/reader2/SchematikaParser.hpp +++ b/xo-reader2/include/xo/reader2/SchematikaParser.hpp @@ -172,6 +172,9 @@ namespace xo { obj expr_alloc, bool debug_flag); + /** scm-schematikaparser-access-methods **/ + ///@{ + bool debug_flag() const { return debug_flag_; } /** true if parser is at top-level, @@ -185,6 +188,13 @@ namespace xo { **/ bool has_incomplete_expr() const; + /** top of parser stack **/ + obj top_ssm() const; + + ///@} + /** scm-schematikaparser-general-methods **/ + ///@{ + /** put parser into state for beginning an interactive session. **/ void begin_interactive_session(); @@ -215,11 +225,17 @@ namespace xo { **/ void reset_to_idle_toplevel(); + ///@} + /** scm-schematikaparser-pretty-methods **/ + ///@{ + /** print human-readable representation on stream @p os **/ void print(std::ostream & os) const; /** pretty-printer support **/ bool pretty(const ppindentinfo & ppii) const; + ///@} + private: /** state machine **/ ParserStateMachine psm_; diff --git a/xo-reader2/src/reader2/CMakeLists.txt b/xo-reader2/src/reader2/CMakeLists.txt index b09f015a..5ce73d67 100644 --- a/xo-reader2/src/reader2/CMakeLists.txt +++ b/xo-reader2/src/reader2/CMakeLists.txt @@ -9,6 +9,7 @@ set(SELF_SRCS ParserStack.cpp ParserResult.cpp + syntaxstatetype.cpp ISyntaxStateMachine_Any.cpp DExprSeqState.cpp diff --git a/xo-reader2/src/reader2/ParserStateMachine.cpp b/xo-reader2/src/reader2/ParserStateMachine.cpp index b74de542..dbed93d9 100644 --- a/xo-reader2/src/reader2/ParserStateMachine.cpp +++ b/xo-reader2/src/reader2/ParserStateMachine.cpp @@ -42,6 +42,12 @@ namespace xo { return !(this->is_at_toplevel()); } + obj + ParserStateMachine::top_ssm() const + { + return this->stack_->top(); + } + void ParserStateMachine::establish_toplevel_ssm(obj ssm) { diff --git a/xo-reader2/src/reader2/SchematikaParser.cpp b/xo-reader2/src/reader2/SchematikaParser.cpp index d243de51..fea573c7 100644 --- a/xo-reader2/src/reader2/SchematikaParser.cpp +++ b/xo-reader2/src/reader2/SchematikaParser.cpp @@ -28,23 +28,33 @@ namespace xo { } bool - SchematikaParser::is_at_toplevel() const { + SchematikaParser::is_at_toplevel() const + { return psm_.is_at_toplevel(); } bool - SchematikaParser::has_incomplete_expr() const { + SchematikaParser::has_incomplete_expr() const + { return !(this->is_at_toplevel()); } + obj + SchematikaParser::top_ssm() const + { + return psm_.top_ssm(); + } + void - SchematikaParser::begin_interactive_session() { + SchematikaParser::begin_interactive_session() + { DExprSeqState::establish_interactive(psm_.expr_alloc(), &psm_); } void - SchematikaParser::begin_batch_session() { + SchematikaParser::begin_batch_session() + { DExprSeqState::establish_batch(psm_.expr_alloc(), &psm_); } diff --git a/xo-reader2/src/reader2/syntaxstatetype.cpp b/xo-reader2/src/reader2/syntaxstatetype.cpp new file mode 100644 index 00000000..cf8a9784 --- /dev/null +++ b/xo-reader2/src/reader2/syntaxstatetype.cpp @@ -0,0 +1,34 @@ +/** @file syntaxstatetype.cpp + * + * @author Roland Conybeare, Jan 2026 + **/ + +#include "syntaxstatetype.hpp" + +namespace xo { + namespace scm { + + const char * + syntaxstatetype_descr(syntaxstatetype x) { + switch (x) { + case syntaxstatetype::invalid: + break; + case syntaxstatetype::expect_toplevel_expression_sequence: + return "expect-toplevel-expression-sequence"; + case syntaxstatetype::expect_symbol: + return "expect-symbol"; + case syntaxstatetype::expect_type: + return "expect-type"; + case syntaxstatetype::defexpr: + return "defexpr"; + case syntaxstatetype::N: + break; + } + + return "syntaxstatetype?"; + } + + } /*namespace scm*/ +} /*namespace xo*/ + +/* end syntaxstatetype.cpp */ diff --git a/xo-reader2/utest/SchematikaParser.test.cpp b/xo-reader2/utest/SchematikaParser.test.cpp index af9b8303..203f2eaa 100644 --- a/xo-reader2/utest/SchematikaParser.test.cpp +++ b/xo-reader2/utest/SchematikaParser.test.cpp @@ -4,12 +4,18 @@ **/ #include +#include +#include #include #include #include namespace xo { using xo::scm::SchematikaParser; + using xo::scm::ASyntaxStateMachine; + using xo::scm::syntaxstatetype; + using xo::scm::DDefineSsm; + using xo::scm::defexprstatetype; using xo::scm::ParserResult; using xo::scm::parser_result_type; using xo::scm::Token; @@ -134,6 +140,24 @@ namespace xo { log && log(xtag("result", result)); } + { + auto & result = parser.on_token(Token::singleassign_token()); + + REQUIRE(parser.has_incomplete_expr() == true); + REQUIRE(result.is_incomplete()); + + log && log("after typename symbol token:"); + log && log(xtag("parser", &parser)); + log && log(xtag("result", result)); + + auto def_ssm + = obj::from(parser.top_ssm()); + + REQUIRE(def_ssm); + REQUIRE(def_ssm.data()->ssm_type() == syntaxstatetype::defexpr); + REQUIRE(def_ssm.data()->defstate() == defexprstatetype::def_5); + } + // define-expressions not properly implemented //REQUIRE(result.error_description());