#include "StoryChainDocumentParser.h" #include "storyconceptdocumentparser.h" using namespace Parse; using namespace Parse::Result; using namespace Syntax; using namespace Syntax::Defines; using namespace Lex; StoryConceptDocumentParser::StoryConceptDocumentParser(ParseCore *core) { appendTokensDefine({ {"{概念定义}","#概念"}, {"{要点定义}", "#要点"}, {"{描述文本}", "[^#@\\{\\}\\n]+"}, {"{左界限}","\\{"}, {"{右界限}","\\}"}, {"{换行符}","\\n"} }, "{无法识别}"); auto chain_parser = new NodeStoryConceptParser(core); appendParser(chain_parser); } Parse::NodeStoryConcept::NodeStoryConcept(const QString &name, DocCore *doc) : Result::NamedNode(name, doc, NODE_STORYCONCEPT, nullptr) { } bool NodeStoryConcept::check(QList &reasons) const { auto nodes = doc()->core()->queryStoryConcept(name()[0]); if(nodes.size() > 1){ ErrorMessage ins; ins.CodeRow = refered().first()->row(); ins.CodeCol = refered().first()->column(); ins.FilePath = doc()->filePath(); ins.Reason = "概念重复定义"; ins.Text = name()[0]; reasons << ins; } return nodes.size() == 1; } QString NodeStoryConcept::toString() const { QString string = ""; string += "#概念 "+name()[0] + " {"; for(auto &c : children()) string += "\n" + QString(depth(), ' ') + c->toString(); string +="\n" + QString(depth(),' ') + "}"; return string; } NodeStoryStrongPoint::NodeStoryStrongPoint(NodeStoryConcept *parent, const QString &name) : Result::NamedNode(name, parent->doc(), NODE_STORYSTRONGPOINT, parent), concept_point(parent) { } bool NodeStoryStrongPoint::check(QList &reasons) const { auto concept = parent(); auto nodes = doc()->core()->queryStoryStrongPoint(concept, name()[0]); if(nodes.size() > 1){ ErrorMessage ins; ins.CodeRow = refered().first()->row(); ins.CodeCol = refered().first()->column(); ins.FilePath = doc()->filePath(); ins.Reason = "要点重复定义"; ins.Text = name()[0]; reasons << ins; } return nodes.size() == 1; } QString NodeStoryStrongPoint::toString() const { QString string = "#要点 " + name()[0] + " {"; for(auto &c : children()) string += "\n" + QString(depth(), ' ') + c->toString(); string += "\n" + QString(depth(),' ') + "}"; return string; } QList NodeStoryStrongPoint::name() const { QList rets; rets << NamedNode::name()[0] << concept_point->name()[0]; return rets; } NodeStoryConceptParser::NodeStoryConceptParser(Result::ParseCore *core) : Syntax::XSyntaxBase("概念解析"), core(core) { set_common_expression("::换行前缀", {Elm("{换行符}"), Elm("{换行符}", true)}); auto rule = addRule("进入概念解析", 0, [this](const QList &seqs, int cnt)->ParseResult { auto nmunit = seqs[cnt-1]; auto defunit = seqs[cnt-2]; auto node = new NodeStoryConcept(nmunit.Text, docRef()); refocusNode(node); auto word1 = new Words(node, docRef(), defunit.Text, defunit.StartRow, defunit.StartCol); auto word0 = new Words(node, docRef(), nmunit.Text, nmunit.StartRow, nmunit.StartCol); docRef()->append(word1); docRef()->append(word0); return ParseResult::SelfManipulate; }); rule->addExpression("基础概念定义", {Elm("{概念定义}"), Elm("{描述文本}", 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 NodeStoryPureTextDesGroupParser(this) << new NodeStoryStrongPointParser(this)); } NodeStoryStrongPointParser::NodeStoryStrongPointParser(NodeStoryConceptParser *pparser) : Syntax::XSyntaxBase("要点解析") { set_common_expression("::换行前缀", {Elm("{换行符}"), Elm("{换行符}", true)}); auto rule = addRule("进入要点解析", 0, [this, pparser](const QList &seqs, int cnt)->ParseResult { auto nmunit = seqs[cnt-1]; auto defunit = seqs[cnt-2]; auto node = new NodeStoryStrongPoint(static_cast(pparser->currNode()), nmunit.Text); refocusNode(node); pparser->currNode()->appendChild(node); auto word1 = new Words(node, docRef(), defunit.Text, defunit.StartRow, defunit.StartCol); auto word0 = new Words(node, docRef(), nmunit.Text, nmunit.StartRow, nmunit.StartCol); docRef()->append(word1); docRef()->append(word0); return ParseResult::SelfManipulate; }); rule->addExpression("基础要点定义", {Elm("{要点定义}"), Elm("{描述文本}", 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 NodeStoryPureTextDesGroupParser(this)); }