From 65fa0a8ede3417816fae84d08344be4a881f2059 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=89=E5=AE=87=E6=B8=85=E9=9F=B3?= <2422523675@qq.com> Date: Mon, 7 Nov 2022 13:12:31 +0800 Subject: [PATCH] =?UTF-8?q?=E7=89=87=E6=AE=B5=E6=B3=A8=E8=A7=A3=E8=A7=A3?= =?UTF-8?q?=E6=9E=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DesParser/StoryUnitDocumentParser.cpp | 87 ++++++++++++++++++++++++++- DesParser/StoryUnitDocumentParser.h | 15 ++++- 2 files changed, 97 insertions(+), 5 deletions(-) diff --git a/DesParser/StoryUnitDocumentParser.cpp b/DesParser/StoryUnitDocumentParser.cpp index 61c1a3f..bdeedd2 100644 --- a/DesParser/StoryUnitDocumentParser.cpp +++ b/DesParser/StoryUnitDocumentParser.cpp @@ -183,7 +183,7 @@ bool NodeStoryFragmentComment::check(QList& reasons) const QString NodeStoryFragmentComment::toString() const { - auto xrets = QString(depth(), ' ') + "#注解 " + name() + "{"; + auto xrets = QString(depth(), ' ') + "#注解 " + name() +" "+ order() +" "+ orderValue() + "{"; for (auto it : children_nodes) xrets += "\n" + QString(depth(), ' ') + it->toString(); xrets += "\n" + QString(depth(), ' ') + "}"; @@ -193,7 +193,17 @@ QString NodeStoryFragmentComment::toString() const QString NodeStoryFragmentComment::name() const { - return name_store; + return name_store; +} + +QString NodeStoryFragmentComment::orderValue() const +{ + return order_value; +} + +void NodeStoryFragmentComment::resetValue(const QString &value) +{ + this->order_value = value; } NodeStoryUnitParser::NodeStoryUnitParser(ProjectCore * core) @@ -308,7 +318,7 @@ NodeStoryFragmentParser::NodeStoryFragmentParser(NodeStoryUnitParser * pparser) rule->addExpression("基础跳出情节解析", { Elm("{右界限}", true) }); rule->addExpression("拓展跳出情节解析", { Exp("::换行前缀"),Exp("基础跳出情节解析", true) }); - addChild(QList() << new NodeStoryDesGroupParser(this)); + addChild(QList() << new NodeStoryDesGroupParser(this) << new NodeStoryFragmentCommentParser(this)); } NodeStoryUnitParser * NodeStoryFragmentParser::nodeStoryUnitParser() const @@ -398,3 +408,74 @@ NodeStoryPointReferParser::NodeStoryPointReferParser(XSyntaxBase *parent) rule->addExpression("基础引用定义", { Elm("{节点引用}"),Elm("{描述文本}1"), Elm("{描述文本}2"), Elm("{右界限}", true) }); rule->addExpression("拓展引用定义", {Exp("::换行前缀"), Exp("基础引用定义",true)}); } + +/** + * 故事情节有序注释,单独解析 + * #注解 注解名 序列名 值 { + * 注解段落 + * 注解段落 + * } + */ +NodeStoryFragmentCommentParser::NodeStoryFragmentCommentParser(Syntax::SyntaxParser *pparser) + : Syntax::XSyntaxBase("有序注解", MatchType::Entirely), pparser(pparser) +{ + set_common_expression("::换行前缀", {Elm("{换行符}"),Elm("{换行符}", true)}); + auto rule = this->addRule("进入注解", 0, [this](const QList &seqs, int cnt)->ParseResult{ + auto nmidx = cnt - 3; + auto oridx = cnt - 2; + auto vidx = cnt - 1; + + auto pnode = this->pparser->currNode(); + auto comment = new NodeStoryFragmentComment(pnode, seqs[oridx].Text, seqs[nmidx].Text); + comment->resetValue(seqs[vidx].Text); + pnode->appendChild(comment); + refocusNode(comment); + + auto word0 = new Words(comment, docRef(), seqs[cnt-4].Text, seqs[cnt-4].StartRow, seqs[cnt-4].StartCol); + auto word1 = new Words(comment, docRef(), seqs[nmidx].Text, seqs[nmidx].StartRow, seqs[nmidx].StartCol); + auto word2 = new Words(comment, docRef(), seqs[oridx].Text, seqs[oridx].StartRow, seqs[oridx].StartCol); + auto word3 = new Words(comment, docRef(), seqs[vidx].Text, seqs[vidx].StartRow, seqs[vidx].StartCol); + + docRef()->append(word0); + docRef()->append(word1); + docRef()->append(word2); + docRef()->append(word3); + + return ParseResult::SelfManipulate; + }); + rule->addExpression("基础注解定义", {Elm("{注解定义}"), Elm{"{描述文本}1"}, Elm{"{描述文本}2"}, Elm{"{描述文本}3", true}}); + rule->addExpression("拓展注解定义", {Exp("::换行前缀"), Exp("基础注解定义", true)}); + + + rule = addRule("进入成分解析", 1, [this](const QList &seqs, int cnt)->ParseResult { + auto node = currNode(); + + auto word = new Words(node, docRef(), seqs[cnt - 1].Text, seqs[cnt - 1].StartRow, seqs[cnt - 1].StartCol); + docRef()->append(word); + + return ParseResult::EnterNext; + }); + rule->addExpression("成分解析", { Elm("{左界限}", true) }); + rule->addExpression("拓展成分解析", { Exp("::换行前缀"), Exp("成分解析", true) }); + + rule = addRule("跳出成分解析", 2, [this](const QList &seqs, int cnt)->ParseResult { + auto node = currNode(); + + auto word = new Words(node, docRef(), seqs[cnt - 1].Text, seqs[cnt - 1].StartRow, seqs[cnt - 1].StartCol); + docRef()->append(word); + + return ParseResult::Completed; + }); + rule->addExpression("基础跳出成分解析", { Elm("{右界限}", true) }); + rule->addExpression("拓展跳出成分解析", { Exp("::换行前缀"),Exp("基础跳出成分解析", true) }); + + addChild(QList() << new NodeStoryDesGroupParser(this)); +} + + + + + + + + diff --git a/DesParser/StoryUnitDocumentParser.h b/DesParser/StoryUnitDocumentParser.h index 9380892..f838a14 100644 --- a/DesParser/StoryUnitDocumentParser.h +++ b/DesParser/StoryUnitDocumentParser.h @@ -135,8 +135,6 @@ namespace Parse { Syntax::XSyntaxBase *const parent_parser; }; - - class NodeStoryPointReferParser : public Syntax::XSyntaxBase { public: @@ -174,14 +172,27 @@ namespace Parse { virtual bool check(QList& reasons) const override; virtual QString toString() const override; virtual QString name() const override; + + QString orderValue() const; + void resetValue(const QString &value); + private: DesNode *const parent_ins; QString name_store; QString order_name; + QString order_value; QList children_nodes; }; + class NodeStoryFragmentCommentParser : public Syntax::XSyntaxBase + { + public: + NodeStoryFragmentCommentParser(Syntax::SyntaxParser* pparser); + private: + Syntax::SyntaxParser *const pparser; + }; + class StoryUnitDocumentParser : public Syntax::ParseFrame {