From 53afe5873054cd3f3682f5af7a2540c6f987180e 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: Sun, 6 Nov 2022 19:40:11 +0800 Subject: [PATCH] =?UTF-8?q?=E9=87=8D=E6=9E=84=EF=BC=8C=E7=BB=84=E7=BB=87?= =?UTF-8?q?=E8=A7=A3=E6=9E=90=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DesParser/DesParser.pro | 4 +- .../{LexicalBase.cpp => LexFoundation.cpp} | 8 +- DesParser/{LexicalBase.h => LexFoundation.h} | 16 +- DesParser/ParseFrame.cpp | 16 +- DesParser/ParseFrame.h | 16 +- DesParser/StoryChainDocumentParser.cpp | 1 + DesParser/StoryChainDocumentParser.h | 32 +- DesParser/StoryUnitDocumentParser.cpp | 3 +- DesParser/StoryUnitDocumentParser.h | 36 +- DesParser/SyntaxBase.cpp | 120 ++-- DesParser/SyntaxBase.h | 626 +++++++++--------- DesParser/WordsPeak.cpp | 10 +- DesParser/WordsPeak.h | 8 +- DesParser/XSyntaxBase.cpp | 1 + DesParser/XSyntaxBase.h | 32 +- DesParser/main.cpp | 1 + 16 files changed, 479 insertions(+), 451 deletions(-) rename DesParser/{LexicalBase.cpp => LexFoundation.cpp} (92%) rename DesParser/{LexicalBase.h => LexFoundation.h} (80%) diff --git a/DesParser/DesParser.pro b/DesParser/DesParser.pro index 4585306..d79ae42 100644 --- a/DesParser/DesParser.pro +++ b/DesParser/DesParser.pro @@ -8,7 +8,7 @@ CONFIG -= app_bundle #DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 SOURCES += \ - LexicalBase.cpp \ + LexFoundation.cpp \ ParseFrame.cpp \ StoryChainDocumentParser.cpp \ StoryUnitDocumentParser.cpp \ @@ -28,7 +28,7 @@ else: unix:!android: target.path = /opt/$${TARGET}/bin !isEmpty(target.path): INSTALLS += target HEADERS += \ - LexicalBase.h \ + LexFoundation.h \ ParseFrame.h \ StoryChainDocumentParser.h \ StoryUnitDocumentParser.h \ diff --git a/DesParser/LexicalBase.cpp b/DesParser/LexFoundation.cpp similarity index 92% rename from DesParser/LexicalBase.cpp rename to DesParser/LexFoundation.cpp index 5c47e70..d962f7d 100644 --- a/DesParser/LexicalBase.cpp +++ b/DesParser/LexFoundation.cpp @@ -1,9 +1,9 @@ -#include "LexicalBase.h" +#include "LexFoundation.h" #include using namespace Lex; -LexicalBase::LexicalBase(QList seqence, const QString UnknownToken) +LexFoundation::LexFoundation(QList seqence, const QString UnknownToken) : unknown_token(UnknownToken), lexical_seq(seqence) { empty_seq << '\t' << '\b' << ' ' << '\r' << EOF; @@ -12,7 +12,7 @@ LexicalBase::LexicalBase(QList seqence, const QString UnknownToken) typedef int lexunit_index; typedef int match_start; -QList LexicalBase::push(int row, int col, const QChar w) +QList LexFoundation::push(int row, int col, const QChar w) { QList result; @@ -44,7 +44,7 @@ QList LexicalBase::push(int row, int col, const QChar w) return mid_result; } -QList LexicalBase::lexical_parse(const QString & segment) +QList LexFoundation::lexical_parse(const QString & segment) { // 获取匹配词法分析 QList result; diff --git a/DesParser/LexicalBase.h b/DesParser/LexFoundation.h similarity index 80% rename from DesParser/LexicalBase.h rename to DesParser/LexFoundation.h index 7e573ee..a9474be 100644 --- a/DesParser/LexicalBase.h +++ b/DesParser/LexFoundation.h @@ -4,12 +4,12 @@ #include namespace Lex { - class LexicalBase; + class LexFoundation; /** * 解析基准定义单元. */ - struct LexUnit + struct LexDef { QString TokenType; // Token字符 QString RegExpression; // 词法解析表达式 @@ -24,7 +24,7 @@ namespace Lex { QString Text; // 内容 int StartRow, StartCol, EndRow, EndCol; // 波及范围 - friend class LexicalBase; + friend class LexFoundation; private: int index_at_segment; }; @@ -48,11 +48,11 @@ namespace Lex { /** * 基础词法分析器. */ - class LexicalBase + class LexFoundation { public: - explicit LexicalBase(QList seqence, const QString UnknownToken); - virtual ~LexicalBase() = default; + explicit LexFoundation(QList seqence, const QString UnknownToken); + virtual ~LexFoundation() = default; /** * 词法分析器累积解析单个字符流. @@ -69,8 +69,8 @@ namespace Lex { QList empty_seq; QList code_acc; - QList lexical_seq; + QList lexical_seq; QList lexical_parse(const QString &segment); }; -} \ No newline at end of file +} diff --git a/DesParser/ParseFrame.cpp b/DesParser/ParseFrame.cpp index a924ec7..ac044e0 100644 --- a/DesParser/ParseFrame.cpp +++ b/DesParser/ParseFrame.cpp @@ -2,17 +2,19 @@ #include "WordsPeak.h" using namespace Parse; +using namespace Parse::Result; +using namespace Syntax; using namespace Lex; -Parse::ParseFrame::ParseFrame() {} +ParseFrame::ParseFrame() {} -QList Parse::ParseFrame::analysis(DocCore*doc, const QString & path) +QList ParseFrame::analysis(DocCore*doc, const QString & path) { - ForwardStream stream; + ExStream stream; if (stream.initSource(path)) return QList(); - LexicalBase token_s(this->token_seqs, this->unknown_token); + LexFoundation token_s(this->token_seqs, this->unknown_token); QList lex_seqence; std::tuple temp; @@ -42,18 +44,18 @@ QList Parse::ParseFrame::analysis(DocCore*doc, const QString & path) return xrets; } -void Parse::ParseFrame::appendTokensDefine(QList seqs, const QString & unknown_token) +void ParseFrame::appendTokensDefine(QList seqs, const QString & unknown_token) { this->unknown_token = unknown_token; token_seqs.append(seqs); } -void Parse::ParseFrame::appendParser(SyntaxParser * u) +void ParseFrame::appendParser(SyntaxParser * u) { cascade_parsers << u; } -Parse::ParseResult Parse::ParseFrame::inner_parse(QList &lex_seqence, QList parsers, QList &nodes_out) +ParseResult ParseFrame::inner_parse(QList &lex_seqence, QList parsers, QList &nodes_out) { QList nodes; diff --git a/DesParser/ParseFrame.h b/DesParser/ParseFrame.h index 38c6219..a217cd0 100644 --- a/DesParser/ParseFrame.h +++ b/DesParser/ParseFrame.h @@ -3,7 +3,7 @@ #include #include "SyntaxBase.h" -namespace Parse +namespace Syntax { /** * 基础解析器框架. @@ -14,17 +14,19 @@ namespace Parse explicit ParseFrame(); virtual ~ParseFrame() = default; - QList analysis(DocCore *doc, const QString &path); + QList analysis(Parse::Result::DocCore *doc, const QString &path); protected: - void appendTokensDefine(QList seqs, const QString &unknown_token); - void appendParser(SyntaxParser* u); + void appendTokensDefine(QList seqs, const QString &unknown_token); + void appendParser(Syntax::SyntaxParser* u); private: QString unknown_token; - QList token_seqs; - QList cascade_parsers; + QList token_seqs; + QList cascade_parsers; - Parse::ParseResult Parse::ParseFrame::inner_parse(QList &lex_seqence, QList parsers, QList &nodes_out); + ParseResult ParseFrame::inner_parse(QList &lex_seqence, + QList parsers, + QList &nodes_out); }; } diff --git a/DesParser/StoryChainDocumentParser.cpp b/DesParser/StoryChainDocumentParser.cpp index f019ea1..5ea1122 100644 --- a/DesParser/StoryChainDocumentParser.cpp +++ b/DesParser/StoryChainDocumentParser.cpp @@ -4,6 +4,7 @@ using namespace Parse; using namespace Lex; using namespace Syntax; using namespace Syntax::Defines; +using namespace Parse::Result; // storychain 解析器================================================ NodeStoryChainParser::NodeStoryChainParser(ProjectCore *core) diff --git a/DesParser/StoryChainDocumentParser.h b/DesParser/StoryChainDocumentParser.h index 13649b3..f4a8b41 100644 --- a/DesParser/StoryChainDocumentParser.h +++ b/DesParser/StoryChainDocumentParser.h @@ -17,7 +17,7 @@ namespace Parse /** * 故事脉络节点定义. */ - class NodeStoryChain : public NamedNode + class NodeStoryChain : public Result::NamedNode { public: /** @@ -25,7 +25,7 @@ namespace Parse * * \param src_path 源文件路径 */ - explicit NodeStoryChain(DocCore *doc, const QString &name); + explicit NodeStoryChain(Result::DocCore *doc, const QString &name); virtual ~NodeStoryChain() = default; /** @@ -41,7 +41,7 @@ namespace Parse return 0; } virtual QString name() const override; - virtual DocCore * document() const override; + virtual Result::DocCore * document() const override; virtual int typeValue() const override; virtual DesNode * parent() const override; virtual void appendChild(DesNode * ins) override; @@ -50,7 +50,7 @@ namespace Parse virtual QString toString() const override; private: - DocCore *const doc_store; + Result::DocCore *const doc_store; QString name_store; QList children_nodes; }; @@ -61,19 +61,19 @@ namespace Parse class NodeStoryChainParser : public Syntax::XSyntaxBase { public: - NodeStoryChainParser(ProjectCore *core); + NodeStoryChainParser(Result::ProjectCore *core); virtual ~NodeStoryChainParser() = default; - ProjectCore* project() const; + Result::ProjectCore* project() const; private: - ProjectCore *pjt_ref; + Result::ProjectCore *pjt_ref; }; /** * 故事节点. */ - class NodeStoryPoint : public NamedNode + class NodeStoryPoint : public Result::NamedNode { public: explicit NodeStoryPoint(NodeStoryChain *chain, const QString &name); @@ -90,7 +90,7 @@ namespace Parse inline virtual int depth() const override { return chain_store->depth() + 1; } - virtual DocCore * document() const override; + virtual Result::DocCore * document() const override; virtual int typeValue() const override; virtual DesNode * parent() const override; virtual void appendChild(DesNode * ins) override; @@ -115,7 +115,7 @@ namespace Parse virtual ~NodeStoryPointParser() = default; NodeStoryChainParser* storyChainParser() const; - virtual DocCore* docRef() const override; + virtual Result::DocCore* docRef() const override; private: NodeStoryChainParser *const parent_parser; @@ -124,7 +124,7 @@ namespace Parse /** * 节点描述内容节点. */ - class NodeStoryDesGroup : public DesNode + class NodeStoryDesGroup : public Result::DesNode { public: NodeStoryDesGroup(DesNode *parent_refer); @@ -134,7 +134,7 @@ namespace Parse inline virtual int depth() const override { return parent_refer->depth() + 1; } - virtual DocCore * document() const override; + virtual Result::DocCore * document() const override; virtual int typeValue() const override; virtual DesNode * parent() const override; virtual void appendChild(DesNode * ins) override; @@ -160,7 +160,7 @@ namespace Parse /** * 描述内容文字块. */ - class NodeStoryDesBlock : public DesNode + class NodeStoryDesBlock : public Result::DesNode { public: explicit NodeStoryDesBlock(DesNode *parent_node, const QString &text); @@ -170,7 +170,7 @@ namespace Parse inline virtual int depth() const override { return parent_refer->depth() + 1; } - virtual DocCore * document() const override; + virtual Result::DocCore * document() const override; virtual int typeValue() const override; virtual DesNode * parent() const override; virtual void appendChild(DesNode * ins) override; @@ -183,10 +183,10 @@ namespace Parse QString text_block; }; - class StoryChainDocumentParser : public ParseFrame + class StoryChainDocumentParser : public Syntax::ParseFrame { public: - StoryChainDocumentParser(ProjectCore *pjt); + StoryChainDocumentParser(Result::ProjectCore *pjt); virtual ~StoryChainDocumentParser() = default; }; } diff --git a/DesParser/StoryUnitDocumentParser.cpp b/DesParser/StoryUnitDocumentParser.cpp index b99c647..61c1a3f 100644 --- a/DesParser/StoryUnitDocumentParser.cpp +++ b/DesParser/StoryUnitDocumentParser.cpp @@ -1,6 +1,7 @@ #include "StoryUnitDocumentParser.h" using namespace Parse; +using namespace Parse::Result; using namespace Lex; using namespace Syntax; using namespace Syntax::Defines; @@ -95,7 +96,7 @@ QString NodeStoryFragment::toString() const QString rets = QString(depth(), ' ') + "#情节 " + name() + "{"; for (auto cin : children_nodes) rets += "\n" + QString(depth(), ' ') + cin->toString(); - return rets + "}"; + return rets + "\n"+QString(depth(), ' ') + "}"; } QString NodeStoryFragment::name() const diff --git a/DesParser/StoryUnitDocumentParser.h b/DesParser/StoryUnitDocumentParser.h index a5f5ed7..9380892 100644 --- a/DesParser/StoryUnitDocumentParser.h +++ b/DesParser/StoryUnitDocumentParser.h @@ -7,10 +7,10 @@ namespace Parse { /** * 故事单元. */ - class NodeStoryUnit : public NamedNode + class NodeStoryUnit : public Result::NamedNode { public: - explicit NodeStoryUnit(DocCore *doc, const QString &name); + explicit NodeStoryUnit(Result::DocCore *doc, const QString &name); virtual ~NodeStoryUnit() = default; // 通过 NamedNode @@ -20,7 +20,7 @@ namespace Parse { inline virtual int depth() const override { return 0; } - virtual DocCore * document() const override; + virtual Result::DocCore * document() const override; virtual int typeValue() const override; virtual DesNode * parent() const override; virtual void appendChild(DesNode * ins) override; @@ -29,7 +29,7 @@ namespace Parse { virtual QString toString() const override; private: - DocCore *doc_ref; + Result::DocCore *doc_ref; QString name_store; QList children_nodes; @@ -39,18 +39,18 @@ namespace Parse { class NodeStoryUnitParser : public Syntax::XSyntaxBase { public: - NodeStoryUnitParser(ProjectCore *core); + NodeStoryUnitParser(Result::ProjectCore *core); - ProjectCore* project() const; + Result::ProjectCore* project() const; private: - ProjectCore *const pjt_core; + Result::ProjectCore *const pjt_core; }; /** * 故事情节节点. */ - class NodeStoryFragment : public NamedNode + class NodeStoryFragment : public Result::NamedNode { public: explicit NodeStoryFragment(NodeStoryUnit* unit, const QString &name); @@ -60,7 +60,7 @@ namespace Parse { inline virtual int depth() const override { return unit_ins->depth() + 1; } - virtual DocCore * document() const override; + virtual Result::DocCore * document() const override; virtual int typeValue() const override; virtual DesNode * parent() const override; virtual void appendChild(DesNode * ins) override; @@ -85,7 +85,7 @@ namespace Parse { NodeStoryFragmentParser(NodeStoryUnitParser *pparser); NodeStoryUnitParser * nodeStoryUnitParser() const; - DocCore * docRef() const; + Result::DocCore * docRef() const; private: NodeStoryUnitParser *const parent_parser; @@ -94,7 +94,7 @@ namespace Parse { /** * 故事脉络节点引用. */ - class NodeStoryPointRefer : public DesNode + class NodeStoryPointRefer : public Result::DesNode { public: explicit NodeStoryPointRefer(DesNode *parent, const QString &chain, const QString &point); @@ -104,7 +104,7 @@ namespace Parse { inline virtual int depth() const override { return parent_ins->depth() + 1; } - virtual DocCore * document() const override; + virtual Result::DocCore * document() const override; virtual int typeValue() const override; virtual DesNode * parent() const override; virtual void appendChild(DesNode * ins) override; @@ -148,8 +148,12 @@ namespace Parse { /** * 故事情节有序注释,单独解析 + * #注解 注解名 序列名 值 { + * 注解段落 + * 注解段落 + * } */ - class NodeStoryFragmentComment : public NamedNode + class NodeStoryFragmentComment : public Result::NamedNode { public: NodeStoryFragmentComment(DesNode *parent, const QString &order, const QString &name); @@ -162,7 +166,7 @@ namespace Parse { { return parent_ins->depth() + 1; } - virtual DocCore * document() const override; + virtual Result::DocCore * document() const override; virtual int typeValue() const override; virtual DesNode * parent() const override; virtual void appendChild(DesNode * ins) override; @@ -179,9 +183,9 @@ namespace Parse { }; - class StoryUnitDocumentParser : public ParseFrame + class StoryUnitDocumentParser : public Syntax::ParseFrame { public: - StoryUnitDocumentParser(ProjectCore *ins); + StoryUnitDocumentParser(Result::ProjectCore *ins); }; } diff --git a/DesParser/SyntaxBase.cpp b/DesParser/SyntaxBase.cpp index d2333d0..f8117b5 100644 --- a/DesParser/SyntaxBase.cpp +++ b/DesParser/SyntaxBase.cpp @@ -3,127 +3,131 @@ using namespace Parse; using namespace Lex; +using namespace Syntax; +using namespace Parse::Result; -class Unknown : public DesNode -{ -public: - explicit Unknown(DocCore *ins) - : doc_store(ins) {} +namespace Parse { + class Unknown : public DesNode + { + public: + explicit Unknown(DocCore *ins) + : doc_store(ins) {} - // 通过 DesNode 继承 - virtual int depth() const override - { - return 0; - } - virtual DocCore * document() const override - { - return doc_store; - } - virtual int typeValue() const override - { - return NODE_UNKNOWNHOST; - } - virtual DesNode * parent() const override - { - return nullptr; - } - virtual void appendChild(DesNode * ins) override - { - } - virtual QList children() const override - { - return QList(); - } - virtual bool check(QList& reasons) const override - { - return true; - } - virtual QString toString() const override - { - return QString(); - } -private: - DocCore *const doc_store; -}; + // 通过 DesNode 继承 + virtual int depth() const override + { + return 0; + } + virtual DocCore * document() const override + { + return doc_store; + } + virtual int typeValue() const override + { + return NODE_UNKNOWNHOST; + } + virtual DesNode * parent() const override + { + return nullptr; + } + virtual void appendChild(DesNode *) override + { + } + virtual QList children() const override + { + return QList(); + } + virtual bool check(QList&) const override + { + return true; + } + virtual QString toString() const override + { + return QString(); + } + private: + DocCore *const doc_store; + }; -Parse::Words::Words(DesNode* host, DocCore *doc, const QString & value, int row, int col) - : value_store(value), row_store(row), col_store(col) +} +Words::Words(Result::DesNode *host, DocCore *doc, const QString & value, int row, int col) + : value_store(value), row_store(row), col_store(col), desnode_store(host), docpresent_store(doc) { } -int Parse::Words::row() const +int Words::row() const { return row_store; } -int Parse::Words::column() const +int Words::column() const { return col_store; } -int Parse::Words::length() const +int Words::length() const { return value_store.length(); } -DesNode * Parse::Words::host() const +DesNode * Words::host() const { return desnode_store; } -DocCore * Parse::Words::doc() const +DocCore * Words::doc() const { return docpresent_store; } -QString Parse::Words::toString() const +QString Words::toString() const { return value_store; } -Parse::DocCore::DocCore(ProjectCore * core, const QString & path) - : core_store(core), file_path_store(path), unknown_host(new Unknown(this)) +DocCore::DocCore(ProjectCore * core, const QString & path) + : unknown_host(new Unknown(this)), core_store(core), file_path_store(path) { } -DesNode * Parse::DocCore::unknowns() const +DesNode * DocCore::unknowns() const { return unknown_host; } -ProjectCore * Parse::DocCore::project() const +ProjectCore * DocCore::project() const { return core_store; } -void Parse::DocCore::rename(const QString & new_name) +void DocCore::rename(const QString & new_name) { file_path_store = new_name; } -QString Parse::DocCore::filePath() const +QString DocCore::filePath() const { return file_path_store; } -QString Parse::DocCore::fileName() const +QString DocCore::fileName() const { return QFileInfo(file_path_store).fileName(); } -void Parse::DocCore::clear() +void DocCore::clear() { nodes_store.clear(); } -int Parse::DocCore::append(Words * ins) +int DocCore::append(Words * ins) { nodes_store << ins; return 0; } -Words * Parse::DocCore::getWords(int row, int col) const +Words * DocCore::getWords(int row, int col) const { for (auto it : nodes_store) if (it->row() == row && it->column() <= col && it->column() + it->length() >= col) diff --git a/DesParser/SyntaxBase.h b/DesParser/SyntaxBase.h index 7f78010..dcd5ef3 100644 --- a/DesParser/SyntaxBase.h +++ b/DesParser/SyntaxBase.h @@ -3,342 +3,354 @@ #include #include #include -#include "LexicalBase.h" +#include "LexFoundation.h" #include "comndef.h" namespace Parse { - class NamedNode; - class DocCore; - class ProjectCore; - class DesNode; - - /** - * 词语块,可以通过文档未知直接获取. - */ - class Words - { - public: - explicit Words(DesNode* host, DocCore *doc, const QString &value, int row, int col); - virtual ~Words() = default; - - /** - * 起始行位置. - * - * \return - */ - virtual int row() const; - - /** - * 起始列位置. - * - * \return - */ - virtual int column() const; - - /** - * 次愉快长度. - * - * \return 字符数量 - */ - virtual int length() const; - - /** - * 获取依托节点,悬空节点返回nullptr. - * - * \return - */ - virtual DesNode* host() const; - - /** - * 隶属文档实例. - * - * \return 实例 - */ - virtual DocCore* doc() const; - - /** - * 获取文本内容. - * - * \return - */ - virtual QString toString() const; - - private: - QString value_store; - int row_store, col_store; - DesNode *desnode_store; - DocCore *docpresent_store; - }; - - /** - * 描述性的节点,如文本节点和引用节点. - */ - class DesNode - { - public: - virtual ~DesNode() = default; - - /** - * 节点树深度,根节点深度为0 - * - * \return - */ - virtual int depth() const = 0; - /** - * 承载文档源实例. - * - * \return - */ - virtual DocCore* document() const = 0; - - /** - * 类型标记. - * - * \return 标记值 - */ - virtual int typeValue() const = 0; - - /** - * 获取该节点的父节点. - * - * \return 父节点实例 - */ - virtual DesNode* parent() const = 0; - - /** - * 添加子节点 - * - * \param ins 节点实例 - */ - virtual void appendChild(DesNode *ins) = 0; - - /** - * 获取所有子节点 - * - * \return 子节点集合 - */ - virtual QList children() const = 0; - - /** - * 检查项目错误. - * - * \return true,没有错误 - */ - virtual bool check(QList &reasons) const = 0; - - /** - * 返回本节点的代表文本内容. - * - * \return 文本内容 - */ - virtual QString toString() const = 0; - }; - - /** - * 声明描述节点. - */ - class NamedNode : public DesNode - { - public: - virtual ~NamedNode() = default; - - /** - * 获取此节点的名称. - * - * \return 名称字符串 - */ - virtual QString name() const = 0; - - }; + namespace Result { + class ProjectCore; + class DesNode; + class NamedNode; + class DocCore; + } - /** - * 文档实例. - */ - class DocCore - { - public: - explicit DocCore(ProjectCore* core, const QString &path); - virtual ~DocCore() = default; + namespace Result + { + /** + * 词语块,可以通过文档未知直接获取. + */ + class Words + { + public: + explicit Words(Result::DesNode* host, Result::DocCore *doc, const QString &value, int row, int col); + virtual ~Words() = default; - /** - * 无法识别的节点归并. - * - * \return - */ - DesNode* unknowns() const; + /** + * 起始行位置. + * + * \return + */ + virtual int row() const; - /** - * 项目实例. - * - * \return - */ - ProjectCore* project() const; + /** + * 起始列位置. + * + * \return + */ + virtual int column() const; - /** - * 重命名指向文件. - * - * \param new_name 新路径 - */ - void rename(const QString &new_name); + /** + * 次愉快长度. + * + * \return 字符数量 + */ + virtual int length() const; - /** - * 源文件路径. - * - * \return - */ - QString filePath() const; + /** + * 获取依托节点,悬空节点返回nullptr. + * + * \return + */ + virtual Result::DesNode* host() const; - /** - * 文件名. - * - * \return - */ - QString fileName() const; + /** + * 隶属文档实例. + * + * \return 实例 + */ + virtual Result::DocCore* doc() const; - /** - * 清除所有的词语节点和内容节点. - */ - void clear(); + /** + * 获取文本内容. + * + * \return + */ + virtual QString toString() const; - /** - * 对文档实例添加节点实例. - * - * \param ins 节点实例 - * \return 0 - 添加成功 - */ - int append(Words *ins); - + private: + QString value_store; + int row_store, col_store; + Result::DesNode *desnode_store; + Result::DocCore *docpresent_store; + }; - /** - * 通过位置获取词语. - * - * \param row 行位置 - * \param col 列位置 - * \return 字符号 - */ - Words* getWords(int row, int col) const; + /** + * 描述性的节点,如文本节点和引用节点. + */ + class DesNode + { + public: + virtual ~DesNode() = default; - private: - DesNode *const unknown_host; - ProjectCore *const core_store; - QString file_path_store; - QList nodes_store; - }; + /** + * 节点树深度,根节点深度为0 + * + * \return + */ + virtual int depth() const = 0; + /** + * 承载文档源实例. + * + * \return + */ + virtual DocCore* document() const = 0; - /** - * 项目实例. - */ - class ProjectCore - { - private: - QString name_store; + /** + * 类型标记. + * + * \return 标记值 + */ + virtual int typeValue() const = 0; - public: - explicit ProjectCore(const QString &name); - virtual ~ProjectCore(); + /** + * 获取该节点的父节点. + * + * \return 父节点实例 + */ + virtual DesNode* parent() const = 0; - /** - * 获取文档内存实例,如果不存在指定实例,则新建实例. - * - * \param file_path 文档路径 - * \return 实例 - */ - virtual DocCore* queryDocument(const QString &file_path) const; - virtual void replaceDocument(DocCore *ins); + /** + * 添加子节点 + * + * \param ins 节点实例 + */ + virtual void appendChild(DesNode *ins) = 0; - virtual DesNode* queryChain(const QString & name) const; - virtual DesNode* queryPoint(NamedNode* chain, const QString &name) const; + /** + * 获取所有子节点 + * + * \return 子节点集合 + */ + virtual QList children() const = 0; - virtual DesNode* queryUnit(const QString &name) const; - virtual DesNode* queryFragment(NamedNode *unit, const QString &name) const; + /** + * 检查项目错误. + * + * \return true,没有错误 + */ + virtual bool check(QList &reasons) const = 0; - /** - * 查询指定顺序下的节点序列. - * - * \param type 序列名称 - * \param unit 指定单元下的序列,nullptr代表全局范围 - * \return - */ - virtual QList queryFragmentsOrderby(const QString &type, NamedNode* unit = nullptr) const; + /** + * 返回本节点的代表文本内容. + * + * \return 文本内容 + */ + virtual QString toString() const = 0; + }; - }; - /** - * 解析结果标志. - */ - enum class ParseResult - { - SelfManipulate = 1, - EnterNext = 2, - Completed = 3, - Failed = 4, - }; + /** + * 声明描述节点. + */ + class NamedNode : public Result::DesNode + { + public: + virtual ~NamedNode() = default; - /** - * 解析器接口. - */ - class SyntaxParser - { - public: - virtual ~SyntaxParser() = default; + /** + * 获取此节点的名称. + * + * \return 名称字符串 + */ + virtual QString name() const = 0; - /** - * 设置当前活动的Doc实例. - * - * \param ins - */ - virtual void docActive(DocCore *ins) = 0; + }; - /** - * 当前指向的文档. - * - * \return 文档实例 - */ - virtual DocCore* docRef() const = 0; - /** - * 适配当前解析. - * - * \param seqs - * \return - */ - virtual bool applied(const QList& seqs) = 0; + /** + * 文档实例. + */ + class DocCore + { + public: + explicit DocCore(ProjectCore* core, const QString &path); + virtual ~DocCore() = default; - /** - * 重置解析器 - */ - virtual void reset() = 0; + /** + * 无法识别的节点归并. + * + * \return + */ + Result::DesNode* unknowns() const; - /** - * 针对性的解析当前Token序列,对已经解析过的序列做摘除处理,返回下一步可能用到的解析器列表。 - * - * \param seqs 标记序列 - * \param next_ps 下一步需要用到的解析器 - * \return 解析操作类型 - */ - virtual ParseResult parse(QList& seqs)= 0; + /** + * 项目实例. + * + * \return + */ + ProjectCore* project() const; - /** - * 子解析器集合. - * - * \return - */ - virtual QList children() const = 0; + /** + * 重命名指向文件. + * + * \param new_name 新路径 + */ + void rename(const QString &new_name); - /** - * 当前聚焦的节点. - * - * \return - */ - virtual DesNode* currNode() const = 0; + /** + * 源文件路径. + * + * \return + */ + QString filePath() const; - public: - /** - * 设置子元素解析器,内部元素解析器集合. - * - * \param parsers 解析器集合 - */ - virtual void addChild(QList parsers) = 0; - }; + /** + * 文件名. + * + * \return + */ + QString fileName() const; + + /** + * 清除所有的词语节点和内容节点. + */ + void clear(); + + /** + * 对文档实例添加节点实例. + * + * \param ins 节点实例 + * \return 0 - 添加成功 + */ + int append(Words *ins); + + + /** + * 通过位置获取词语. + * + * \param row 行位置 + * \param col 列位置 + * \return 字符号 + */ + Words* getWords(int row, int col) const; + + private: + Result::DesNode *const unknown_host; + ProjectCore *const core_store; + QString file_path_store; + QList nodes_store; + }; + + /** + * 项目实例. + */ + class ProjectCore + { + private: + QString name_store; + + public: + explicit ProjectCore(const QString &name); + virtual ~ProjectCore(); + + /** + * 获取文档内存实例,如果不存在指定实例,则新建实例. + * + * \param file_path 文档路径 + * \return 实例 + */ + virtual Parse::Result::DocCore* queryDocument(const QString &file_path) const; + virtual void replaceDocument(Parse::Result::DocCore *ins); + + virtual Parse::Result::DesNode* queryChain(const QString & name) const; + virtual Parse::Result::DesNode* queryPoint(Parse::Result::NamedNode* chain, const QString &name) const; + + virtual Parse::Result::DesNode* queryUnit(const QString &name) const; + virtual Parse::Result::DesNode* queryFragment(Parse::Result::NamedNode *unit, const QString &name) const; + + /** + * 查询指定顺序下的节点序列. + * + * \param type 序列名称 + * \param unit 指定单元下的序列,nullptr代表全局范围 + * \return + */ + virtual QList queryFragmentsOrderby(const QString &type, Parse::Result::NamedNode* unit = nullptr) const; + + }; + + + } +} + +namespace Syntax { + + + /** + * 解析结果标志. + */ + enum class ParseResult + { + SelfManipulate = 1, + EnterNext = 2, + Completed = 3, + Failed = 4, + }; + + /** + * 解析器接口. + */ + class SyntaxParser + { + public: + virtual ~SyntaxParser() = default; + + /** + * 设置当前活动的Doc实例. + * + * \param ins + */ + virtual void docActive(Parse::Result::DocCore *ins) = 0; + + /** + * 当前指向的文档. + * + * \return 文档实例 + */ + virtual Parse::Result::DocCore* docRef() const = 0; + /** + * 适配当前解析. + * + * \param seqs + * \return + */ + virtual bool applied(const QList& seqs) = 0; + + /** + * 重置解析器 + */ + virtual void reset() = 0; + + /** + * 针对性的解析当前Token序列,对已经解析过的序列做摘除处理,返回下一步可能用到的解析器列表。 + * + * \param seqs 标记序列 + * \param next_ps 下一步需要用到的解析器 + * \return 解析操作类型 + */ + virtual ParseResult parse(QList& seqs)= 0; + + /** + * 子解析器集合. + * + * \return + */ + virtual QList children() const = 0; + + /** + * 当前聚焦的节点. + * + * \return + */ + virtual Parse::Result::DesNode* currNode() const = 0; + + public: + /** + * 设置子元素解析器,内部元素解析器集合. + * + * \param parsers 解析器集合 + */ + virtual void addChild(QList parsers) = 0; + }; } diff --git a/DesParser/WordsPeak.cpp b/DesParser/WordsPeak.cpp index b74c767..b661d35 100644 --- a/DesParser/WordsPeak.cpp +++ b/DesParser/WordsPeak.cpp @@ -1,19 +1,19 @@ #include "WordsPeak.h" #include -using namespace Parse; +using namespace Lex; -ForwardStream::ForwardStream() :file_target(nullptr), text_input(nullptr), +ExStream::ExStream() :file_target(nullptr), text_input(nullptr), current_line(""), current_row(-1), current_col(0) {} -ForwardStream::~ForwardStream() { +ExStream::~ExStream() { if (file_target) delete file_target; if (text_input) delete text_input; } -int ForwardStream::initSource(const QString & path) +int ExStream::initSource(const QString & path) { if (file_target) delete file_target; @@ -31,7 +31,7 @@ int ForwardStream::initSource(const QString & path) return 0; } -std::tuple Parse::ForwardStream::read() +std::tuple ExStream::read() { if (current_col >= current_line.length()) { if (!text_input->atEnd()) { diff --git a/DesParser/WordsPeak.h b/DesParser/WordsPeak.h index 3d8c949..a580d6c 100644 --- a/DesParser/WordsPeak.h +++ b/DesParser/WordsPeak.h @@ -4,14 +4,14 @@ #include #include -namespace Parse { - class ForwardStream +namespace Lex { + class ExStream { public: typedef int n_row; typedef int n_col; - explicit ForwardStream(); - virtual ~ForwardStream(); + explicit ExStream(); + virtual ~ExStream(); /** * 初始化文件指向. diff --git a/DesParser/XSyntaxBase.cpp b/DesParser/XSyntaxBase.cpp index 1cd43dd..4149082 100644 --- a/DesParser/XSyntaxBase.cpp +++ b/DesParser/XSyntaxBase.cpp @@ -1,6 +1,7 @@ #include "XSyntaxBase.h" using namespace Parse; +using namespace Parse::Result; using namespace Syntax; using namespace Lex; using namespace Defines; diff --git a/DesParser/XSyntaxBase.h b/DesParser/XSyntaxBase.h index a88819d..8da44d5 100644 --- a/DesParser/XSyntaxBase.h +++ b/DesParser/XSyntaxBase.h @@ -2,7 +2,7 @@ #include #include #include -#include "LexicalBase.h" +#include "LexFoundation.h" #include "SyntaxBase.h" namespace Syntax @@ -178,7 +178,7 @@ namespace Syntax { public: ParseRule(XSyntaxBase *host, const QString &rule_name, unsigned short level, - std::function&, int)>); + std::function&, int)>); virtual ~ParseRule() = default; int level() const; @@ -186,7 +186,7 @@ namespace Syntax void addExpression(const QString &name, const QList &_defines); std::tuple tokensMatch(const QList &token) const; - Parse::ParseResult syntaxTrigger(const QList& srcs, int count); + ParseResult syntaxTrigger(const QList& srcs, int count); private: XSyntaxBase *const host_ins; @@ -194,7 +194,7 @@ namespace Syntax QString name_store; QList expression_list; - std::function&, int)> exc_store; + std::function&, int)> exc_store; }; @@ -210,7 +210,7 @@ namespace Syntax /** * 基础解析器模型. */ - class XSyntaxBase : public Parse::SyntaxParser + class XSyntaxBase : public Syntax::SyntaxParser { public: explicit XSyntaxBase(const QString §ion, MatchType type = MatchType::Entirely); @@ -219,19 +219,19 @@ namespace Syntax Element *get_element(const QString &name); // 通过 Parse::SyntaxParser 继承 - virtual void docActive(Parse::DocCore *ins) override; - virtual Parse::DocCore *docRef() const override; + virtual void docActive(Parse::Result::DocCore *ins) override; + virtual Parse::Result::DocCore *docRef() const override; virtual bool applied(const QList& seqs) override; virtual void reset() override; - virtual Parse::ParseResult parse(QList& seqs) override; - virtual QList children() const override; + virtual ParseResult parse(QList& seqs) override; + virtual QList children() const override; - virtual Parse::DesNode * currNode() const override; + virtual Parse::Result::DesNode * currNode() const override; protected: - ParseRule* addRule(const QString &name, unsigned short level, std::function&, int)> exc); - virtual void addChild(QList parsers) override; - void refocusNode(Parse::DesNode *ins); + ParseRule* addRule(const QString &name, unsigned short level, std::function&, int)> exc); + virtual void addChild(QList parsers) override; + void refocusNode(Parse::Result::DesNode *ins); Expression* set_common_expression(const QString &name, const QList &defines); @@ -239,12 +239,12 @@ namespace Syntax MatchType target_type; QString section_name; int current_level; - Parse::DesNode *current_node; - Parse::DocCore *src_ref; + Parse::Result::DesNode *current_node; + Parse::Result::DocCore *src_ref; QHash elements_store; QHash expressions_store; - QList child_parsers; + QList child_parsers; QHash rule_collect; }; diff --git a/DesParser/main.cpp b/DesParser/main.cpp index c7ce98b..a61aa2c 100644 --- a/DesParser/main.cpp +++ b/DesParser/main.cpp @@ -7,6 +7,7 @@ #include "ParseFrame.h" using namespace Parse; +using namespace Parse::Result; int main(int argc, char *argv[]) {