片段注解解析

This commit is contained in:
玉宇清音 2022-11-07 13:12:31 +08:00
parent 53afe58730
commit 65fa0a8ede
2 changed files with 97 additions and 5 deletions

View File

@ -183,7 +183,7 @@ bool NodeStoryFragmentComment::check(QList<QString>& 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<SyntaxParser*>() << new NodeStoryDesGroupParser(this));
addChild(QList<SyntaxParser*>() << 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<LexResult> &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<LexResult> &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<LexResult> &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<SyntaxParser*>() << new NodeStoryDesGroupParser(this));
}

View File

@ -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<QString>& 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<DesNode*> children_nodes;
};
class NodeStoryFragmentCommentParser : public Syntax::XSyntaxBase
{
public:
NodeStoryFragmentCommentParser(Syntax::SyntaxParser* pparser);
private:
Syntax::SyntaxParser *const pparser;
};
class StoryUnitDocumentParser : public Syntax::ParseFrame
{