From 8404719d260fb5205244b9cef9218e3dd2dc0db6 Mon Sep 17 00:00:00 2001
From: codeboss <2422523675@qq.com>
Date: Tue, 18 Jun 2024 12:44:18 +0800
Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0cache=E6=9C=BA=E5=88=B6?=
=?UTF-8?q?=EF=BC=8C=E9=99=8D=E4=BD=8E=E5=90=8E=E7=BB=AD=E6=89=A7=E8=A1=8C?=
=?UTF-8?q?=E6=97=B6=E9=97=B4?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
WsNovelParser/WsNovelParser.vcxproj.user | 4 +-
libParse/libParse.vcxproj.user | 4 +-
libSyntax/ast_gen.cpp | 8 +-
libSyntax/ast_gen.h | 4 +-
libSyntax/ast_novel.cpp | 60 +++++--
libSyntax/ast_novel.h | 214 +++++++++++++----------
libSyntax/libSyntax.vcxproj.user | 4 +-
libSyntax/syntax_novel.cpp | 29 ++-
libSyntax/syntax_novel.h | 6 +-
libToken/libToken.vcxproj.user | 4 +-
10 files changed, 214 insertions(+), 123 deletions(-)
diff --git a/WsNovelParser/WsNovelParser.vcxproj.user b/WsNovelParser/WsNovelParser.vcxproj.user
index ee9b9b7..f1d0210 100644
--- a/WsNovelParser/WsNovelParser.vcxproj.user
+++ b/WsNovelParser/WsNovelParser.vcxproj.user
@@ -6,12 +6,12 @@
--path "D:\手作小说\科学+修仙+创造世界"
- 2024-06-15T14:08:20.0960465Z
+ 2024-06-18T03:59:54.5896562Z
- 2024-06-15T14:08:20.2054213Z
+ 2024-06-18T03:59:54.6990325Z
diff --git a/libParse/libParse.vcxproj.user b/libParse/libParse.vcxproj.user
index 4fc3d97..a0a6cec 100644
--- a/libParse/libParse.vcxproj.user
+++ b/libParse/libParse.vcxproj.user
@@ -5,12 +5,12 @@
WindowsLocalDebugger
- 2024-06-15T14:08:20.4574393Z
+ 2024-06-18T03:59:54.8553531Z
- 2024-06-15T14:08:20.5199406Z
+ 2024-06-18T03:59:54.9178555Z
diff --git a/libSyntax/ast_gen.cpp b/libSyntax/ast_gen.cpp
index 66e82db..e406c07 100644
--- a/libSyntax/ast_gen.cpp
+++ b/libSyntax/ast_gen.cpp
@@ -13,8 +13,8 @@ void GlobalElement::clearCache() { node_cache.clear(); }
void GlobalElement::appendToCache(std::shared_ptr named_node) {
auto mixed_key = QString(u8"%1<%2>").arg(named_node->signature()).arg(named_node->typeMark());
if (node_cache.contains(mixed_key))
- throw new lib_syntax::SyntaxException(
- QString(u8"Parse[0x0004]ϵͳаͬڵ㣺%1").arg(named_node->signature()).arg(named_node->typeMark()));
+ throw new lib_syntax::SyntaxException(QString(u8"Parse[0x0004]ϵͳаͬڵ㣺%1")
+ .arg(named_node->signature()).arg(named_node->typeMark()));
node_cache[mixed_key] = named_node;
}
@@ -44,6 +44,10 @@ std::shared_ptr ast_gen::GlobalElement::bindExpress
return bind_exprs;
}
+void ast_gen::GlobalElement::cacheLoad()
+{
+}
+
void GlobalElement::addChild(std::shared_ptr citem) {
auto convx = std::dynamic_pointer_cast(citem);
bind_exprs->addChild(convx);
diff --git a/libSyntax/ast_gen.h b/libSyntax/ast_gen.h
index 933707d..7bf8bf6 100644
--- a/libSyntax/ast_gen.h
+++ b/libSyntax/ast_gen.h
@@ -60,6 +60,7 @@ namespace ast_gen
* @return
*/
virtual QList> selfTokens() const = 0;
+ virtual void cacheLoad() = 0;
};
/**
@@ -131,6 +132,7 @@ namespace ast_gen
virtual QList> selfTokens() const override;
// ͨ SyntaxElement ̳
- std::shared_ptr bindExpression() const override;
+ virtual std::shared_ptr bindExpression() const override;
+ virtual void cacheLoad() override;
};
}
\ No newline at end of file
diff --git a/libSyntax/ast_novel.cpp b/libSyntax/ast_novel.cpp
index 6b3dd2a..50fa144 100644
--- a/libSyntax/ast_novel.cpp
+++ b/libSyntax/ast_novel.cpp
@@ -8,11 +8,7 @@ TextSection::TextSection(std::shared_ptr rule_
QString example_novel::TextSection::content() const
{
- QString text;
- for (auto& t : selfTokens()) {
- text += t->token()->content() + " ";
- }
- return text;
+ return context_store;
}
int TextSection::typeMark() const { return (int)NovelNode::TextSection; }
@@ -24,13 +20,27 @@ bool example_novel::TextSection::isAnonymous() const
QString TextSection::signature() const { return u8"::section"; }
+void example_novel::TextSection::cacheLoad()
+{
+ QString text;
+ for (auto& t : selfTokens()) {
+ text += t->token()->content() + " ";
+ }
+ context_store = text;
+}
+
FragmentRefers::FragmentRefers(std::shared_ptr rule_bind)
: AbstractImpl(rule_bind) {}
-QString FragmentRefers::storyRefer() const { return selfTokens()[5]->token()->content(); }
+QString FragmentRefers::storyRefer() const { return story_refs; }
-QString FragmentRefers::fragmentRefer() const { return selfTokens()[3]->token()->content(); }
+QString FragmentRefers::fragmentRefer() const { return fragment_ref; }
+void example_novel::FragmentRefers::cacheLoad()
+{
+ this->story_refs = selfTokens()[5]->token()->content();
+ this->fragment_ref = selfTokens()[3]->token()->content();
+}
QString FragmentRefers::referSignature() const {
return storyRefer() + u8"&" + fragmentRefer();
}
@@ -47,11 +57,16 @@ QString FragmentRefers::signature() const {
return parent()->signature() + signature;
}
+
FragmentDefine::FragmentDefine(std::shared_ptr rule_bind)
: AbstractImpl(rule_bind) {}
-QString FragmentDefine::name() const { return selfTokens()[2]->token()->content(); }
+QString FragmentDefine::name() const { return name_store; }
+void example_novel::FragmentDefine::cacheLoad()
+{
+ name_store = selfTokens()[2]->token()->content();
+}
int FragmentDefine::typeMark() const { return (int)NovelNode::FragmentDefine; }
bool example_novel::FragmentDefine::isAnonymous() const
@@ -61,12 +76,19 @@ bool example_novel::FragmentDefine::isAnonymous() const
QString FragmentDefine::signature() const { return parent()->signature() + u8"&" + name(); }
+
StoryDefine::StoryDefine(std::shared_ptr rule_bind)
: AbstractImpl(rule_bind) {}
-QString StoryDefine::name() const { return selfTokens()[3]->token()->content(); }
+QString StoryDefine::name() const { return name_store; }
-int StoryDefine::sort() const { return selfTokens()[2]->token()->content().toInt(); }
+int StoryDefine::sort() const { return sort_index; }
+
+void example_novel::StoryDefine::cacheLoad()
+{
+ name_store = selfTokens()[3]->token()->content();
+ sort_index = selfTokens()[2]->token()->content().toInt();
+}
int StoryDefine::typeMark() const { return (int)NovelNode::StoryDefine; }
@@ -90,6 +112,10 @@ bool example_novel::Document::isAnonymous() const
QString Document::signature() const { return QString(u8"::document<%1>").arg(path()); }
+void example_novel::Document::cacheLoad()
+{
+}
+
example_novel::AbstractImpl::AbstractImpl(std::shared_ptr rule_bind)
: ExpressionElement(rule_bind) {}
@@ -127,7 +153,12 @@ QString example_novel::AbstractImpl::path() const
VolumeDefine::VolumeDefine(std::shared_ptr rule_bind)
: AbstractImpl(rule_bind) {}
-QString VolumeDefine::name() const { return selfTokens()[2]->token()->content(); }
+QString VolumeDefine::name() const { return name_store; }
+
+void example_novel::VolumeDefine::cacheLoad()
+{
+ name_store = selfTokens()[2]->token()->content();
+}
int VolumeDefine::typeMark() const { return (int)NovelNode::VolumeDefine; }
@@ -141,7 +172,12 @@ QString VolumeDefine::signature() const { return name(); }
ArticleDefine::ArticleDefine(std::shared_ptr rule_bind)
: AbstractImpl(rule_bind) {}
-QString ArticleDefine::name() const { return selfTokens()[2]->token()->content(); }
+QString ArticleDefine::name() const { return name_store; }
+
+void example_novel::ArticleDefine::cacheLoad()
+{
+ name_store = selfTokens()[2]->token()->content();
+}
int ArticleDefine::typeMark() const { return (int)NovelNode::ArticleDefine; }
diff --git a/libSyntax/ast_novel.h b/libSyntax/ast_novel.h
index 201085d..411a59e 100644
--- a/libSyntax/ast_novel.h
+++ b/libSyntax/ast_novel.h
@@ -4,122 +4,148 @@
namespace example_novel
{
- enum class NovelNode {
- TextSection = 1,
- FragmentRefer = 2,
- FragmentDefine = 3,
- StoryDefine = 4,
- Document = 5,
- ArticleDefine = 6,
- VolumeDefine = 7,
- };
+ enum class NovelNode {
+ TextSection = 1,
+ FragmentRefer = 2,
+ FragmentDefine = 3,
+ StoryDefine = 4,
+ Document = 5,
+ ArticleDefine = 6,
+ VolumeDefine = 7,
+ };
- class LIBSYNTAX_EXPORT AbstractImpl :
- public ast_basic::ExpressionElement, public ast_gen::SyntaxElement {
- private:
- std::shared_ptr parent_store = nullptr;
+ class LIBSYNTAX_EXPORT AbstractImpl :
+ public ast_basic::ExpressionElement, public ast_gen::SyntaxElement {
+ private:
+ std::shared_ptr parent_store = nullptr;
- public:
- explicit AbstractImpl(std::shared_ptr rule_bind);
+ public:
+ explicit AbstractImpl(std::shared_ptr rule_bind);
- // ͨ SyntaxElement ̳
- virtual std::shared_ptr bindExpression() const override;
- QString path() const override;
- virtual std::shared_ptr parent() const override;
- virtual void setParent(std::shared_ptr inst) override;
- virtual QList> selfTokens() const override;
- };
+ // ͨ SyntaxElement ̳
+ virtual std::shared_ptr bindExpression() const override;
+ QString path() const override;
+ virtual std::shared_ptr parent() const override;
+ virtual void setParent(std::shared_ptr inst) override;
+ virtual QList> selfTokens() const override;
+ };
- class LIBSYNTAX_EXPORT TextSection : public AbstractImpl {
- public:
- TextSection(std::shared_ptr rule_bind);
+ class LIBSYNTAX_EXPORT TextSection : public AbstractImpl {
+ public:
+ TextSection(std::shared_ptr rule_bind);
- QString content() const;
+ QString content() const;
- // SyntaxElement interface
- public:
- virtual int typeMark() const override;
- virtual bool isAnonymous() const override;
- virtual QString signature() const override;
- };
+ // SyntaxElement interface
+ public:
+ virtual int typeMark() const override;
+ virtual bool isAnonymous() const override;
+ virtual QString signature() const override;
+ virtual void cacheLoad() override;
- class LIBSYNTAX_EXPORT FragmentRefers : public AbstractImpl {
- public:
- FragmentRefers(std::shared_ptr rule_bind);
+ private:
+ QString context_store;
+ };
- QString storyRefer() const;
- QString fragmentRefer() const;
- QString referSignature() const;
+ class LIBSYNTAX_EXPORT FragmentRefers : public AbstractImpl {
+ public:
+ FragmentRefers(std::shared_ptr rule_bind);
- // SyntaxElement interface
- public:
- virtual int typeMark() const override;
- virtual bool isAnonymous() const override;
- virtual QString signature() const override;
- };
+ QString storyRefer() const;
+ QString fragmentRefer() const;
+ QString referSignature() const;
- class LIBSYNTAX_EXPORT FragmentDefine : public AbstractImpl {
- public:
- FragmentDefine(std::shared_ptr rule_bind);
+ // SyntaxElement interface
+ public:
+ virtual int typeMark() const override;
+ virtual bool isAnonymous() const override;
+ virtual QString signature() const override;
+ virtual void cacheLoad() override;
- QString name() const;
+ private:
+ QString story_refs, fragment_ref;
+ };
- // SyntaxElement interface
- public:
- virtual int typeMark() const override;
- virtual bool isAnonymous() const override;
- virtual QString signature() const override;
- };
+ class LIBSYNTAX_EXPORT FragmentDefine : public AbstractImpl {
+ public:
+ FragmentDefine(std::shared_ptr rule_bind);
- class LIBSYNTAX_EXPORT ArticleDefine : public AbstractImpl{
- public:
- ArticleDefine(std::shared_ptr rule_bind);
+ QString name() const;
- QString name() const;
+ // SyntaxElement interface
+ public:
+ virtual int typeMark() const override;
+ virtual bool isAnonymous() const override;
+ virtual QString signature() const override;
+ virtual void cacheLoad() override;
- // SyntaxElement interface
- public:
- virtual int typeMark() const override;
- virtual bool isAnonymous() const override;
- virtual QString signature() const override;
- };
+ private:
+ QString name_store;
+ };
- class LIBSYNTAX_EXPORT VolumeDefine : public AbstractImpl {
- public:
- VolumeDefine(std::shared_ptr rule_bind);
+ class LIBSYNTAX_EXPORT ArticleDefine : public AbstractImpl {
+ public:
+ ArticleDefine(std::shared_ptr rule_bind);
- QString name() const;
+ QString name() const;
- // SyntaxElement interface
- public:
- virtual int typeMark() const override;
- virtual bool isAnonymous() const override;
- virtual QString signature() const override;
- };
+ // SyntaxElement interface
+ public:
+ virtual int typeMark() const override;
+ virtual bool isAnonymous() const override;
+ virtual QString signature() const override;
+ virtual void cacheLoad() override;
- class LIBSYNTAX_EXPORT StoryDefine : public AbstractImpl {
- public:
- StoryDefine(std::shared_ptr rule_bind);
+ private:
+ QString name_store;
+ };
- QString name() const;
- int sort() const;
+ class LIBSYNTAX_EXPORT VolumeDefine : public AbstractImpl {
+ public:
+ VolumeDefine(std::shared_ptr rule_bind);
- // SyntaxElement interface
- public:
- virtual int typeMark() const override;
- virtual bool isAnonymous() const override;
- virtual QString signature() const override;
- };
+ QString name() const;
- class LIBSYNTAX_EXPORT Document : public AbstractImpl {
- public:
- Document(std::shared_ptr rule_bind);
+ // SyntaxElement interface
+ public:
+ virtual int typeMark() const override;
+ virtual bool isAnonymous() const override;
+ virtual QString signature() const override;
+ virtual void cacheLoad() override;
+
+ private:
+ QString name_store;
+ };
- // SyntaxElement interface
- public:
- virtual int typeMark() const override;
- virtual bool isAnonymous() const override;
- virtual QString signature() const override;
- };
+ class LIBSYNTAX_EXPORT StoryDefine : public AbstractImpl {
+ public:
+ StoryDefine(std::shared_ptr rule_bind);
+
+ QString name() const;
+ int sort() const;
+
+ // SyntaxElement interface
+ public:
+ virtual int typeMark() const override;
+ virtual bool isAnonymous() const override;
+ virtual QString signature() const override;
+ virtual void cacheLoad() override;
+
+ private:
+ QString name_store;
+ int sort_index;
+ };
+
+ class LIBSYNTAX_EXPORT Document : public AbstractImpl {
+ public:
+ Document(std::shared_ptr rule_bind);
+
+ // SyntaxElement interface
+ public:
+ virtual int typeMark() const override;
+ virtual bool isAnonymous() const override;
+ virtual QString signature() const override;
+ virtual void cacheLoad() override;
+ };
}
diff --git a/libSyntax/libSyntax.vcxproj.user b/libSyntax/libSyntax.vcxproj.user
index b797bbf..db5007c 100644
--- a/libSyntax/libSyntax.vcxproj.user
+++ b/libSyntax/libSyntax.vcxproj.user
@@ -5,12 +5,12 @@
WindowsLocalDebugger
- 2024-06-15T14:08:20.2523510Z
+ 2024-06-18T03:59:54.7302802Z
- 2024-06-15T14:08:20.3148604Z
+ 2024-06-18T03:59:54.8084783Z
diff --git a/libSyntax/syntax_novel.cpp b/libSyntax/syntax_novel.cpp
index 2c2e628..2891c95 100644
--- a/libSyntax/syntax_novel.cpp
+++ b/libSyntax/syntax_novel.cpp
@@ -104,12 +104,18 @@ auto document_define = ElementRule(u8"decls-doc", (int)NovelExprs::DOC
));
std::shared_ptr NovalSyntax::getParseTree() { return document_define; }
-std::shared_ptr example_novel::NovalSyntax::tidy(std::shared_ptr root, QList> children)
+std::shared_ptr example_novel::NovalSyntax::tidy(std::shared_ptr root, QList> children)
{
+ cache_load(root, children);
+ node_register(root, children);
+ return root;
+}
+void example_novel::NovalSyntax::cache_load(std::shared_ptr root, QList> children)
+{
+ std::const_pointer_cast(root)->cacheLoad();
+
for (auto& cinst : children) {
cinst->setParent(root);
- if (!cinst->isAnonymous())
- ast_gen::GlobalElement::UniquePtr->appendToCache(cinst);
QList> child_items;
for (auto& it : cinst->bindExpression()->children()) {
@@ -117,10 +123,23 @@ std::shared_ptr example_novel::NovalSyntax::tidy(s
child_items.append(std::const_pointer_cast(const_it));
}
- tidy(cinst, child_items);
+ cache_load(cinst, child_items);
}
+}
+void example_novel::NovalSyntax::node_register(std::shared_ptr root, QList> children)
+{
+ for (auto& child : children) {
+ if (!child->isAnonymous())
+ ast_gen::GlobalElement::UniquePtr->appendToCache(child);
- return root;
+ QList> next_child_items;
+ for (auto& it : child->bindExpression()->children()) {
+ auto const_it = std::dynamic_pointer_cast(it);
+ next_child_items.append(std::const_pointer_cast(const_it));
+ }
+
+ node_register(child, next_child_items);
+ }
}
std::shared_ptr NovalSyntax::getLexReader()
{
diff --git a/libSyntax/syntax_novel.h b/libSyntax/syntax_novel.h
index 527aeea..68c9f0d 100644
--- a/libSyntax/syntax_novel.h
+++ b/libSyntax/syntax_novel.h
@@ -38,7 +38,11 @@ namespace example_novel {
*/
static std::shared_ptr getParseTree();
- static std::shared_ptr tidy(std::shared_ptr root, QList> docs);
+ static std::shared_ptr tidy(std::shared_ptr root, QList> docs);
+
+ private:
+ static void cache_load(std::shared_ptr root, QList> docs);
+ static void node_register(std::shared_ptr root, QList> docs);
};
} // namespace example_novel
\ No newline at end of file
diff --git a/libToken/libToken.vcxproj.user b/libToken/libToken.vcxproj.user
index b7c8b6d..48b6bf1 100644
--- a/libToken/libToken.vcxproj.user
+++ b/libToken/libToken.vcxproj.user
@@ -2,12 +2,12 @@
- 2024-06-15T14:08:20.3461410Z
+ 2024-06-18T03:59:54.9646551Z
- 2024-06-15T14:08:20.4105452Z
+ 2024-06-18T03:59:55.0271675Z