diff --git a/cmake/xo_reader2Config.cmake.in b/cmake/xo_reader2Config.cmake.in index 14dec967..6d032cb1 100644 --- a/cmake/xo_reader2Config.cmake.in +++ b/cmake/xo_reader2Config.cmake.in @@ -9,6 +9,7 @@ include(CMakeFindDependencyMacro) find_dependency(xo_numeric) find_dependency(xo_procedure2) find_dependency(xo_gc) +find_dependency(xo_type) find_dependency(xo_tokenizer2) find_dependency(xo_expression2) find_dependency(subsys) diff --git a/idl/SyntaxStateMachine.json5 b/idl/SyntaxStateMachine.json5 index 815fd18e..0238749c 100644 --- a/idl/SyntaxStateMachine.json5 +++ b/idl/SyntaxStateMachine.json5 @@ -7,6 +7,7 @@ includes: [ "\"ParserStateMachine.hpp\"", "\"syntaxstatetype.hpp\"", + "", "", "", ], @@ -76,6 +77,15 @@ {type: "ParserStateMachine *", name: "p_psm"}, ], }, + { + name: "on_parsed_type", + doc: ["update state machine for type emitted by nested ssm"], + return_type: "void", + args: [ + {type: "obj", name: "type"}, + {type: "ParserStateMachine *", name: "p_psm"}, + ], + }, { name: "on_parsed_formal", doc: ["operate state machine for formal emitted by nested ssm"], diff --git a/include/xo/reader2/DSyntaxStateMachine.hpp b/include/xo/reader2/DSyntaxStateMachine.hpp index adce34e1..10aeccfa 100644 --- a/include/xo/reader2/DSyntaxStateMachine.hpp +++ b/include/xo/reader2/DSyntaxStateMachine.hpp @@ -44,6 +44,17 @@ namespace xo { self.get_expect_str()); } + /** Explicit error path **/ + void illegal_type(obj type, + ParserStateMachine * p_psm) + { + Derived & self = static_cast(*this); + + p_psm->illegal_input_on_type(Derived::ssm_classname(), + type, + self.get_expect_str()); + } + /** Explicit error path **/ void illegal_quoted_literal(obj lit, ParserStateMachine * p_psm) @@ -88,6 +99,14 @@ namespace xo { self.get_expect_str()); } + /** Default implementation for require SyntaxStateMachine facet method + **/ + void on_parsed_type(obj type, + ParserStateMachine * p_psm) + { + this->illegal_type(type, p_psm); + } + /** Default implementation for required SyntaxStateMachine facet method **/ void on_parsed_formal(const DUniqueString * param_name, diff --git a/include/xo/reader2/ParserStateMachine.hpp b/include/xo/reader2/ParserStateMachine.hpp index a247688a..2553acbf 100644 --- a/include/xo/reader2/ParserStateMachine.hpp +++ b/include/xo/reader2/ParserStateMachine.hpp @@ -11,6 +11,7 @@ #include #include #include +#include #include #include #include @@ -234,6 +235,14 @@ namespace xo { TypeDescr td, std::string_view expect_str); + /** report illegal input arriving in syntax state machine (ssm) @p ssm_name + * when receiving type definition @p ty. + * @p expect_str sketches expected input in current ssm state + **/ + void illegal_input_on_type(std::string_view ssm_name, + obj ty, + std::string_view expect_str); + /** report illegal parsed formal (param_name, param_type) from nested ssm. * Introducing as placeholder; not expected to be reachable in * full parser diff --git a/include/xo/reader2/ssm/ASyntaxStateMachine.hpp b/include/xo/reader2/ssm/ASyntaxStateMachine.hpp index b7fa0a92..a010421d 100644 --- a/include/xo/reader2/ssm/ASyntaxStateMachine.hpp +++ b/include/xo/reader2/ssm/ASyntaxStateMachine.hpp @@ -16,6 +16,7 @@ // includes (via {facet_includes}) #include "ParserStateMachine.hpp" #include "syntaxstatetype.hpp" +#include #include #include #include @@ -67,6 +68,8 @@ public: 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; + /** update state machine for type emitted by nested ssm **/ + virtual void on_parsed_type(Opaque data, obj type, ParserStateMachine * p_psm) = 0; /** operate state machine for formal emitted by nested ssm **/ virtual void on_parsed_formal(Opaque data, const DUniqueString * param_name, TypeDescr param_type, ParserStateMachine * p_psm) = 0; /** operate state machine for formal emitted by nested ssm **/ diff --git a/include/xo/reader2/ssm/ISyntaxStateMachine_Any.hpp b/include/xo/reader2/ssm/ISyntaxStateMachine_Any.hpp index 81d00656..2f00d0a4 100644 --- a/include/xo/reader2/ssm/ISyntaxStateMachine_Any.hpp +++ b/include/xo/reader2/ssm/ISyntaxStateMachine_Any.hpp @@ -67,6 +67,7 @@ namespace scm { [[noreturn]] void on_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; + [[noreturn]] void on_parsed_type(Opaque, obj, ParserStateMachine *) override; [[noreturn]] void on_parsed_formal(Opaque, const DUniqueString *, TypeDescr, ParserStateMachine *) override; [[noreturn]] void on_parsed_formal_with_token(Opaque, const DUniqueString *, TypeDescr, const Token &, ParserStateMachine *) override; [[noreturn]] void on_parsed_formal_arglist(Opaque, DArray *, ParserStateMachine *) override; diff --git a/include/xo/reader2/ssm/ISyntaxStateMachine_DApplySsm.hpp b/include/xo/reader2/ssm/ISyntaxStateMachine_DApplySsm.hpp index 75863bfc..0b0f6972 100644 --- a/include/xo/reader2/ssm/ISyntaxStateMachine_DApplySsm.hpp +++ b/include/xo/reader2/ssm/ISyntaxStateMachine_DApplySsm.hpp @@ -61,6 +61,8 @@ namespace xo { static void on_parsed_symbol(DApplySsm & self, std::string_view sym, ParserStateMachine * p_psm); /** operate state machine for incoming type description @p td **/ static void on_parsed_typedescr(DApplySsm & self, TypeDescr td, ParserStateMachine * p_psm); + /** update state machine for type emitted by nested ssm **/ + static void on_parsed_type(DApplySsm & self, obj type, ParserStateMachine * p_psm); /** operate state machine for formal emitted by nested ssm **/ static void on_parsed_formal(DApplySsm & self, const DUniqueString * param_name, TypeDescr param_type, ParserStateMachine * p_psm); /** operate state machine for formal emitted by nested ssm **/ diff --git a/include/xo/reader2/ssm/ISyntaxStateMachine_DDefineSsm.hpp b/include/xo/reader2/ssm/ISyntaxStateMachine_DDefineSsm.hpp index 0191de54..d8b28de8 100644 --- a/include/xo/reader2/ssm/ISyntaxStateMachine_DDefineSsm.hpp +++ b/include/xo/reader2/ssm/ISyntaxStateMachine_DDefineSsm.hpp @@ -61,6 +61,8 @@ namespace xo { 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); + /** update state machine for type emitted by nested ssm **/ + static void on_parsed_type(DDefineSsm & self, obj type, ParserStateMachine * p_psm); /** operate state machine for formal emitted by nested ssm **/ static void on_parsed_formal(DDefineSsm & self, const DUniqueString * param_name, TypeDescr param_type, ParserStateMachine * p_psm); /** operate state machine for formal emitted by nested ssm **/ diff --git a/include/xo/reader2/ssm/ISyntaxStateMachine_DExpectExprSsm.hpp b/include/xo/reader2/ssm/ISyntaxStateMachine_DExpectExprSsm.hpp index a84ed1b1..1cde9c14 100644 --- a/include/xo/reader2/ssm/ISyntaxStateMachine_DExpectExprSsm.hpp +++ b/include/xo/reader2/ssm/ISyntaxStateMachine_DExpectExprSsm.hpp @@ -61,6 +61,8 @@ namespace xo { static void on_parsed_symbol(DExpectExprSsm & self, std::string_view sym, ParserStateMachine * p_psm); /** operate state machine for incoming type description @p td **/ static void on_parsed_typedescr(DExpectExprSsm & self, TypeDescr td, ParserStateMachine * p_psm); + /** update state machine for type emitted by nested ssm **/ + static void on_parsed_type(DExpectExprSsm & self, obj type, ParserStateMachine * p_psm); /** operate state machine for formal emitted by nested ssm **/ static void on_parsed_formal(DExpectExprSsm & self, const DUniqueString * param_name, TypeDescr param_type, ParserStateMachine * p_psm); /** operate state machine for formal emitted by nested ssm **/ diff --git a/include/xo/reader2/ssm/ISyntaxStateMachine_DExpectFormalArgSsm.hpp b/include/xo/reader2/ssm/ISyntaxStateMachine_DExpectFormalArgSsm.hpp index 4e924170..2c6da502 100644 --- a/include/xo/reader2/ssm/ISyntaxStateMachine_DExpectFormalArgSsm.hpp +++ b/include/xo/reader2/ssm/ISyntaxStateMachine_DExpectFormalArgSsm.hpp @@ -61,6 +61,8 @@ namespace xo { static void on_parsed_symbol(DExpectFormalArgSsm & self, std::string_view sym, ParserStateMachine * p_psm); /** operate state machine for incoming type description @p td **/ static void on_parsed_typedescr(DExpectFormalArgSsm & self, TypeDescr td, ParserStateMachine * p_psm); + /** update state machine for type emitted by nested ssm **/ + static void on_parsed_type(DExpectFormalArgSsm & self, obj type, ParserStateMachine * p_psm); /** operate state machine for formal emitted by nested ssm **/ static void on_parsed_formal(DExpectFormalArgSsm & self, const DUniqueString * param_name, TypeDescr param_type, ParserStateMachine * p_psm); /** operate state machine for formal emitted by nested ssm **/ diff --git a/include/xo/reader2/ssm/ISyntaxStateMachine_DExpectFormalArglistSsm.hpp b/include/xo/reader2/ssm/ISyntaxStateMachine_DExpectFormalArglistSsm.hpp index d1e388b2..78e7db56 100644 --- a/include/xo/reader2/ssm/ISyntaxStateMachine_DExpectFormalArglistSsm.hpp +++ b/include/xo/reader2/ssm/ISyntaxStateMachine_DExpectFormalArglistSsm.hpp @@ -61,6 +61,8 @@ namespace xo { static void on_parsed_symbol(DExpectFormalArglistSsm & self, std::string_view sym, ParserStateMachine * p_psm); /** operate state machine for incoming type description @p td **/ static void on_parsed_typedescr(DExpectFormalArglistSsm & self, TypeDescr td, ParserStateMachine * p_psm); + /** update state machine for type emitted by nested ssm **/ + static void on_parsed_type(DExpectFormalArglistSsm & self, obj type, ParserStateMachine * p_psm); /** operate state machine for formal emitted by nested ssm **/ static void on_parsed_formal(DExpectFormalArglistSsm & self, const DUniqueString * param_name, TypeDescr param_type, ParserStateMachine * p_psm); /** operate state machine for formal emitted by nested ssm **/ diff --git a/include/xo/reader2/ssm/ISyntaxStateMachine_DExpectQArraySsm.hpp b/include/xo/reader2/ssm/ISyntaxStateMachine_DExpectQArraySsm.hpp index 78018537..c77c635d 100644 --- a/include/xo/reader2/ssm/ISyntaxStateMachine_DExpectQArraySsm.hpp +++ b/include/xo/reader2/ssm/ISyntaxStateMachine_DExpectQArraySsm.hpp @@ -61,6 +61,8 @@ namespace xo { static void on_parsed_symbol(DExpectQArraySsm & self, std::string_view sym, ParserStateMachine * p_psm); /** operate state machine for incoming type description @p td **/ static void on_parsed_typedescr(DExpectQArraySsm & self, TypeDescr td, ParserStateMachine * p_psm); + /** update state machine for type emitted by nested ssm **/ + static void on_parsed_type(DExpectQArraySsm & self, obj type, ParserStateMachine * p_psm); /** operate state machine for formal emitted by nested ssm **/ static void on_parsed_formal(DExpectQArraySsm & self, const DUniqueString * param_name, TypeDescr param_type, ParserStateMachine * p_psm); /** operate state machine for formal emitted by nested ssm **/ diff --git a/include/xo/reader2/ssm/ISyntaxStateMachine_DExpectQListSsm.hpp b/include/xo/reader2/ssm/ISyntaxStateMachine_DExpectQListSsm.hpp index 6cd1a38b..14ff3627 100644 --- a/include/xo/reader2/ssm/ISyntaxStateMachine_DExpectQListSsm.hpp +++ b/include/xo/reader2/ssm/ISyntaxStateMachine_DExpectQListSsm.hpp @@ -61,6 +61,8 @@ namespace xo { static void on_parsed_symbol(DExpectQListSsm & self, std::string_view sym, ParserStateMachine * p_psm); /** operate state machine for incoming type description @p td **/ static void on_parsed_typedescr(DExpectQListSsm & self, TypeDescr td, ParserStateMachine * p_psm); + /** update state machine for type emitted by nested ssm **/ + static void on_parsed_type(DExpectQListSsm & self, obj type, ParserStateMachine * p_psm); /** operate state machine for formal emitted by nested ssm **/ static void on_parsed_formal(DExpectQListSsm & self, const DUniqueString * param_name, TypeDescr param_type, ParserStateMachine * p_psm); /** operate state machine for formal emitted by nested ssm **/ diff --git a/include/xo/reader2/ssm/ISyntaxStateMachine_DExpectQLiteralSsm.hpp b/include/xo/reader2/ssm/ISyntaxStateMachine_DExpectQLiteralSsm.hpp index 303d137e..b19181a8 100644 --- a/include/xo/reader2/ssm/ISyntaxStateMachine_DExpectQLiteralSsm.hpp +++ b/include/xo/reader2/ssm/ISyntaxStateMachine_DExpectQLiteralSsm.hpp @@ -61,6 +61,8 @@ namespace xo { static void on_parsed_symbol(DExpectQLiteralSsm & self, std::string_view sym, ParserStateMachine * p_psm); /** operate state machine for incoming type description @p td **/ static void on_parsed_typedescr(DExpectQLiteralSsm & self, TypeDescr td, ParserStateMachine * p_psm); + /** update state machine for type emitted by nested ssm **/ + static void on_parsed_type(DExpectQLiteralSsm & self, obj type, ParserStateMachine * p_psm); /** operate state machine for formal emitted by nested ssm **/ static void on_parsed_formal(DExpectQLiteralSsm & self, const DUniqueString * param_name, TypeDescr param_type, ParserStateMachine * p_psm); /** operate state machine for formal emitted by nested ssm **/ diff --git a/include/xo/reader2/ssm/ISyntaxStateMachine_DExpectSymbolSsm.hpp b/include/xo/reader2/ssm/ISyntaxStateMachine_DExpectSymbolSsm.hpp index f39e2af3..431cba69 100644 --- a/include/xo/reader2/ssm/ISyntaxStateMachine_DExpectSymbolSsm.hpp +++ b/include/xo/reader2/ssm/ISyntaxStateMachine_DExpectSymbolSsm.hpp @@ -61,6 +61,8 @@ namespace xo { 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); + /** update state machine for type emitted by nested ssm **/ + static void on_parsed_type(DExpectSymbolSsm & self, obj type, ParserStateMachine * p_psm); /** operate state machine for formal emitted by nested ssm **/ static void on_parsed_formal(DExpectSymbolSsm & self, const DUniqueString * param_name, TypeDescr param_type, ParserStateMachine * p_psm); /** operate state machine for formal emitted by nested ssm **/ diff --git a/include/xo/reader2/ssm/ISyntaxStateMachine_DExpectTypeSsm.hpp b/include/xo/reader2/ssm/ISyntaxStateMachine_DExpectTypeSsm.hpp index ba997e28..f43f83c7 100644 --- a/include/xo/reader2/ssm/ISyntaxStateMachine_DExpectTypeSsm.hpp +++ b/include/xo/reader2/ssm/ISyntaxStateMachine_DExpectTypeSsm.hpp @@ -61,6 +61,8 @@ namespace xo { 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); + /** update state machine for type emitted by nested ssm **/ + static void on_parsed_type(DExpectTypeSsm & self, obj type, ParserStateMachine * p_psm); /** operate state machine for formal emitted by nested ssm **/ static void on_parsed_formal(DExpectTypeSsm & self, const DUniqueString * param_name, TypeDescr param_type, ParserStateMachine * p_psm); /** operate state machine for formal emitted by nested ssm **/ diff --git a/include/xo/reader2/ssm/ISyntaxStateMachine_DIfElseSsm.hpp b/include/xo/reader2/ssm/ISyntaxStateMachine_DIfElseSsm.hpp index b189bf87..6b9dd33f 100644 --- a/include/xo/reader2/ssm/ISyntaxStateMachine_DIfElseSsm.hpp +++ b/include/xo/reader2/ssm/ISyntaxStateMachine_DIfElseSsm.hpp @@ -61,6 +61,8 @@ namespace xo { static void on_parsed_symbol(DIfElseSsm & self, std::string_view sym, ParserStateMachine * p_psm); /** operate state machine for incoming type description @p td **/ static void on_parsed_typedescr(DIfElseSsm & self, TypeDescr td, ParserStateMachine * p_psm); + /** update state machine for type emitted by nested ssm **/ + static void on_parsed_type(DIfElseSsm & self, obj type, ParserStateMachine * p_psm); /** operate state machine for formal emitted by nested ssm **/ static void on_parsed_formal(DIfElseSsm & self, const DUniqueString * param_name, TypeDescr param_type, ParserStateMachine * p_psm); /** operate state machine for formal emitted by nested ssm **/ diff --git a/include/xo/reader2/ssm/ISyntaxStateMachine_DLambdaSsm.hpp b/include/xo/reader2/ssm/ISyntaxStateMachine_DLambdaSsm.hpp index 9c97287f..8ba94c58 100644 --- a/include/xo/reader2/ssm/ISyntaxStateMachine_DLambdaSsm.hpp +++ b/include/xo/reader2/ssm/ISyntaxStateMachine_DLambdaSsm.hpp @@ -61,6 +61,8 @@ namespace xo { static void on_parsed_symbol(DLambdaSsm & self, std::string_view sym, ParserStateMachine * p_psm); /** operate state machine for incoming type description @p td **/ static void on_parsed_typedescr(DLambdaSsm & self, TypeDescr td, ParserStateMachine * p_psm); + /** update state machine for type emitted by nested ssm **/ + static void on_parsed_type(DLambdaSsm & self, obj type, ParserStateMachine * p_psm); /** operate state machine for formal emitted by nested ssm **/ static void on_parsed_formal(DLambdaSsm & self, const DUniqueString * param_name, TypeDescr param_type, ParserStateMachine * p_psm); /** operate state machine for formal emitted by nested ssm **/ diff --git a/include/xo/reader2/ssm/ISyntaxStateMachine_DParenSsm.hpp b/include/xo/reader2/ssm/ISyntaxStateMachine_DParenSsm.hpp index 65cd1727..ef74a525 100644 --- a/include/xo/reader2/ssm/ISyntaxStateMachine_DParenSsm.hpp +++ b/include/xo/reader2/ssm/ISyntaxStateMachine_DParenSsm.hpp @@ -61,6 +61,8 @@ namespace xo { static void on_parsed_symbol(DParenSsm & self, std::string_view sym, ParserStateMachine * p_psm); /** operate state machine for incoming type description @p td **/ static void on_parsed_typedescr(DParenSsm & self, TypeDescr td, ParserStateMachine * p_psm); + /** update state machine for type emitted by nested ssm **/ + static void on_parsed_type(DParenSsm & self, obj type, ParserStateMachine * p_psm); /** operate state machine for formal emitted by nested ssm **/ static void on_parsed_formal(DParenSsm & self, const DUniqueString * param_name, TypeDescr param_type, ParserStateMachine * p_psm); /** operate state machine for formal emitted by nested ssm **/ diff --git a/include/xo/reader2/ssm/ISyntaxStateMachine_DProgressSsm.hpp b/include/xo/reader2/ssm/ISyntaxStateMachine_DProgressSsm.hpp index 431892b9..c5e91891 100644 --- a/include/xo/reader2/ssm/ISyntaxStateMachine_DProgressSsm.hpp +++ b/include/xo/reader2/ssm/ISyntaxStateMachine_DProgressSsm.hpp @@ -61,6 +61,8 @@ namespace xo { static void on_parsed_symbol(DProgressSsm & self, std::string_view sym, ParserStateMachine * p_psm); /** operate state machine for incoming type description @p td **/ static void on_parsed_typedescr(DProgressSsm & self, TypeDescr td, ParserStateMachine * p_psm); + /** update state machine for type emitted by nested ssm **/ + static void on_parsed_type(DProgressSsm & self, obj type, ParserStateMachine * p_psm); /** operate state machine for formal emitted by nested ssm **/ static void on_parsed_formal(DProgressSsm & self, const DUniqueString * param_name, TypeDescr param_type, ParserStateMachine * p_psm); /** operate state machine for formal emitted by nested ssm **/ diff --git a/include/xo/reader2/ssm/ISyntaxStateMachine_DQuoteSsm.hpp b/include/xo/reader2/ssm/ISyntaxStateMachine_DQuoteSsm.hpp index e5548af5..7f776ca0 100644 --- a/include/xo/reader2/ssm/ISyntaxStateMachine_DQuoteSsm.hpp +++ b/include/xo/reader2/ssm/ISyntaxStateMachine_DQuoteSsm.hpp @@ -61,6 +61,8 @@ namespace xo { static void on_parsed_symbol(DQuoteSsm & self, std::string_view sym, ParserStateMachine * p_psm); /** operate state machine for incoming type description @p td **/ static void on_parsed_typedescr(DQuoteSsm & self, TypeDescr td, ParserStateMachine * p_psm); + /** update state machine for type emitted by nested ssm **/ + static void on_parsed_type(DQuoteSsm & self, obj type, ParserStateMachine * p_psm); /** operate state machine for formal emitted by nested ssm **/ static void on_parsed_formal(DQuoteSsm & self, const DUniqueString * param_name, TypeDescr param_type, ParserStateMachine * p_psm); /** operate state machine for formal emitted by nested ssm **/ diff --git a/include/xo/reader2/ssm/ISyntaxStateMachine_DSequenceSsm.hpp b/include/xo/reader2/ssm/ISyntaxStateMachine_DSequenceSsm.hpp index 448b296b..361922ef 100644 --- a/include/xo/reader2/ssm/ISyntaxStateMachine_DSequenceSsm.hpp +++ b/include/xo/reader2/ssm/ISyntaxStateMachine_DSequenceSsm.hpp @@ -61,6 +61,8 @@ namespace xo { static void on_parsed_symbol(DSequenceSsm & self, std::string_view sym, ParserStateMachine * p_psm); /** operate state machine for incoming type description @p td **/ static void on_parsed_typedescr(DSequenceSsm & self, TypeDescr td, ParserStateMachine * p_psm); + /** update state machine for type emitted by nested ssm **/ + static void on_parsed_type(DSequenceSsm & self, obj type, ParserStateMachine * p_psm); /** operate state machine for formal emitted by nested ssm **/ static void on_parsed_formal(DSequenceSsm & self, const DUniqueString * param_name, TypeDescr param_type, ParserStateMachine * p_psm); /** operate state machine for formal emitted by nested ssm **/ diff --git a/include/xo/reader2/ssm/ISyntaxStateMachine_DToplevelSeqSsm.hpp b/include/xo/reader2/ssm/ISyntaxStateMachine_DToplevelSeqSsm.hpp index 9aa70c43..fbb45bef 100644 --- a/include/xo/reader2/ssm/ISyntaxStateMachine_DToplevelSeqSsm.hpp +++ b/include/xo/reader2/ssm/ISyntaxStateMachine_DToplevelSeqSsm.hpp @@ -61,6 +61,8 @@ namespace xo { static void on_parsed_symbol(DToplevelSeqSsm & self, std::string_view sym, ParserStateMachine * p_psm); /** operate state machine for incoming type description @p td **/ static void on_parsed_typedescr(DToplevelSeqSsm & self, TypeDescr td, ParserStateMachine * p_psm); + /** update state machine for type emitted by nested ssm **/ + static void on_parsed_type(DToplevelSeqSsm & self, obj type, ParserStateMachine * p_psm); /** operate state machine for formal emitted by nested ssm **/ static void on_parsed_formal(DToplevelSeqSsm & self, const DUniqueString * param_name, TypeDescr param_type, ParserStateMachine * p_psm); /** operate state machine for formal emitted by nested ssm **/ diff --git a/include/xo/reader2/ssm/ISyntaxStateMachine_Xfer.hpp b/include/xo/reader2/ssm/ISyntaxStateMachine_Xfer.hpp index 4a77f0c4..67b187cf 100644 --- a/include/xo/reader2/ssm/ISyntaxStateMachine_Xfer.hpp +++ b/include/xo/reader2/ssm/ISyntaxStateMachine_Xfer.hpp @@ -15,6 +15,7 @@ #include "ParserStateMachine.hpp" #include "syntaxstatetype.hpp" +#include #include #include @@ -65,6 +66,9 @@ namespace scm { void on_parsed_typedescr(Opaque data, TypeDescr td, ParserStateMachine * p_psm) override { return I::on_parsed_typedescr(_dcast(data), td, p_psm); } + void on_parsed_type(Opaque data, obj type, ParserStateMachine * p_psm) override { + return I::on_parsed_type(_dcast(data), type, p_psm); + } void on_parsed_formal(Opaque data, const DUniqueString * param_name, TypeDescr param_type, ParserStateMachine * p_psm) override { return I::on_parsed_formal(_dcast(data), param_name, param_type, p_psm); } diff --git a/include/xo/reader2/ssm/RSyntaxStateMachine.hpp b/include/xo/reader2/ssm/RSyntaxStateMachine.hpp index 33321d14..4ac4c791 100644 --- a/include/xo/reader2/ssm/RSyntaxStateMachine.hpp +++ b/include/xo/reader2/ssm/RSyntaxStateMachine.hpp @@ -71,6 +71,9 @@ public: void on_parsed_typedescr(TypeDescr td, ParserStateMachine * p_psm) { return O::iface()->on_parsed_typedescr(O::data(), td, p_psm); } + void on_parsed_type(obj type, ParserStateMachine * p_psm) { + return O::iface()->on_parsed_type(O::data(), type, p_psm); + } void on_parsed_formal(const DUniqueString * param_name, TypeDescr param_type, ParserStateMachine * p_psm) { return O::iface()->on_parsed_formal(O::data(), param_name, param_type, p_psm); } diff --git a/src/reader2/CMakeLists.txt b/src/reader2/CMakeLists.txt index 15a7a338..8633f75a 100644 --- a/src/reader2/CMakeLists.txt +++ b/src/reader2/CMakeLists.txt @@ -92,6 +92,7 @@ xo_add_shared_library4(${SELF_LIB} ${PROJECT_NAME}Targets ${PROJECT_VERSION} 1 $ xo_dependency(${SELF_LIB} xo_numeric) xo_dependency(${SELF_LIB} xo_procedure2) xo_dependency(${SELF_LIB} xo_gc) +xo_dependency(${SELF_LIB} xo_type) xo_dependency(${SELF_LIB} xo_tokenizer2) xo_dependency(${SELF_LIB} xo_expression2) #xo_dependency(${SELF_LIB} reflect) diff --git a/src/reader2/ISyntaxStateMachine_Any.cpp b/src/reader2/ISyntaxStateMachine_Any.cpp index ccf69ca8..7d401163 100644 --- a/src/reader2/ISyntaxStateMachine_Any.cpp +++ b/src/reader2/ISyntaxStateMachine_Any.cpp @@ -53,6 +53,12 @@ ISyntaxStateMachine_Any::on_parsed_typedescr(Opaque, TypeDescr, ParserStateMachi _fatal(); } +auto +ISyntaxStateMachine_Any::on_parsed_type(Opaque, obj, ParserStateMachine *) -> void +{ + _fatal(); +} + auto ISyntaxStateMachine_Any::on_parsed_formal(Opaque, const DUniqueString *, TypeDescr, ParserStateMachine *) -> void { diff --git a/src/reader2/ISyntaxStateMachine_DApplySsm.cpp b/src/reader2/ISyntaxStateMachine_DApplySsm.cpp index f5cbb4e2..cd1a550d 100644 --- a/src/reader2/ISyntaxStateMachine_DApplySsm.cpp +++ b/src/reader2/ISyntaxStateMachine_DApplySsm.cpp @@ -43,6 +43,11 @@ namespace xo { self.on_parsed_typedescr(td, p_psm); } auto + ISyntaxStateMachine_DApplySsm::on_parsed_type(DApplySsm & self, obj type, ParserStateMachine * p_psm) -> void + { + self.on_parsed_type(type, p_psm); + } + auto ISyntaxStateMachine_DApplySsm::on_parsed_formal(DApplySsm & self, const DUniqueString * param_name, TypeDescr param_type, ParserStateMachine * p_psm) -> void { self.on_parsed_formal(param_name, param_type, p_psm); diff --git a/src/reader2/ISyntaxStateMachine_DDefineSsm.cpp b/src/reader2/ISyntaxStateMachine_DDefineSsm.cpp index be766921..e038fac3 100644 --- a/src/reader2/ISyntaxStateMachine_DDefineSsm.cpp +++ b/src/reader2/ISyntaxStateMachine_DDefineSsm.cpp @@ -43,6 +43,11 @@ namespace xo { self.on_parsed_typedescr(td, p_psm); } auto + ISyntaxStateMachine_DDefineSsm::on_parsed_type(DDefineSsm & self, obj type, ParserStateMachine * p_psm) -> void + { + self.on_parsed_type(type, p_psm); + } + auto ISyntaxStateMachine_DDefineSsm::on_parsed_formal(DDefineSsm & self, const DUniqueString * param_name, TypeDescr param_type, ParserStateMachine * p_psm) -> void { self.on_parsed_formal(param_name, param_type, p_psm); diff --git a/src/reader2/ISyntaxStateMachine_DExpectExprSsm.cpp b/src/reader2/ISyntaxStateMachine_DExpectExprSsm.cpp index d505b427..911ec4d5 100644 --- a/src/reader2/ISyntaxStateMachine_DExpectExprSsm.cpp +++ b/src/reader2/ISyntaxStateMachine_DExpectExprSsm.cpp @@ -43,6 +43,11 @@ namespace xo { self.on_parsed_typedescr(td, p_psm); } auto + ISyntaxStateMachine_DExpectExprSsm::on_parsed_type(DExpectExprSsm & self, obj type, ParserStateMachine * p_psm) -> void + { + self.on_parsed_type(type, p_psm); + } + auto ISyntaxStateMachine_DExpectExprSsm::on_parsed_formal(DExpectExprSsm & self, const DUniqueString * param_name, TypeDescr param_type, ParserStateMachine * p_psm) -> void { self.on_parsed_formal(param_name, param_type, p_psm); diff --git a/src/reader2/ISyntaxStateMachine_DExpectFormalArgSsm.cpp b/src/reader2/ISyntaxStateMachine_DExpectFormalArgSsm.cpp index 50131470..1089d5ee 100644 --- a/src/reader2/ISyntaxStateMachine_DExpectFormalArgSsm.cpp +++ b/src/reader2/ISyntaxStateMachine_DExpectFormalArgSsm.cpp @@ -43,6 +43,11 @@ namespace xo { self.on_parsed_typedescr(td, p_psm); } auto + ISyntaxStateMachine_DExpectFormalArgSsm::on_parsed_type(DExpectFormalArgSsm & self, obj type, ParserStateMachine * p_psm) -> void + { + self.on_parsed_type(type, p_psm); + } + auto ISyntaxStateMachine_DExpectFormalArgSsm::on_parsed_formal(DExpectFormalArgSsm & self, const DUniqueString * param_name, TypeDescr param_type, ParserStateMachine * p_psm) -> void { self.on_parsed_formal(param_name, param_type, p_psm); diff --git a/src/reader2/ISyntaxStateMachine_DExpectFormalArglistSsm.cpp b/src/reader2/ISyntaxStateMachine_DExpectFormalArglistSsm.cpp index 982ce47a..b92e9655 100644 --- a/src/reader2/ISyntaxStateMachine_DExpectFormalArglistSsm.cpp +++ b/src/reader2/ISyntaxStateMachine_DExpectFormalArglistSsm.cpp @@ -43,6 +43,11 @@ namespace xo { self.on_parsed_typedescr(td, p_psm); } auto + ISyntaxStateMachine_DExpectFormalArglistSsm::on_parsed_type(DExpectFormalArglistSsm & self, obj type, ParserStateMachine * p_psm) -> void + { + self.on_parsed_type(type, p_psm); + } + auto ISyntaxStateMachine_DExpectFormalArglistSsm::on_parsed_formal(DExpectFormalArglistSsm & self, const DUniqueString * param_name, TypeDescr param_type, ParserStateMachine * p_psm) -> void { self.on_parsed_formal(param_name, param_type, p_psm); diff --git a/src/reader2/ISyntaxStateMachine_DExpectQArraySsm.cpp b/src/reader2/ISyntaxStateMachine_DExpectQArraySsm.cpp index 32d8bfd1..e205409f 100644 --- a/src/reader2/ISyntaxStateMachine_DExpectQArraySsm.cpp +++ b/src/reader2/ISyntaxStateMachine_DExpectQArraySsm.cpp @@ -43,6 +43,11 @@ namespace xo { self.on_parsed_typedescr(td, p_psm); } auto + ISyntaxStateMachine_DExpectQArraySsm::on_parsed_type(DExpectQArraySsm & self, obj type, ParserStateMachine * p_psm) -> void + { + self.on_parsed_type(type, p_psm); + } + auto ISyntaxStateMachine_DExpectQArraySsm::on_parsed_formal(DExpectQArraySsm & self, const DUniqueString * param_name, TypeDescr param_type, ParserStateMachine * p_psm) -> void { self.on_parsed_formal(param_name, param_type, p_psm); diff --git a/src/reader2/ISyntaxStateMachine_DExpectQListSsm.cpp b/src/reader2/ISyntaxStateMachine_DExpectQListSsm.cpp index 2d24b697..0f64936e 100644 --- a/src/reader2/ISyntaxStateMachine_DExpectQListSsm.cpp +++ b/src/reader2/ISyntaxStateMachine_DExpectQListSsm.cpp @@ -43,6 +43,11 @@ namespace xo { self.on_parsed_typedescr(td, p_psm); } auto + ISyntaxStateMachine_DExpectQListSsm::on_parsed_type(DExpectQListSsm & self, obj type, ParserStateMachine * p_psm) -> void + { + self.on_parsed_type(type, p_psm); + } + auto ISyntaxStateMachine_DExpectQListSsm::on_parsed_formal(DExpectQListSsm & self, const DUniqueString * param_name, TypeDescr param_type, ParserStateMachine * p_psm) -> void { self.on_parsed_formal(param_name, param_type, p_psm); diff --git a/src/reader2/ISyntaxStateMachine_DExpectQLiteralSsm.cpp b/src/reader2/ISyntaxStateMachine_DExpectQLiteralSsm.cpp index 977b1194..bde94b6b 100644 --- a/src/reader2/ISyntaxStateMachine_DExpectQLiteralSsm.cpp +++ b/src/reader2/ISyntaxStateMachine_DExpectQLiteralSsm.cpp @@ -43,6 +43,11 @@ namespace xo { self.on_parsed_typedescr(td, p_psm); } auto + ISyntaxStateMachine_DExpectQLiteralSsm::on_parsed_type(DExpectQLiteralSsm & self, obj type, ParserStateMachine * p_psm) -> void + { + self.on_parsed_type(type, p_psm); + } + auto ISyntaxStateMachine_DExpectQLiteralSsm::on_parsed_formal(DExpectQLiteralSsm & self, const DUniqueString * param_name, TypeDescr param_type, ParserStateMachine * p_psm) -> void { self.on_parsed_formal(param_name, param_type, p_psm); diff --git a/src/reader2/ISyntaxStateMachine_DExpectSymbolSsm.cpp b/src/reader2/ISyntaxStateMachine_DExpectSymbolSsm.cpp index 3701069f..ebeaafe7 100644 --- a/src/reader2/ISyntaxStateMachine_DExpectSymbolSsm.cpp +++ b/src/reader2/ISyntaxStateMachine_DExpectSymbolSsm.cpp @@ -43,6 +43,11 @@ namespace xo { self.on_parsed_typedescr(td, p_psm); } auto + ISyntaxStateMachine_DExpectSymbolSsm::on_parsed_type(DExpectSymbolSsm & self, obj type, ParserStateMachine * p_psm) -> void + { + self.on_parsed_type(type, p_psm); + } + auto ISyntaxStateMachine_DExpectSymbolSsm::on_parsed_formal(DExpectSymbolSsm & self, const DUniqueString * param_name, TypeDescr param_type, ParserStateMachine * p_psm) -> void { self.on_parsed_formal(param_name, param_type, p_psm); diff --git a/src/reader2/ISyntaxStateMachine_DExpectTypeSsm.cpp b/src/reader2/ISyntaxStateMachine_DExpectTypeSsm.cpp index e83c591a..267810e2 100644 --- a/src/reader2/ISyntaxStateMachine_DExpectTypeSsm.cpp +++ b/src/reader2/ISyntaxStateMachine_DExpectTypeSsm.cpp @@ -43,6 +43,11 @@ namespace xo { self.on_parsed_typedescr(td, p_psm); } auto + ISyntaxStateMachine_DExpectTypeSsm::on_parsed_type(DExpectTypeSsm & self, obj type, ParserStateMachine * p_psm) -> void + { + self.on_parsed_type(type, p_psm); + } + auto ISyntaxStateMachine_DExpectTypeSsm::on_parsed_formal(DExpectTypeSsm & self, const DUniqueString * param_name, TypeDescr param_type, ParserStateMachine * p_psm) -> void { self.on_parsed_formal(param_name, param_type, p_psm); diff --git a/src/reader2/ISyntaxStateMachine_DIfElseSsm.cpp b/src/reader2/ISyntaxStateMachine_DIfElseSsm.cpp index fc28d9c9..fef959ca 100644 --- a/src/reader2/ISyntaxStateMachine_DIfElseSsm.cpp +++ b/src/reader2/ISyntaxStateMachine_DIfElseSsm.cpp @@ -43,6 +43,11 @@ namespace xo { self.on_parsed_typedescr(td, p_psm); } auto + ISyntaxStateMachine_DIfElseSsm::on_parsed_type(DIfElseSsm & self, obj type, ParserStateMachine * p_psm) -> void + { + self.on_parsed_type(type, p_psm); + } + auto ISyntaxStateMachine_DIfElseSsm::on_parsed_formal(DIfElseSsm & self, const DUniqueString * param_name, TypeDescr param_type, ParserStateMachine * p_psm) -> void { self.on_parsed_formal(param_name, param_type, p_psm); diff --git a/src/reader2/ISyntaxStateMachine_DLambdaSsm.cpp b/src/reader2/ISyntaxStateMachine_DLambdaSsm.cpp index 2ce18e6b..e131c12d 100644 --- a/src/reader2/ISyntaxStateMachine_DLambdaSsm.cpp +++ b/src/reader2/ISyntaxStateMachine_DLambdaSsm.cpp @@ -43,6 +43,11 @@ namespace xo { self.on_parsed_typedescr(td, p_psm); } auto + ISyntaxStateMachine_DLambdaSsm::on_parsed_type(DLambdaSsm & self, obj type, ParserStateMachine * p_psm) -> void + { + self.on_parsed_type(type, p_psm); + } + auto ISyntaxStateMachine_DLambdaSsm::on_parsed_formal(DLambdaSsm & self, const DUniqueString * param_name, TypeDescr param_type, ParserStateMachine * p_psm) -> void { self.on_parsed_formal(param_name, param_type, p_psm); diff --git a/src/reader2/ISyntaxStateMachine_DParenSsm.cpp b/src/reader2/ISyntaxStateMachine_DParenSsm.cpp index dcd49028..05f5d4cc 100644 --- a/src/reader2/ISyntaxStateMachine_DParenSsm.cpp +++ b/src/reader2/ISyntaxStateMachine_DParenSsm.cpp @@ -43,6 +43,11 @@ namespace xo { self.on_parsed_typedescr(td, p_psm); } auto + ISyntaxStateMachine_DParenSsm::on_parsed_type(DParenSsm & self, obj type, ParserStateMachine * p_psm) -> void + { + self.on_parsed_type(type, p_psm); + } + auto ISyntaxStateMachine_DParenSsm::on_parsed_formal(DParenSsm & self, const DUniqueString * param_name, TypeDescr param_type, ParserStateMachine * p_psm) -> void { self.on_parsed_formal(param_name, param_type, p_psm); diff --git a/src/reader2/ISyntaxStateMachine_DProgressSsm.cpp b/src/reader2/ISyntaxStateMachine_DProgressSsm.cpp index c9d1931c..f1c0e2cf 100644 --- a/src/reader2/ISyntaxStateMachine_DProgressSsm.cpp +++ b/src/reader2/ISyntaxStateMachine_DProgressSsm.cpp @@ -43,6 +43,11 @@ namespace xo { self.on_parsed_typedescr(td, p_psm); } auto + ISyntaxStateMachine_DProgressSsm::on_parsed_type(DProgressSsm & self, obj type, ParserStateMachine * p_psm) -> void + { + self.on_parsed_type(type, p_psm); + } + auto ISyntaxStateMachine_DProgressSsm::on_parsed_formal(DProgressSsm & self, const DUniqueString * param_name, TypeDescr param_type, ParserStateMachine * p_psm) -> void { self.on_parsed_formal(param_name, param_type, p_psm); diff --git a/src/reader2/ISyntaxStateMachine_DQuoteSsm.cpp b/src/reader2/ISyntaxStateMachine_DQuoteSsm.cpp index 9281d6f5..233819be 100644 --- a/src/reader2/ISyntaxStateMachine_DQuoteSsm.cpp +++ b/src/reader2/ISyntaxStateMachine_DQuoteSsm.cpp @@ -43,6 +43,11 @@ namespace xo { self.on_parsed_typedescr(td, p_psm); } auto + ISyntaxStateMachine_DQuoteSsm::on_parsed_type(DQuoteSsm & self, obj type, ParserStateMachine * p_psm) -> void + { + self.on_parsed_type(type, p_psm); + } + auto ISyntaxStateMachine_DQuoteSsm::on_parsed_formal(DQuoteSsm & self, const DUniqueString * param_name, TypeDescr param_type, ParserStateMachine * p_psm) -> void { self.on_parsed_formal(param_name, param_type, p_psm); diff --git a/src/reader2/ISyntaxStateMachine_DSequenceSsm.cpp b/src/reader2/ISyntaxStateMachine_DSequenceSsm.cpp index 5aa181bb..714a04f8 100644 --- a/src/reader2/ISyntaxStateMachine_DSequenceSsm.cpp +++ b/src/reader2/ISyntaxStateMachine_DSequenceSsm.cpp @@ -43,6 +43,11 @@ namespace xo { self.on_parsed_typedescr(td, p_psm); } auto + ISyntaxStateMachine_DSequenceSsm::on_parsed_type(DSequenceSsm & self, obj type, ParserStateMachine * p_psm) -> void + { + self.on_parsed_type(type, p_psm); + } + auto ISyntaxStateMachine_DSequenceSsm::on_parsed_formal(DSequenceSsm & self, const DUniqueString * param_name, TypeDescr param_type, ParserStateMachine * p_psm) -> void { self.on_parsed_formal(param_name, param_type, p_psm); diff --git a/src/reader2/ISyntaxStateMachine_DToplevelSeqSsm.cpp b/src/reader2/ISyntaxStateMachine_DToplevelSeqSsm.cpp index 698ccefc..e78c78c7 100644 --- a/src/reader2/ISyntaxStateMachine_DToplevelSeqSsm.cpp +++ b/src/reader2/ISyntaxStateMachine_DToplevelSeqSsm.cpp @@ -43,6 +43,11 @@ namespace xo { self.on_parsed_typedescr(td, p_psm); } auto + ISyntaxStateMachine_DToplevelSeqSsm::on_parsed_type(DToplevelSeqSsm & self, obj type, ParserStateMachine * p_psm) -> void + { + self.on_parsed_type(type, p_psm); + } + auto ISyntaxStateMachine_DToplevelSeqSsm::on_parsed_formal(DToplevelSeqSsm & self, const DUniqueString * param_name, TypeDescr param_type, ParserStateMachine * p_psm) -> void { self.on_parsed_formal(param_name, param_type, p_psm); diff --git a/src/reader2/ParserStateMachine.cpp b/src/reader2/ParserStateMachine.cpp index 125ca1dd..3c640332 100644 --- a/src/reader2/ParserStateMachine.cpp +++ b/src/reader2/ParserStateMachine.cpp @@ -439,6 +439,29 @@ namespace xo { this->capture_error(ssm_name, errmsg); } + void + ParserStateMachine::illegal_input_on_type(std::string_view ssm_name, + obj type, + 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 for parsing state", + xtag("type", type), + xtag("expecting", expect_str), + xtag("ssm", ssm_name), + xtag("via", "ParserStateMachine::illegal_input_on_type")); + + assert(expr_alloc_); + + auto errmsg = DString::from_view(expr_alloc_, + std::string_view(errmsg_string)); + + this->capture_error(ssm_name, errmsg); + } + void ParserStateMachine::illegal_parsed_formal(std::string_view ssm_name, const DUniqueString * param_name,