From 7d33440ecbab01f2a4a817ddba4e24c40340bd30 Mon Sep 17 00:00:00 2001 From: Roland Conybeare Date: Wed, 21 Jan 2026 12:14:35 -0500 Subject: [PATCH] xo-reader2: handle parsed typedescr + use in DDefineSsm --- idl/SyntaxStateMachine.json5 | 11 ++++++ include/xo/reader2/DDefineSsm.hpp | 7 ++++ include/xo/reader2/DExpectSymbolSsm.hpp | 39 +++++++++++-------- include/xo/reader2/DExpectTypeSsm.hpp | 11 +++++- include/xo/reader2/DExprSeqState.hpp | 7 ++++ include/xo/reader2/ParserStateMachine.hpp | 20 +++++++++- .../xo/reader2/ssm/ASyntaxStateMachine.hpp | 5 +++ .../reader2/ssm/IPrintable_DExpectTypeSsm.hpp | 2 +- .../reader2/ssm/ISyntaxStateMachine_Any.hpp | 2 + .../ssm/ISyntaxStateMachine_DDefineSsm.hpp | 3 ++ .../ISyntaxStateMachine_DExpectSymbolSsm.hpp | 3 ++ .../ISyntaxStateMachine_DExpectTypeSsm.hpp | 5 ++- .../ssm/ISyntaxStateMachine_DExprSeqState.hpp | 3 ++ .../reader2/ssm/ISyntaxStateMachine_Xfer.hpp | 5 +++ .../xo/reader2/ssm/RSyntaxStateMachine.hpp | 4 ++ src/reader2/DDefineSsm.cpp | 28 ++++++++++++- src/reader2/DExpectSymbolSsm.cpp | 27 ++++++++----- src/reader2/DExpectTypeSsm.cpp | 14 +++++-- src/reader2/DExprSeqState.cpp | 9 +++++ src/reader2/IPrintable_DExpectTypeSsm.cpp | 2 +- src/reader2/ISyntaxStateMachine_Any.cpp | 6 +++ .../ISyntaxStateMachine_DDefineSsm.cpp | 5 +++ .../ISyntaxStateMachine_DExpectSymbolSsm.cpp | 5 +++ .../ISyntaxStateMachine_DExpectTypeSsm.cpp | 7 +++- .../ISyntaxStateMachine_DExprSeqState.cpp | 5 +++ src/reader2/ParserStateMachine.cpp | 33 ++++++++++++++++ 26 files changed, 231 insertions(+), 37 deletions(-) diff --git a/idl/SyntaxStateMachine.json5 b/idl/SyntaxStateMachine.json5 index f1b74111..c207022f 100644 --- a/idl/SyntaxStateMachine.json5 +++ b/idl/SyntaxStateMachine.json5 @@ -5,6 +5,7 @@ "\"ParserStateMachine.hpp\"", "\"syntaxstatetype.hpp\"", "", + "", ], // extra includes in SyntaxStateMachine.hpp, if any user_hpp_includes: [], @@ -20,6 +21,7 @@ "Assistant to schematika parser dedicated to particular syntax" ], types: [ + { name: "TypeDescr", doc: [ "reflected c++ type" ], definition: "xo::reflect::TypeDescr" }, // { name: string, doc: [ string ], definition: string }, ], const_methods: [ @@ -88,5 +90,14 @@ {type: "ParserStateMachine *", name: "p_psm"}, ], }, + { + name: "on_parsed_typedescr", + doc: ["operate state machine for incoming type description @p td"], + return_type: "void", + args: [ + {type: "TypeDescr", name: "td"}, + {type: "ParserStateMachine *", name: "p_psm"}, + ], + }, ], } diff --git a/include/xo/reader2/DDefineSsm.hpp b/include/xo/reader2/DDefineSsm.hpp index 468d1a22..d9aea54f 100644 --- a/include/xo/reader2/DDefineSsm.hpp +++ b/include/xo/reader2/DDefineSsm.hpp @@ -71,6 +71,7 @@ namespace xo { **/ class DDefineSsm { public: + using TypeDescr = xo::reflect::TypeDescr; using AAllocator = xo::mm::AAllocator; using DArena = xo::mm::DArena; using ppindentinfo = xo::print::ppindentinfo; @@ -139,6 +140,12 @@ namespace xo { void on_parsed_symbol(std::string_view sym, ParserStateMachine * p_psm); + /** update state for this syntax after parsing a type-description @p td, + * overall parser state in @p p_psm + **/ + void on_parsed_typedescr(TypeDescr td, + ParserStateMachine * p_psm); + ///@} /** @defgroup scm-define-printable-facet printable facet methods **/ ///@{ diff --git a/include/xo/reader2/DExpectSymbolSsm.hpp b/include/xo/reader2/DExpectSymbolSsm.hpp index 1854486e..7421c0f7 100644 --- a/include/xo/reader2/DExpectSymbolSsm.hpp +++ b/include/xo/reader2/DExpectSymbolSsm.hpp @@ -22,6 +22,7 @@ namespace xo { class DExpectSymbolSsm { public: using DArena = xo::mm::DArena; + using TypeDescr = xo::reflect::TypeDescr; using ppindentinfo = xo::print::ppindentinfo; public: @@ -57,8 +58,29 @@ namespace xo { **/ std::string_view get_expect_str() const noexcept; + /** update state for this syntax after parsing a symbol @p sym; + * overall parser state in @p p_psm. + * + * NOTE: + * might not be obvious that this is unreachable. + * DExpectSymbolSsm converts a symbol token, + * and delivers it to parent ssm using this entry point. + * This method would only be called if consecutive + * DExpectSymbolSsm instances on parser stack; + * which scenario never occurs in Schematika syntax + **/ + void on_parsed_symbol(std::string_view sym, + ParserStateMachine * p_psm); + + /** update state for this syntax after parsing a type-description @p td + * in nested state machine. + * (provided to satisfy ASyntaxStateMachine api. not reachable) + **/ + void on_parsed_typedescr(TypeDescr td, + ParserStateMachine * p_psm); + /** update state for this syntax on incoming token @p tk, - * overall parser state in @p p_psm + * overall parser state in @p p_psm. **/ void on_def_token(const Token & tk, ParserStateMachine * p_psm); @@ -75,21 +97,6 @@ namespace xo { void on_colon_token(const Token & tk, ParserStateMachine * p_psm); - /** update state for this syntax after parsing a symbol @p sym; - * overall parser state in @p p_psm. - * - * NOTE: - * might not be obvious that this is unreachable. - * DExpectSymbolSsm converts a symbol token, - * and delivers it to parent ssm using this entry point. - * This method would only be called if consecutive - * DExpectSymbolSsm instances on parser stack; - * which scenario never occurs in Schematika syntax - **/ - void on_parsed_symbol(std::string_view sym, - ParserStateMachine * p_psm); - - ///@} /** @defgroup scm-expectsymbol-printable-facet printable facet methods **/ ///@{ diff --git a/include/xo/reader2/DExpectTypeSsm.hpp b/include/xo/reader2/DExpectTypeSsm.hpp index aebec716..f98b8767 100644 --- a/include/xo/reader2/DExpectTypeSsm.hpp +++ b/include/xo/reader2/DExpectTypeSsm.hpp @@ -23,6 +23,7 @@ namespace xo { **/ class DExpectTypeSsm { public: + using TypeDescr = xo::reflect::TypeDescr; using DArena = xo::mm::DArena; using ppindentinfo = xo::print::ppindentinfo; @@ -70,7 +71,7 @@ namespace xo { void on_colon_token(const Token & tk, ParserStateMachine * p_psm); - /** Never called. + /** (Never called). * Operate state machine for this syntax after symbol * emitted from nested ssm. * Impossible path for DExpectTypeSsm until such time as it relies @@ -80,6 +81,14 @@ namespace xo { void on_parsed_symbol(std::string_view sym, ParserStateMachine * p_psm); + /** operate state machine for this syntax on receiving type-description + * from nested parser. + * Currently (jan 2026) impossible path for DExpectTypeSsm. + * Active path is via on_symbol_token() + **/ + void on_parsed_typedescr(TypeDescr td, + ParserStateMachine * p_psm); + ///@} /** @defgroup scm-expecttype-printable-facet printable facet methods **/ ///@{ diff --git a/include/xo/reader2/DExprSeqState.hpp b/include/xo/reader2/DExprSeqState.hpp index 90c69c5f..942afedd 100644 --- a/include/xo/reader2/DExprSeqState.hpp +++ b/include/xo/reader2/DExprSeqState.hpp @@ -39,6 +39,7 @@ namespace xo { **/ class DExprSeqState { public: + using TypeDescr = xo::reflect::TypeDescr; using AAllocator = xo::mm::AAllocator; using ppindentinfo = xo::print::ppindentinfo; @@ -90,6 +91,12 @@ namespace xo { **/ void on_parsed_symbol(std::string_view sym, ParserStateMachine * p_psm); + /** update state for this syntax on parsed type-description @p td + * from nested ssm. + * overall parser state in @p p_psm + **/ + void on_parsed_typedescr(TypeDescr td, ParserStateMachine * p_psm); + ///@} /** @defgroup scm-exprseq-printable-facet printable facet methods **/ ///@{ diff --git a/include/xo/reader2/ParserStateMachine.hpp b/include/xo/reader2/ParserStateMachine.hpp index 31b664c0..e17ff39d 100644 --- a/include/xo/reader2/ParserStateMachine.hpp +++ b/include/xo/reader2/ParserStateMachine.hpp @@ -29,6 +29,7 @@ namespace xo { **/ class ParserStateMachine { public: + using TypeDescr = xo::reflect::TypeDescr; using AAllocator = xo::mm::AAllocator; using ArenaConfig = xo::mm::ArenaConfig; using DArena = xo::mm::DArena; @@ -88,9 +89,16 @@ namespace xo { /** @defgroup scm-parserstatemachine-inputmethods input methods **/ ///@{ - /** update state to respond to prsed symbol @p sym **/ + /** update state to respond to parsed symbol @p sym + * (from nested parsing state) + **/ void on_parsed_symbol(std::string_view sym); + /** update state to respond to parsed type-description @p td + * (from nested parsing state) + **/ + void on_parsed_typedescr(TypeDescr td); + /** update state to respond to input token @p tk. * record output (if any) in @ref result_ **/ @@ -109,7 +117,6 @@ namespace xo { void on_colon_token(const Token & tk); ///@} - /** @defgroup scm-parserstatemachine-error-entrypoints error entry points **/ ///@{ @@ -136,6 +143,15 @@ namespace xo { void illegal_input_on_symbol(std::string_view ssm_name, std::string_view sym, std::string_view expect_str); + + /** report illegal input arriving in syntax state machine (ssm) @p ssm_name + * receiving assembled type-description @p td. + * @p expect_str sketches expected input in current ssm state + **/ + void illegal_input_on_typedescr(std::string_view ssm_name, + TypeDescr td, + std::string_view expect_str); + ///@} private: diff --git a/include/xo/reader2/ssm/ASyntaxStateMachine.hpp b/include/xo/reader2/ssm/ASyntaxStateMachine.hpp index f3ccb709..6aefa1f7 100644 --- a/include/xo/reader2/ssm/ASyntaxStateMachine.hpp +++ b/include/xo/reader2/ssm/ASyntaxStateMachine.hpp @@ -17,6 +17,7 @@ #include "ParserStateMachine.hpp" #include "syntaxstatetype.hpp" #include +#include #include #include #include @@ -41,6 +42,8 @@ public: using typeseq = xo::facet::typeseq; using Copaque = const void *; using Opaque = void *; + /** reflected c++ type **/ + using TypeDescr = xo::reflect::TypeDescr; ///@} /** @defgroup scm-syntaxstatemachine-methods **/ @@ -64,6 +67,8 @@ public: virtual void on_colon_token(Opaque data, const Token & tk, ParserStateMachine * p_psm) = 0; /** update stat machine for incoming parsed symbol @p sym **/ virtual void on_parsed_symbol(Opaque data, std::string_view sym, ParserStateMachine * p_psm) = 0; + /** operate state machine for incoming type description @p td **/ + virtual void on_parsed_typedescr(Opaque data, TypeDescr td, ParserStateMachine * p_psm) = 0; ///@} }; /*ASyntaxStateMachine*/ diff --git a/include/xo/reader2/ssm/IPrintable_DExpectTypeSsm.hpp b/include/xo/reader2/ssm/IPrintable_DExpectTypeSsm.hpp index 271df307..7b7785e9 100644 --- a/include/xo/reader2/ssm/IPrintable_DExpectTypeSsm.hpp +++ b/include/xo/reader2/ssm/IPrintable_DExpectTypeSsm.hpp @@ -2,7 +2,7 @@ * * Generated automagically from ingredients: * 1. code generator: - * [/Users/roland/proj/xo-umbrella2/xo-facet/codegen/genfacet] + * [/home/roland/proj/xo-umbrella2-claude1/xo-facet/codegen/genfacet] * arguments: * --input [idl/IPrintable_DExpectTypeSsm.json5] * 2. jinja2 template for abstract facet .hpp file: diff --git a/include/xo/reader2/ssm/ISyntaxStateMachine_Any.hpp b/include/xo/reader2/ssm/ISyntaxStateMachine_Any.hpp index 03ab1fa7..1a6705d2 100644 --- a/include/xo/reader2/ssm/ISyntaxStateMachine_Any.hpp +++ b/include/xo/reader2/ssm/ISyntaxStateMachine_Any.hpp @@ -44,6 +44,7 @@ namespace scm { /** integer identifying a type **/ using typeseq = xo::facet::typeseq; + using TypeDescr = ASyntaxStateMachine::TypeDescr; ///@} /** @defgroup scm-syntaxstatemachine-any-methods **/ @@ -64,6 +65,7 @@ namespace scm { [[noreturn]] void on_if_token(Opaque, const Token &, ParserStateMachine *) override; [[noreturn]] void on_colon_token(Opaque, const Token &, ParserStateMachine *) override; [[noreturn]] void on_parsed_symbol(Opaque, std::string_view, ParserStateMachine *) override; + [[noreturn]] void on_parsed_typedescr(Opaque, TypeDescr, ParserStateMachine *) override; ///@} diff --git a/include/xo/reader2/ssm/ISyntaxStateMachine_DDefineSsm.hpp b/include/xo/reader2/ssm/ISyntaxStateMachine_DDefineSsm.hpp index 85d6d70b..65627a03 100644 --- a/include/xo/reader2/ssm/ISyntaxStateMachine_DDefineSsm.hpp +++ b/include/xo/reader2/ssm/ISyntaxStateMachine_DDefineSsm.hpp @@ -41,6 +41,7 @@ namespace xo { public: /** @defgroup scm-syntaxstatemachine-ddefinessm-type-traits **/ ///@{ + using TypeDescr = xo::scm::ASyntaxStateMachine::TypeDescr; using Copaque = xo::scm::ASyntaxStateMachine::Copaque; using Opaque = xo::scm::ASyntaxStateMachine::Opaque; ///@} @@ -63,6 +64,8 @@ namespace xo { static void on_colon_token(DDefineSsm & self, const Token & tk, ParserStateMachine * p_psm); /** update stat machine for incoming parsed symbol @p sym **/ static void on_parsed_symbol(DDefineSsm & self, std::string_view sym, ParserStateMachine * p_psm); + /** operate state machine for incoming type description @p td **/ + static void on_parsed_typedescr(DDefineSsm & self, TypeDescr td, ParserStateMachine * p_psm); ///@} }; diff --git a/include/xo/reader2/ssm/ISyntaxStateMachine_DExpectSymbolSsm.hpp b/include/xo/reader2/ssm/ISyntaxStateMachine_DExpectSymbolSsm.hpp index 75125e5c..91ff08b6 100644 --- a/include/xo/reader2/ssm/ISyntaxStateMachine_DExpectSymbolSsm.hpp +++ b/include/xo/reader2/ssm/ISyntaxStateMachine_DExpectSymbolSsm.hpp @@ -41,6 +41,7 @@ namespace xo { public: /** @defgroup scm-syntaxstatemachine-dexpectsymbolssm-type-traits **/ ///@{ + using TypeDescr = xo::scm::ASyntaxStateMachine::TypeDescr; using Copaque = xo::scm::ASyntaxStateMachine::Copaque; using Opaque = xo::scm::ASyntaxStateMachine::Opaque; ///@} @@ -63,6 +64,8 @@ namespace xo { static void on_colon_token(DExpectSymbolSsm & self, const Token & tk, ParserStateMachine * p_psm); /** update stat machine for incoming parsed symbol @p sym **/ static void on_parsed_symbol(DExpectSymbolSsm & self, std::string_view sym, ParserStateMachine * p_psm); + /** operate state machine for incoming type description @p td **/ + static void on_parsed_typedescr(DExpectSymbolSsm & self, TypeDescr td, ParserStateMachine * p_psm); ///@} }; diff --git a/include/xo/reader2/ssm/ISyntaxStateMachine_DExpectTypeSsm.hpp b/include/xo/reader2/ssm/ISyntaxStateMachine_DExpectTypeSsm.hpp index c56f21d5..64622261 100644 --- a/include/xo/reader2/ssm/ISyntaxStateMachine_DExpectTypeSsm.hpp +++ b/include/xo/reader2/ssm/ISyntaxStateMachine_DExpectTypeSsm.hpp @@ -2,7 +2,7 @@ * * Generated automagically from ingredients: * 1. code generator: - * [/Users/roland/proj/xo-umbrella2/xo-facet/codegen/genfacet] + * [/home/roland/proj/xo-umbrella2-claude1/xo-facet/codegen/genfacet] * arguments: * --input [idl/ISyntaxStateMachine_DExpectTypeSsm.json5] * 2. jinja2 template for abstract facet .hpp file: @@ -41,6 +41,7 @@ namespace xo { public: /** @defgroup scm-syntaxstatemachine-dexpecttypessm-type-traits **/ ///@{ + using TypeDescr = xo::scm::ASyntaxStateMachine::TypeDescr; using Copaque = xo::scm::ASyntaxStateMachine::Copaque; using Opaque = xo::scm::ASyntaxStateMachine::Opaque; ///@} @@ -63,6 +64,8 @@ namespace xo { static void on_colon_token(DExpectTypeSsm & self, const Token & tk, ParserStateMachine * p_psm); /** update stat machine for incoming parsed symbol @p sym **/ static void on_parsed_symbol(DExpectTypeSsm & self, std::string_view sym, ParserStateMachine * p_psm); + /** operate state machine for incoming type description @p td **/ + static void on_parsed_typedescr(DExpectTypeSsm & self, TypeDescr td, ParserStateMachine * p_psm); ///@} }; diff --git a/include/xo/reader2/ssm/ISyntaxStateMachine_DExprSeqState.hpp b/include/xo/reader2/ssm/ISyntaxStateMachine_DExprSeqState.hpp index e0689f69..64fd4ed7 100644 --- a/include/xo/reader2/ssm/ISyntaxStateMachine_DExprSeqState.hpp +++ b/include/xo/reader2/ssm/ISyntaxStateMachine_DExprSeqState.hpp @@ -41,6 +41,7 @@ namespace xo { public: /** @defgroup scm-syntaxstatemachine-dexprseqstate-type-traits **/ ///@{ + using TypeDescr = xo::scm::ASyntaxStateMachine::TypeDescr; using Copaque = xo::scm::ASyntaxStateMachine::Copaque; using Opaque = xo::scm::ASyntaxStateMachine::Opaque; ///@} @@ -63,6 +64,8 @@ namespace xo { static void on_colon_token(DExprSeqState & self, const Token & tk, ParserStateMachine * p_psm); /** update stat machine for incoming parsed symbol @p sym **/ static void on_parsed_symbol(DExprSeqState & self, std::string_view sym, ParserStateMachine * p_psm); + /** operate state machine for incoming type description @p td **/ + static void on_parsed_typedescr(DExprSeqState & self, TypeDescr td, ParserStateMachine * p_psm); ///@} }; diff --git a/include/xo/reader2/ssm/ISyntaxStateMachine_Xfer.hpp b/include/xo/reader2/ssm/ISyntaxStateMachine_Xfer.hpp index ac6975ba..7b2c721f 100644 --- a/include/xo/reader2/ssm/ISyntaxStateMachine_Xfer.hpp +++ b/include/xo/reader2/ssm/ISyntaxStateMachine_Xfer.hpp @@ -16,6 +16,7 @@ #include "ParserStateMachine.hpp" #include "syntaxstatetype.hpp" #include +#include namespace xo { namespace scm { @@ -30,6 +31,7 @@ namespace scm { using Impl = ISyntaxStateMachine_DRepr; /** integer identifying a type **/ using typeseq = ASyntaxStateMachine::typeseq; + using TypeDescr = ASyntaxStateMachine::TypeDescr; ///@} /** @defgroup scm-syntaxstatemachine-xfer-methods **/ @@ -65,6 +67,9 @@ namespace scm { void on_parsed_symbol(Opaque data, std::string_view sym, ParserStateMachine * p_psm) override { return I::on_parsed_symbol(_dcast(data), sym, p_psm); } + void on_parsed_typedescr(Opaque data, TypeDescr td, ParserStateMachine * p_psm) override { + return I::on_parsed_typedescr(_dcast(data), td, p_psm); + } ///@} diff --git a/include/xo/reader2/ssm/RSyntaxStateMachine.hpp b/include/xo/reader2/ssm/RSyntaxStateMachine.hpp index 78bbfb18..4a63e377 100644 --- a/include/xo/reader2/ssm/RSyntaxStateMachine.hpp +++ b/include/xo/reader2/ssm/RSyntaxStateMachine.hpp @@ -31,6 +31,7 @@ public: using ObjectType = Object; using DataPtr = Object::DataPtr; using typeseq = xo::reflect::typeseq; + using TypeDescr = ASyntaxStateMachine::TypeDescr; ///@} /** @defgroup scm-syntaxstatemachine-router-ctors **/ @@ -70,6 +71,9 @@ public: void on_parsed_symbol(std::string_view sym, ParserStateMachine * p_psm) { return O::iface()->on_parsed_symbol(O::data(), sym, p_psm); } + void on_parsed_typedescr(TypeDescr td, ParserStateMachine * p_psm) { + return O::iface()->on_parsed_typedescr(O::data(), td, p_psm); + } ///@} /** @defgroup scm-syntaxstatemachine-member-vars **/ diff --git a/src/reader2/DDefineSsm.cpp b/src/reader2/DDefineSsm.cpp index 98a9fa4a..21435a83 100644 --- a/src/reader2/DDefineSsm.cpp +++ b/src/reader2/DDefineSsm.cpp @@ -420,7 +420,7 @@ namespace xo { DDefineSsm::on_parsed_symbol(std::string_view sym_name, ParserStateMachine * p_psm) { - if (this->defstate_ == defexprstatetype::def_1) { + if (defstate_ == defexprstatetype::def_1) { this->defstate_ = defexprstatetype::def_2; const DUniqueString * sym @@ -460,6 +460,32 @@ namespace xo { this->get_expect_str()); } + void + DDefineSsm::on_parsed_typedescr(TypeDescr td, + ParserStateMachine * p_psm) + { + scope log(XO_DEBUG(true), xtag("td", td)); + + if (defstate_ == defexprstatetype::def_3) { + this->defstate_ = defexprstatetype::def_4; + + // note: not present in x0-reader/ version + def_expr_.assign_valuetype(td); + +#ifdef NOT_YET + this->cvt_expr_ = ConvertExpr::make(td, nullptr); + def_expr_->assign_rhs(cvt_expr_); +#endif + log && log("STUB: ConvertExpr not implemented, TypeDescr not captured"); + + return; + } + + p_psm->illegal_input_on_typedescr("DDefineSsm::on_parsed_typedescr", + td, + this->get_expect_str()); + } + void DDefineSsm::on_symbol_token(const Token & tk, ParserStateMachine * p_psm) diff --git a/src/reader2/DExpectSymbolSsm.cpp b/src/reader2/DExpectSymbolSsm.cpp index 1eccc454..877c6a50 100644 --- a/src/reader2/DExpectSymbolSsm.cpp +++ b/src/reader2/DExpectSymbolSsm.cpp @@ -56,6 +56,24 @@ namespace xo { return "symbol"; } + void + DExpectSymbolSsm::on_parsed_symbol(std::string_view sym, + ParserStateMachine * p_psm) + { + p_psm->illegal_input_on_symbol("DExpectSymbolSsm::on_parsed_symbol", + sym, + this->get_expect_str()); + } + + void + DExpectSymbolSsm::on_parsed_typedescr(TypeDescr td, + ParserStateMachine * p_psm) + { + p_psm->illegal_input_on_typedescr("DExpectSymbolSsm::on_parsed_typedescr", + td, + this->get_expect_str()); + } + void DExpectSymbolSsm::on_symbol_token(const Token & tk, ParserStateMachine * p_psm) @@ -104,15 +122,6 @@ namespace xo { this->get_expect_str()); } - void - DExpectSymbolSsm::on_parsed_symbol(std::string_view sym, - ParserStateMachine * p_psm) - { - p_psm->illegal_input_on_symbol("DExpectSymbolSsm::on_parsed_symbol", - sym, - this->get_expect_str()); - } - bool DExpectSymbolSsm::pretty(const ppindentinfo & ppii) const { diff --git a/src/reader2/DExpectTypeSsm.cpp b/src/reader2/DExpectTypeSsm.cpp index ce38473e..62ccdf22 100644 --- a/src/reader2/DExpectTypeSsm.cpp +++ b/src/reader2/DExpectTypeSsm.cpp @@ -115,10 +115,7 @@ namespace xo { } p_psm->pop_ssm(); - - log && log("STUB: missing on_typedescr() call"); - - //p_psm->on_typedescr(td); + p_psm->on_parsed_typedescr(td); } void @@ -130,6 +127,15 @@ namespace xo { this->get_expect_str()); } + void + DExpectTypeSsm::on_parsed_typedescr(TypeDescr td, + ParserStateMachine * p_psm) + { + p_psm->illegal_input_on_typedescr("ExpectTypeSsm", + td, + this->get_expect_str()); + } + bool DExpectTypeSsm::pretty(const ppindentinfo & ppii) const { diff --git a/src/reader2/DExprSeqState.cpp b/src/reader2/DExprSeqState.cpp index 6744c77d..6f9d877a 100644 --- a/src/reader2/DExprSeqState.cpp +++ b/src/reader2/DExprSeqState.cpp @@ -178,6 +178,15 @@ namespace xo { this->get_expect_str()); } + void + DExprSeqState::on_parsed_typedescr(TypeDescr td, + ParserStateMachine * p_psm) + { + p_psm->illegal_input_on_typedescr("DExprSeqState::on_parsed_typedescr", + td, + this->get_expect_str()); + } + bool DExprSeqState::pretty(const ppindentinfo & ppii) const { diff --git a/src/reader2/IPrintable_DExpectTypeSsm.cpp b/src/reader2/IPrintable_DExpectTypeSsm.cpp index c82d726e..3fc75136 100644 --- a/src/reader2/IPrintable_DExpectTypeSsm.cpp +++ b/src/reader2/IPrintable_DExpectTypeSsm.cpp @@ -2,7 +2,7 @@ * * Generated automagically from ingredients: * 1. code generator: - * [/Users/roland/proj/xo-umbrella2/xo-facet/codegen/genfacet] + * [/home/roland/proj/xo-umbrella2-claude1/xo-facet/codegen/genfacet] * arguments: * --input [idl/IPrintable_DExpectTypeSsm.json5] * 2. jinja2 template for abstract facet .hpp file: diff --git a/src/reader2/ISyntaxStateMachine_Any.cpp b/src/reader2/ISyntaxStateMachine_Any.cpp index edac8279..24775dfd 100644 --- a/src/reader2/ISyntaxStateMachine_Any.cpp +++ b/src/reader2/ISyntaxStateMachine_Any.cpp @@ -64,6 +64,12 @@ ISyntaxStateMachine_Any::on_parsed_symbol(Opaque, std::string_view, ParserStateM _fatal(); } +auto +ISyntaxStateMachine_Any::on_parsed_typedescr(Opaque, TypeDescr, ParserStateMachine *) -> void +{ + _fatal(); +} + } /*namespace scm*/ } /*namespace xo*/ diff --git a/src/reader2/ISyntaxStateMachine_DDefineSsm.cpp b/src/reader2/ISyntaxStateMachine_DDefineSsm.cpp index 425032e3..8cc9c858 100644 --- a/src/reader2/ISyntaxStateMachine_DDefineSsm.cpp +++ b/src/reader2/ISyntaxStateMachine_DDefineSsm.cpp @@ -52,6 +52,11 @@ namespace xo { { self.on_parsed_symbol(sym, p_psm); } + auto + ISyntaxStateMachine_DDefineSsm::on_parsed_typedescr(DDefineSsm & self, TypeDescr td, ParserStateMachine * p_psm) -> void + { + self.on_parsed_typedescr(td, p_psm); + } } /*namespace scm*/ } /*namespace xo*/ diff --git a/src/reader2/ISyntaxStateMachine_DExpectSymbolSsm.cpp b/src/reader2/ISyntaxStateMachine_DExpectSymbolSsm.cpp index 2188d50d..e4716ef8 100644 --- a/src/reader2/ISyntaxStateMachine_DExpectSymbolSsm.cpp +++ b/src/reader2/ISyntaxStateMachine_DExpectSymbolSsm.cpp @@ -52,6 +52,11 @@ namespace xo { { self.on_parsed_symbol(sym, p_psm); } + auto + ISyntaxStateMachine_DExpectSymbolSsm::on_parsed_typedescr(DExpectSymbolSsm & self, TypeDescr td, ParserStateMachine * p_psm) -> void + { + self.on_parsed_typedescr(td, p_psm); + } } /*namespace scm*/ } /*namespace xo*/ diff --git a/src/reader2/ISyntaxStateMachine_DExpectTypeSsm.cpp b/src/reader2/ISyntaxStateMachine_DExpectTypeSsm.cpp index c520aea8..893cb0dd 100644 --- a/src/reader2/ISyntaxStateMachine_DExpectTypeSsm.cpp +++ b/src/reader2/ISyntaxStateMachine_DExpectTypeSsm.cpp @@ -2,7 +2,7 @@ * * Generated automagically from ingredients: * 1. code generator: - * [/Users/roland/proj/xo-umbrella2/xo-facet/codegen/genfacet] + * [/home/roland/proj/xo-umbrella2-claude1/xo-facet/codegen/genfacet] * arguments: * --input [idl/ISyntaxStateMachine_DExpectTypeSsm.json5] * 2. jinja2 template for abstract facet .hpp file: @@ -52,6 +52,11 @@ namespace xo { { self.on_parsed_symbol(sym, p_psm); } + auto + ISyntaxStateMachine_DExpectTypeSsm::on_parsed_typedescr(DExpectTypeSsm & self, TypeDescr td, ParserStateMachine * p_psm) -> void + { + self.on_parsed_typedescr(td, p_psm); + } } /*namespace scm*/ } /*namespace xo*/ diff --git a/src/reader2/ISyntaxStateMachine_DExprSeqState.cpp b/src/reader2/ISyntaxStateMachine_DExprSeqState.cpp index 7ad8fb50..911e825e 100644 --- a/src/reader2/ISyntaxStateMachine_DExprSeqState.cpp +++ b/src/reader2/ISyntaxStateMachine_DExprSeqState.cpp @@ -52,6 +52,11 @@ namespace xo { { self.on_parsed_symbol(sym, p_psm); } + auto + ISyntaxStateMachine_DExprSeqState::on_parsed_typedescr(DExprSeqState & self, TypeDescr td, ParserStateMachine * p_psm) -> void + { + self.on_parsed_typedescr(td, p_psm); + } } /*namespace scm*/ } /*namespace xo*/ diff --git a/src/reader2/ParserStateMachine.cpp b/src/reader2/ParserStateMachine.cpp index 5c9cc413..79f23eb5 100644 --- a/src/reader2/ParserStateMachine.cpp +++ b/src/reader2/ParserStateMachine.cpp @@ -113,6 +113,16 @@ namespace xo { this->stack_->top().on_parsed_symbol(sym, this); } + void + ParserStateMachine::on_parsed_typedescr(TypeDescr td) + { + scope log(XO_DEBUG(debug_flag_), xtag("td", td)); + + assert(stack_); + + this->stack_->top().on_parsed_typedescr(td, this); + } + void ParserStateMachine::on_token(const Token & tk) { @@ -271,6 +281,29 @@ namespace xo { this->capture_error(ssm_name, errmsg); } + + void + ParserStateMachine::illegal_input_on_typedescr(std::string_view ssm_name, + TypeDescr td, + std::string_view expect_str) + { + // TODO: + // - want to write error message using DArena + // - need something like log_streambuf and/or tostr() that's arena-aware + + auto errmsg_string = tostr("Unexpected type-description for parsing state", + xtag("td", td), + xtag("expecting", expect_str), + xtag("ssm", ssm_name), + xtag("via", "ParserStateMachine::illegal_input_on_typedescr")); + + assert(expr_alloc_); + + auto errmsg = DString::from_view(expr_alloc_, + std::string_view(errmsg_string)); + + this->capture_error(ssm_name, errmsg); + } } /*namespace scm*/ } /*namespace xo*/