From 805169bad1a27d493687d793293c8f7c2efd5f6a Mon Sep 17 00:00:00 2001 From: codeboss <2422523675@qq.com> Date: Tue, 11 Feb 2025 23:36:30 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B8=90=E8=BF=9B=E6=A8=A1=E6=9D=BF=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- libSyntax/libsyntax.h | 6 ++-- libSyntax/syntax_novel.cpp | 63 ++++++++++++++++++++++++++++++-------- libSyntax/tokens_impl.h | 12 +++++--- libSyntax/tokens_novel.cpp | 56 ++++++++++++++++++++------------- libSyntax/tokens_novel.h | 40 +++++++++++++++++++----- 5 files changed, 129 insertions(+), 48 deletions(-) diff --git a/libSyntax/libsyntax.h b/libSyntax/libsyntax.h index bcacf30..094a026 100644 --- a/libSyntax/libsyntax.h +++ b/libSyntax/libsyntax.h @@ -179,7 +179,7 @@ namespace lib_syntax { * @brief token匹配 */ template XProc = nullptr> - requires std::derived_from + requires std::derived_from class TokenMatch : public IBasicRule, public std::enable_shared_from_this> { private: std::shared_ptr _define_peers; @@ -272,7 +272,9 @@ namespace lib_syntax { /** * @brief 基础模板化语法元素解析规则. */ - template class ElementRule : public ExprRule { + template + requires std::derived_from + class ElementRule : public ExprRule { public: ElementRule(const QString& rule_name, std::shared_ptr children) :ExprRule(rule_name, mark), _children_store(children) { } diff --git a/libSyntax/syntax_novel.cpp b/libSyntax/syntax_novel.cpp index 68943b2..37123a9 100644 --- a/libSyntax/syntax_novel.cpp +++ b/libSyntax/syntax_novel.cpp @@ -8,20 +8,20 @@ using namespace lib_token; using namespace ast_basic; // token-avaliable ========================================================================== -auto leftb = std::make_shared(); // { -auto rightb = std::make_shared(); // } -auto refers = std::make_shared(); // @ +auto leftb = std::make_shared(); // { +auto rightb = std::make_shared(); // } +auto refers = std::make_shared(); // @ auto declare = std::make_shared(); // # -auto split_mark = std::make_shared(); // & +auto split_mark = std::make_shared(); // & -auto rank_key = std::make_shared("排序", 0xAEu); // 排序 -auto story_key = std::make_shared("故事", 0xAAu); // 故事 -auto numbers = std::make_shared(); // [0-9]+ -auto slice_key = std::make_shared("剧情", 0xAFu); // 剧情 -auto point_key = std::make_shared("节点", 0xABu); // 节点 -auto volume_key = std::make_shared("分卷", 0xACu); // 分卷 -auto article_key = std::make_shared("章节", 0xADu); // 章节 -auto vtext = std::make_shared(); // ^([^\\{\\}@&]+) +auto rank_key = std::make_shared(); // 排序 +auto story_key = std::make_shared(); // 故事 +auto numbers = std::make_shared(); // [0-9]+ +auto slice_key = std::make_shared(); // 剧情 +auto point_key = std::make_shared(); // 节点 +auto volume_key = std::make_shared(); // 分卷 +auto article_key = std::make_shared(); // 章节 +auto vtext = std::make_shared(); // ^([^\\{\\}@&]+) auto name_text = std::make_shared(); // ^([^\\{\\}@&]+) @@ -296,4 +296,41 @@ std::shared_ptr NovalSyntax::getSyntaxTree() { // // node_register(child, next_child_items); // } -//} \ No newline at end of file +//} + + + +#include "syntax_templets.h" + +/** + * class DeclExpr : public ElementRule { +public: + DeclExpr() : ElementRule( + "decl_section", + MultiR(std::make_shared(Rules{ + MR(TextSection, numbers), MR(TextSection, vtext), MR(TextSection, refers), MR(TextSection, split_mark) + }))) { } + + // 通过 ElementRule 继承 + QList> expr_rule_parse(std::shared_ptr cursor) const override { + return _children_store->parse(cursor); + } +}; + */ + +using namespace lib_composit; + +template class TokenRn : public TokenR { }; +template class MultiRx : public ReptR { }; + +void rules() { + MultiRx, + TokenRn, + TokenRn, + TokenRn + >> dcc; + + AnyR, TokenRn, TokenRn, TokenRn> mmm; + ReptR decl; +} diff --git a/libSyntax/tokens_impl.h b/libSyntax/tokens_impl.h index 1ff4ae4..691787d 100644 --- a/libSyntax/tokens_impl.h +++ b/libSyntax/tokens_impl.h @@ -91,7 +91,9 @@ namespace lib_token { /** * @brief 表达式起始token */ - template class ExprBeginToken : public IActionToken { + template + requires std::derived_from + class ExprBeginToken : public IActionToken { private: std::shared_ptr _prev_token = nullptr; std::shared_ptr _self_rule = nullptr; @@ -103,7 +105,7 @@ namespace lib_token { ExprBeginToken(std::shared_ptr rule, std::shared_ptr prev) :_prev_token(prev), _self_rule(rule) { } - std::shared_ptr parentExpr(){ + std::shared_ptr parentExpr() { return this->_parent_expr; } @@ -147,14 +149,16 @@ namespace lib_token { /** * @brief 表达式终止token */ - template class ExprEndToken : public IActionToken { + template + requires std::derived_from + class ExprEndToken : public IActionToken { private: std::shared_ptr _prev_token = nullptr; std::shared_ptr> _self_start = nullptr; public: ExprEndToken(std::shared_ptr> start, std::shared_ptr prev) - : _prev_token(prev), _self_start(start){ } + : _prev_token(prev), _self_start(start) { } // 通过 IActionToken 继承 QString file() const override { diff --git a/libSyntax/tokens_novel.cpp b/libSyntax/tokens_novel.cpp index c15df00..a061fe6 100644 --- a/libSyntax/tokens_novel.cpp +++ b/libSyntax/tokens_novel.cpp @@ -7,17 +7,17 @@ using namespace lib_token; using namespace lib_words; -QString LeftBracket::reviseWords() const { return "{"; } +QString LBracket::reviseWords() const { return "{"; } -int LeftBracket::typeMark() const +int LBracket::typeMark() const { return 0x01000000; } -QString LeftBracket::regex() const { return "{"; } +QString LBracket::regex() const { return "{"; } std::tuple, std::shared_ptr> -LeftBracket::analysis(std::shared_ptr content) const { +LBracket::analysis(std::shared_ptr content) const { auto text = content->content(); if (!text.startsWith(regex())) return std::make_tuple(nullptr, content); @@ -34,37 +34,37 @@ LeftBracket::analysis(std::shared_ptr content) const { return std::make_tuple(token_inst, nullptr); } -QString RightBracket::reviseWords() const { return "}"; } +QString RBracket::reviseWords() const { return "}"; } -int RightBracket::typeMark() const +int RBracket::typeMark() const { return 0x02000000; } -QString RightBracket::regex() const { return "}"; } +QString RBracket::regex() const { return "}"; } -QString ReferMark::reviseWords() const { return "@"; } +QString ReferMk::reviseWords() const { return "@"; } -int ReferMark::typeMark() const +int ReferMk::typeMark() const { return 0x03000000; } -QString ReferMark::regex() const { return "@"; } +QString ReferMk::regex() const { return "@"; } -Keywords::Keywords(const QString& val, uint type_code) : means_store(val), type_code(type_code) {} +_keywords::_keywords(const QString& val, uint type_code) : means_store(val), type_code(type_code) {} -QString Keywords::reviseWords() const { return means_store; } +QString _keywords::reviseWords() const { return means_store; } -int Keywords::typeMark() const +int _keywords::typeMark() const { return 0x06000000 | (0x00ffffff & type_code); } -QString Keywords::regex() const { return means_store; } +QString _keywords::regex() const { return means_store; } std::tuple, std::shared_ptr> -Keywords::analysis(std::shared_ptr content) const { +_keywords::analysis(std::shared_ptr content) const { if (content->content() != regex()) { return std::make_tuple(nullptr, content); } @@ -95,17 +95,17 @@ Numbers::analysis(std::shared_ptr content) const { return std::make_tuple(tinst, nullptr); } -QString VTextSection::reviseWords() const { return "文本"; } +QString NormalText::reviseWords() const { return "文本"; } -int VTextSection::typeMark() const +int NormalText::typeMark() const { return 0x09000000; } -QString VTextSection::regex() const { return "^([^\\{\\}@&]+)"; } +QString NormalText::regex() const { return "^([^\\{\\}@&]+)"; } std::tuple, std::shared_ptr> -VTextSection::analysis(std::shared_ptr content) const { +NormalText::analysis(std::shared_ptr content) const { auto text = content->content(); QRegExp regx(regex()); if (regx.indexIn(text) == -1) { @@ -125,14 +125,14 @@ VTextSection::analysis(std::shared_ptr content) const { return std::make_tuple(tinst, nullptr); } -QString Split::reviseWords() const { return "&"; } +QString SplitMk::reviseWords() const { return "&"; } -int Split::typeMark() const +int SplitMk::typeMark() const { return 0x05000000; } -QString Split::regex() const { return "&"; } +QString SplitMk::regex() const { return "&"; } QString NameSection::reviseWords() const { return "名称"; } @@ -198,3 +198,15 @@ DeclareSymbo::analysis(std::shared_ptr content) const } return std::make_tuple(tinst, nullptr); } + +inline example_novel::RankWord::RankWord() : _keywords("排序", 0xAEu) { } + +inline example_novel::StoryWord::StoryWord() : _keywords("故事", 0xAAu) { } + +inline example_novel::SliceWord::SliceWord() : _keywords("剧情", 0xAFu) { } + +inline example_novel::PointWord::PointWord() : _keywords("节点", 0xABu) { } + +inline example_novel::VolumeWord::VolumeWord() : _keywords("分卷", 0xACu) { } + +inline example_novel::ArticleWord::ArticleWord() : _keywords("章节", 0xADu) { } diff --git a/libSyntax/tokens_novel.h b/libSyntax/tokens_novel.h index 742eb94..9ff75c5 100644 --- a/libSyntax/tokens_novel.h +++ b/libSyntax/tokens_novel.h @@ -7,7 +7,7 @@ namespace example_novel { - class LIBSYNTAX_EXPORT LeftBracket : public lib_token::ITokenProcess, public std::enable_shared_from_this { + class LIBSYNTAX_EXPORT LBracket : public lib_token::ITokenProcess, public std::enable_shared_from_this { // TokenDefine interface public: virtual QString reviseWords() const override; @@ -17,34 +17,34 @@ namespace example_novel { analysis(std::shared_ptr content) const override; }; - class LIBSYNTAX_EXPORT RightBracket : public LeftBracket { + class LIBSYNTAX_EXPORT RBracket : public LBracket { public: virtual QString reviseWords() const override; virtual int typeMark() const override; virtual QString regex() const override; }; - class LIBSYNTAX_EXPORT ReferMark : public LeftBracket { + class LIBSYNTAX_EXPORT ReferMk : public LBracket { public: virtual QString reviseWords() const override; virtual int typeMark() const override; virtual QString regex() const override; }; - class LIBSYNTAX_EXPORT Split : public LeftBracket { + class LIBSYNTAX_EXPORT SplitMk : public LBracket { public: virtual QString reviseWords() const override; virtual int typeMark() const override; virtual QString regex() const override; }; - class LIBSYNTAX_EXPORT Keywords : public lib_token::ITokenProcess, public std::enable_shared_from_this { + class LIBSYNTAX_EXPORT _keywords : public lib_token::ITokenProcess, public std::enable_shared_from_this<_keywords> { private: QString means_store; int type_code; public: - Keywords(const QString& val, uint type_code); + _keywords(const QString& val, uint type_code); // TokenDefine interface public: @@ -55,6 +55,32 @@ namespace example_novel { analysis(std::shared_ptr content) const override; }; + class LIBSYNTAX_EXPORT RankWord : public _keywords { + public: + RankWord(); + }; + class LIBSYNTAX_EXPORT StoryWord : public _keywords { + public: + StoryWord(); + }; + class LIBSYNTAX_EXPORT SliceWord : public _keywords { + public: + SliceWord(); + }; + class LIBSYNTAX_EXPORT PointWord : public _keywords { + public: + PointWord(); + }; + class LIBSYNTAX_EXPORT VolumeWord : public _keywords { + public: + VolumeWord(); + }; + class LIBSYNTAX_EXPORT ArticleWord : public _keywords { + public: + ArticleWord(); + }; + + class LIBSYNTAX_EXPORT Numbers : public lib_token::ITokenProcess, public std::enable_shared_from_this { // TokenDefine interface public: @@ -76,7 +102,7 @@ namespace example_novel { analysis(std::shared_ptr content) const override; }; - class LIBSYNTAX_EXPORT VTextSection : public lib_token::ITokenProcess, public std::enable_shared_from_this { + class LIBSYNTAX_EXPORT NormalText : public lib_token::ITokenProcess, public std::enable_shared_from_this { // TokenDefine interface public: virtual QString reviseWords() const override;