#pragma once #include "ast_access.h" #include "ast_basic.h" #include "libsyntax.h" namespace example_novel { enum class NovelNode { GlobalElement = 0, TextSection = 1, PointRefers = 2, PointDefines = 3, StoryDefine = 4, Document = 5, ArticleDefine = 6, VolumeDefine = 7, RankDeclaration = 8, FragmentSlice = 9, }; /* GlobalElement \-Document |-RankDeclaration |-StoryDefine | |-TextSection | \-FragmentSlice | |-TextSection | |-PointDefines | | \-TextSection | \-PointRefers | \-TextSection \-VolumeDefine |-TextSection \-ArticleDefine |-TextSection \-PointRefers \-TextSection */ template class AbstractImpl : public ast_basic::ExprInstance, public ast_gen::SyntaxElement { private: std::weak_ptr parent_store; public: AbstractImpl(std::shared_ptr rule_bind) : ExprInstance(rule_bind) { parent_store.reset(); } // 通过 SyntaxElement 继承 virtual int typeMark() const override { return (int) type; } virtual bool isAnonymous() const override { return !named; } virtual std::shared_ptr bindExpression() const override { return shared_from_this(); } QString path() const override { return ExprInstance::filePath(); } virtual std::weak_ptr parent() const override { return this->parent_store; } virtual void setParent(std::shared_ptr inst) override { this->parent_store = inst; } virtual QList> selfTokens() const override { auto tokensx = ExprInstance::tokens(); QList> values; for (auto xit : tokensx) { values.append(std::make_shared(std::dynamic_pointer_cast(shared_from_this()), xit)); } return values; } }; /** * @brief 文字段落 */ class LIBSYNTAX_EXPORT TextSection : public AbstractImpl { public: TextSection(std::shared_ptr rule_bind); /** * @brief 段落内容 */ QString content() const; // 通过 AbstractImpl 继承 virtual QString signature() const override; }; /** * @brief 故事情节 */ class LIBSYNTAX_EXPORT FragmentSlice : public AbstractImpl { private: QString _slice_name; public: FragmentSlice(std::shared_ptr rule); QString name() const; void setName(const QString& nm); // 通过 AbstractImpl 继承 QString signature() const override; }; /** * @brief 节点引用定义 */ class LIBSYNTAX_EXPORT PointRefers : public AbstractImpl { private: QString story_refs, slice_ref, point_ref; public: PointRefers(std::shared_ptr rule_bind); QString storyRefer() const; void setStoryRefer(const QString& refer); QString sliceRefer() const; void setSliceRefer(const QString& refer); QString pointRefer() const; void setPointRefer(const QString& refer); QString referSignature() const; // 通过 AbstractImpl 继承 virtual QString signature() const override; }; /** * @brief 节点定义 */ class LIBSYNTAX_EXPORT PointDefines : public AbstractImpl { private: QString name_store; public: PointDefines(std::shared_ptr rule_bind); QString name() const; void setName(const QString& nm); // 通过 AbstractImpl 继承 virtual QString signature() const override; }; /** * @brief 章节定义 */ class LIBSYNTAX_EXPORT ArticleDefine : public AbstractImpl { public: ArticleDefine(std::shared_ptr rule_bind); QString name() const; void setName(const QString& nm); // 通过 AbstractImpl 继承 virtual QString signature() const override; private: QString name_store; }; /** * @brief 卷宗定义 */ class LIBSYNTAX_EXPORT VolumeDefine : public AbstractImpl { public: VolumeDefine(std::shared_ptr rule_bind); QString name() const; void setName(const QString& nm); // 通过 AbstractImpl 继承 virtual QString signature() const override; private: QString name_store; }; /** * @brief 故事定义 */ class LIBSYNTAX_EXPORT StoryDefine : public AbstractImpl { public: StoryDefine(std::shared_ptr rule_bind); QString name() const; void setName(const QString& nm); void setSort(int value); int sort() const; // 通过 AbstractImpl 继承 virtual QString signature() const override; private: QString name_store; int sort_index; }; /** * @brief 排序声明 */ class LIBSYNTAX_EXPORT RankDeclare : public AbstractImpl { private: int page_rank = 0; public: RankDeclare(std::shared_ptr rule); int rankNumber() const; void setRank(int nums); // 通过 AbstractImpl 继承 QString signature() const override; }; /** * @brief 文档定义 */ class LIBSYNTAX_EXPORT Document : public AbstractImpl { public: Document(std::shared_ptr rule_bind); // 通过 AbstractImpl 继承 virtual QString signature() const override; }; class LIBSYNTAX_EXPORT NGlobalElement : public ast_basic::ExprProgram, public ast_gen::SyntaxElement { public: NGlobalElement(const QString &root); // 通过 SyntaxElement 继承 std::shared_ptr bindExpression() const override; int typeMark() const override; bool isAnonymous() const override; QString path() const override; QString signature() const override; std::weak_ptr parent() const override; void setParent(std::shared_ptr inst) override; QList> selfTokens() const override; }; }