This commit is contained in:
codeboss 2025-02-12 13:44:35 +08:00
parent ea2db22b37
commit 351c061479
2 changed files with 42 additions and 98 deletions

View File

@ -272,12 +272,12 @@ namespace lib_syntax {
/**
* @brief .
*/
template<class ExprType, int mark>
requires std::derived_from<ExprType, ast_basic::IExprInstance>
template<class ExprType, int mark, typename R>
requires std::derived_from<ExprType, ast_basic::IExprInstance>&& std::derived_from<R, lib_syntax::IBasicRule>
class ElementRule : public ExprRule {
public:
ElementRule(const QString& rule_name, std::shared_ptr<const IBasicRule> children)
:ExprRule(rule_name, mark), _children_store(children) { }
ElementRule(const QString& rule_name)
:ExprRule(rule_name, mark), _children_store(std::make_shared<R>()) { }
virtual QList<std::shared_ptr<const IBasicRule>> children() const {
return QList<std::shared_ptr<const IBasicRule>>() << this->_children_store;

View File

@ -6,43 +6,10 @@ using namespace lib_syntax;
using namespace example_novel;
using namespace lib_token;
using namespace ast_basic;
// token-avaliable ==========================================================================
auto leftb = std::make_shared<LBracket>(); // {
auto rightb = std::make_shared<RBracket>(); // }
auto refers = std::make_shared<ReferMk>(); // @
auto declare = std::make_shared<DeclareSymbo>(); // #
auto split_mark = std::make_shared<SplitMk>(); // &
auto rank_key = std::make_shared<RankWord>(); // 排序
auto story_key = std::make_shared<StoryWord>(); // 故事
auto numbers = std::make_shared<Numbers>(); // [0-9]+
auto slice_key = std::make_shared<SliceWord>(); // 剧情
auto point_key = std::make_shared<PointWord>(); // 节点
auto volume_key = std::make_shared<VolumeWord>(); // 分卷
auto article_key = std::make_shared<ArticleWord>(); // 章节
auto vtext = std::make_shared<NormalText>(); // ^([^\\{\\}@&]+)
auto name_text = std::make_shared<NameSection>(); // ^([^\\{\\}@&]+)
using namespace std;
// rule-parts ===============================================================================
#include "syntax_templets.h"
// MakeRule
#define MK(type) std::make_shared<const type>()
// MatchRule
#define MER(E, XProc, t) std::make_shared<const TokenMatch<E, XProc>>(t)
#define MR(E, t) MER(E, lib_composit::apntk<E>, t)
// Buffer
#define Rules QList<std::shared_ptr<const IBasicRule>>
// Option
#define OptMulT(token) std::make_shared<const Rept>(MR(token), 0, INT_MAX)
#define OptMulR(rule) std::make_shared<const Rept>(rule, 0, INT_MAX)
// multi+
#define MultiR(rule) std::make_shared<const Rept>(rule, 1, INT_MAX)
// opt?
#define OptR(rule) std::make_shared<const Rept>(rule, 0, 1)
using namespace lib_composit;
void point_nmset(std::shared_ptr<PointDefines> inst, std::shared_ptr<const lib_token::IToken> token) {
@ -83,10 +50,9 @@ void rank_set(std::shared_ptr<RankDeclare> inst, std::shared_ptr<const lib_token
}
using TextDeclsSyntaxDef = lib_composit::Multi<AnyR<TokenRn<TextSection, Numbers>, TokenRn<TextSection, NormalText>, TokenRn<TextSection, ReferMk>, TokenRn<TextSection, SplitMk>>>;
class DeclExpr : public ElementRule<TextSection, (int) NovelNode::TextSection> {
class DeclSyntax : public ElementRule<TextSection, (int) NovelNode::TextSection, TextDeclsSyntaxDef> {
public:
DeclExpr() : ElementRule<TextSection, (int) NovelNode::TextSection>(
"decl_section", std::make_shared<TextDeclsSyntaxDef>()) { }
DeclSyntax() : ElementRule<TextSection, (int) NovelNode::TextSection, TextDeclsSyntaxDef>("decl_section") { }
// 通过 ElementRule 继承
QList<std::shared_ptr<const MatchCursor>> expr_rule_parse(std::shared_ptr<const MatchCursor> cursor) const override {
@ -95,14 +61,13 @@ public:
};
using PointSyntaxDef = lib_composit::SeqsR<
TokenRn<PointDefines, LBracket>, TokenRn<PointDefines, PointWord>, TokenR<PointDefines, NameSection, point_nmset>,
Opt<DeclExpr>,
using PointSyntaxDef = lib_composit::SeqsR<TokenRn<PointDefines, LBracket>, TokenRn<PointDefines, PointWord>, TokenR<PointDefines, NameSection, point_nmset>,
Opt<DeclSyntax>,
TokenRn<PointDefines, RBracket>>;
class PointSyntax : public ElementRule<PointDefines, (int) NovelNode::PointDefines> {
class PointSyntax : public ElementRule<PointDefines, (int) NovelNode::PointDefines, PointSyntaxDef> {
public:
PointSyntax() : ElementRule<PointDefines, (int) NovelNode::PointDefines>(
"point_define", std::make_shared<PointSyntaxDef>()) { }
PointSyntax() : ElementRule<PointDefines, (int) NovelNode::PointDefines, PointSyntaxDef>("point_define") { }
// 通过 ElementRule 继承
QList<std::shared_ptr<const MatchCursor>> expr_rule_parse(std::shared_ptr<const MatchCursor> cursor) const override {
@ -111,14 +76,13 @@ public:
};
using ReferSyntaxDef = lib_composit::SeqsR<
TokenRn<PointRefers, LBracket>, TokenRn<PointRefers, ReferMk>, TokenRn<PointRefers, PointWord>, TokenR<PointRefers, NameSection, ref_story_set>, TokenRn<PointRefers, ReferMk>, TokenR<PointRefers, NameSection, ref_slice_set>, TokenRn<PointRefers, ReferMk>, TokenR<PointRefers, NameSection, ref_point_set>,
Opt<DeclExpr>,
using ReferSyntaxDef = lib_composit::SeqsR<TokenRn<PointRefers, LBracket>, TokenRn<PointRefers, ReferMk>, TokenRn<PointRefers, PointWord>, TokenR<PointRefers, NameSection, ref_story_set>, TokenRn<PointRefers, ReferMk>, TokenR<PointRefers, NameSection, ref_slice_set>, TokenRn<PointRefers, ReferMk>, TokenR<PointRefers, NameSection, ref_point_set>,
Opt<DeclSyntax>,
TokenRn<PointDefines, RBracket>>;
class ReferSyntax : public ElementRule<PointRefers, (int) NovelNode::PointRefers> {
class ReferSyntax : public ElementRule<PointRefers, (int) NovelNode::PointRefers, ReferSyntaxDef> {
public:
ReferSyntax() : ElementRule < PointRefers, (int) NovelNode::PointRefers>(
"point_refer", std::make_shared<ReferSyntaxDef>()) { }
ReferSyntax() : ElementRule < PointRefers, (int) NovelNode::PointRefers, ReferSyntaxDef>("point_refer") { }
// 通过 ElementRule 继承
QList<std::shared_ptr<const MatchCursor>> expr_rule_parse(std::shared_ptr<const MatchCursor> cursor) const override {
@ -127,14 +91,13 @@ public:
};
using SliceSyntaxDef = lib_composit::SeqsR<
TokenRn<FragmentSlice, LBracket>, TokenRn<FragmentSlice, SliceWord>, TokenR<FragmentSlice, NameSection, slice_nm_set>,
lib_composit::OptMulti<AnyR<PointSyntax, ReferSyntax, DeclExpr>>,
using SliceSyntaxDef = lib_composit::SeqsR<TokenRn<FragmentSlice, LBracket>, TokenRn<FragmentSlice, SliceWord>, TokenR<FragmentSlice, NameSection, slice_nm_set>,
lib_composit::OptMulti<AnyR<PointSyntax, ReferSyntax, DeclSyntax>>,
TokenRn<FragmentSlice, RBracket>>;
class SliceSyntax : public ElementRule<FragmentSlice, (int) NovelNode::FragmentSlice> {
class SliceSyntax : public ElementRule<FragmentSlice, (int) NovelNode::FragmentSlice, SliceSyntaxDef> {
public:
SliceSyntax() : ElementRule<FragmentSlice, (int) NovelNode::FragmentSlice>(
"slice_define", std::make_shared<SliceSyntaxDef>()) { }
SliceSyntax() : ElementRule<FragmentSlice, (int) NovelNode::FragmentSlice, SliceSyntaxDef>("slice_define") { }
// 通过 ElementRule 继承
QList<std::shared_ptr<const MatchCursor>> expr_rule_parse(std::shared_ptr<const MatchCursor> cursor) const override {
@ -143,14 +106,13 @@ public:
};
using StorySyntaxDef = lib_composit::SeqsR<
TokenRn<StoryDefine, LBracket>, TokenRn<StoryDefine, StoryWord>, TokenR<StoryDefine, NameSection, story_nmset>,
lib_composit::OptMulti<AnyR<SliceSyntax, DeclExpr>>,
using StorySyntaxDef = lib_composit::SeqsR<TokenRn<StoryDefine, LBracket>, TokenRn<StoryDefine, StoryWord>, TokenR<StoryDefine, NameSection, story_nmset>,
lib_composit::OptMulti<AnyR<SliceSyntax, DeclSyntax>>,
TokenRn<StoryDefine, RBracket>>;
class StorySyntax : public ElementRule<StoryDefine, (int) NovelNode::StoryDefine> {
class StorySyntax : public ElementRule<StoryDefine, (int) NovelNode::StoryDefine, StorySyntaxDef> {
public:
StorySyntax() : ElementRule<StoryDefine, (int) NovelNode::StoryDefine>(
"story_define", std::make_shared<StorySyntaxDef>()) { }
StorySyntax() : ElementRule<StoryDefine, (int) NovelNode::StoryDefine, StorySyntaxDef>("story_define") { }
// 通过 ElementRule 继承
QList<std::shared_ptr<const MatchCursor>> expr_rule_parse(std::shared_ptr<const MatchCursor> cursor) const override {
@ -160,14 +122,12 @@ public:
using ArticleSyntaxDef = lib_composit::SeqsR<
TokenRn<ArticleDefine, LBracket>, TokenRn<ArticleDefine, ArticleWord>, TokenR<ArticleDefine, NameSection, article_nset>,
lib_composit::OptMulti<AnyR<ReferSyntax, DeclExpr>>,
using ArticleSyntaxDef = lib_composit::SeqsR<TokenRn<ArticleDefine, LBracket>, TokenRn<ArticleDefine, ArticleWord>, TokenR<ArticleDefine, NameSection, article_nset>,
lib_composit::OptMulti<AnyR<ReferSyntax, DeclSyntax>>,
TokenRn<ArticleDefine, RBracket>>;
class ArticleSyntax : public ElementRule<ArticleDefine, (int) NovelNode::ArticleDefine> {
class ArticleSyntax : public ElementRule<ArticleDefine, (int) NovelNode::ArticleDefine, ArticleSyntaxDef> {
public:
ArticleSyntax() : ElementRule<ArticleDefine, (int) NovelNode::ArticleDefine>(
"article_define", std::make_shared<ArticleSyntaxDef>()) { }
ArticleSyntax() : ElementRule<ArticleDefine, (int) NovelNode::ArticleDefine, ArticleSyntaxDef>("article_define") { }
// 通过 ElementRule 继承
QList<std::shared_ptr<const MatchCursor>> expr_rule_parse(std::shared_ptr<const MatchCursor> cursor) const override {
@ -176,14 +136,13 @@ public:
};
using VolumeSyntaxDef = lib_composit::SeqsR<
TokenRn<VolumeDefine, LBracket>, TokenRn<VolumeDefine, VolumeWord>, TokenR<VolumeDefine, NameSection, volume_nset>,
lib_composit::OptMulti<AnyR<ArticleSyntax, DeclExpr>>,
using VolumeSyntaxDef = lib_composit::SeqsR<TokenRn<VolumeDefine, LBracket>, TokenRn<VolumeDefine, VolumeWord>, TokenR<VolumeDefine, NameSection, volume_nset>,
lib_composit::OptMulti<AnyR<ArticleSyntax, DeclSyntax>>,
TokenRn<VolumeDefine, RBracket>>;
class VolumeSyntax : public ElementRule<VolumeDefine, (int) NovelNode::VolumeDefine> {
class VolumeSyntax : public ElementRule<VolumeDefine, (int) NovelNode::VolumeDefine, VolumeSyntaxDef> {
public:
VolumeSyntax() : ElementRule<VolumeDefine, (int) NovelNode::VolumeDefine>(
"volume_define", std::make_shared<VolumeSyntaxDef>()) { }
VolumeSyntax() : ElementRule<VolumeDefine, (int) NovelNode::VolumeDefine, VolumeSyntaxDef>("volume_define") { }
// 通过 ElementRule 继承
QList<std::shared_ptr<const MatchCursor>> expr_rule_parse(std::shared_ptr<const MatchCursor> cursor) const override {
@ -193,12 +152,10 @@ public:
using RankSyntaxDef = lib_composit::SeqsR<
TokenRn<RankDeclare, DeclareSymbo>, TokenRn<RankDeclare, RankWord>, TokenR<RankDeclare, Numbers, rank_set>>;
class RankSyntax : public ElementRule<RankDeclare, (int) NovelNode::RankDeclaration> {
using RankSyntaxDef = lib_composit::SeqsR<TokenRn<RankDeclare, DeclareSymbo>, TokenRn<RankDeclare, RankWord>, TokenR<RankDeclare, Numbers, rank_set>>;
class RankSyntax : public ElementRule<RankDeclare, (int) NovelNode::RankDeclaration, RankSyntaxDef> {
public:
RankSyntax() : ElementRule<RankDeclare, (int) NovelNode::RankDeclaration>(
"rank_define", std::make_shared<RankSyntaxDef>()) { }
RankSyntax() : ElementRule<RankDeclare, (int) NovelNode::RankDeclaration, RankSyntaxDef>("rank_define") { }
// 通过 ElementRule 继承
QList<std::shared_ptr<const MatchCursor>> expr_rule_parse(std::shared_ptr<const MatchCursor> cursor) const override {
@ -208,11 +165,10 @@ public:
using DocSyntaxDef = lib_composit::SeqsR<Opt<RankSyntaxDef>, lib_composit::OptMulti<AnyR<StorySyntax, VolumeSyntax>>>;
class DocumentSyntax : public ElementRule<Document, (int) NovelNode::Document> {
using DocSyntaxDef = lib_composit::SeqsR<Opt<RankSyntax>, lib_composit::OptMulti<AnyR<StorySyntax, VolumeSyntax>>>;
class DocumentSyntax : public ElementRule<Document, (int) NovelNode::Document, DocSyntaxDef> {
public:
DocumentSyntax() : ElementRule<Document, (int) NovelNode::Document>(
"decls-doc", std::make_shared<DocSyntaxDef>()) { }
DocumentSyntax() : ElementRule<Document, (int) NovelNode::Document, DocSyntaxDef>("decls-doc") { }
// 通过 ElementRule 继承
QList<std::shared_ptr<const MatchCursor>> expr_rule_parse(std::shared_ptr<const MatchCursor> cursor) const override {
@ -262,15 +218,3 @@ public:
// node_register(child, next_child_items);
// }
//}
#include "syntax_templets.h"
void rules() {
AnyR<TokenRn<TextSection, Numbers>, TokenRn<TextSection, NormalText>, TokenRn<TextSection, ReferMk>, TokenRn<TextSection, SplitMk>> mmm;
ReptR<decltype(mmm), 1, INT_MAX> decl;
}