#pragma once #include "ast_basic.h" #include "libsyntax.h" #include #include namespace ast_gen { class TokenAccess; /** * @brief 解析上下文 */ class SyntaxElement { public: virtual ~SyntaxElement() = default; /** * 绑定表达式实体. * * \return 表达式实例 */ virtual std::shared_ptr bindExpression() const = 0; /** * @brief 类型标记 * @return */ virtual int typeMark() const = 0; /** * 是否属于匿名节点. * * \return 匿名标志 */ virtual bool isAnonymous() const = 0; /** * @brief 文件路径 * @return */ virtual QString path() const = 0; /** * @brief 元素签名,如果是匿名元素返回空字符串 * @return */ virtual QString signature() const = 0; /** * @brief 获取元素在Ast深度 * @return depth */ virtual int depth() const = 0; /** * @brief 获取父元素 * @return 未设置parent,返回nullptr */ virtual std::weak_ptr parent() const = 0; /** * @brief 定义元素自身的Token集合 * @return */ virtual QList> selfTokens() const = 0; }; /** * @brief 语法元素整理访问接口 */ class LIBSYNTAX_EXPORT ElementAccess { private: std::shared_ptr peers; public: ElementAccess(std::shared_ptr point); std::shared_ptr element() const; QList> children() const; /** * @brief 获取该元素下所有Token定义 * @return */ virtual QList> tokens() const; }; /** * @brief Token元素访问接口 */ class LIBSYNTAX_EXPORT TokenAccess { private: std::shared_ptr element_bind; std::shared_ptr token_store; public: TokenAccess(std::shared_ptr elm_inst, std::shared_ptr token_inst); virtual std::shared_ptr bind() const; virtual std::shared_ptr token() const; }; } namespace example_novel { enum class NovelNode { GlobalElement = 0, TextSection = 1, FragmentRefers = 2, FragmentSlice = 3, StoryDefine = 4, Document = 5, ArticleDefine = 6, VolumeDefine = 7, RankDeclaration = 8, }; /* GlobalElement \-Document |-RankDeclaration |-StoryDefine | |-TextSection | \-FragmentSlice | |-TextSection | \-FragmentRefers | \-TextSection \-VolumeDefine |-TextSection \-ArticleDefine |-TextSection \-FragmentRefers \-TextSection */ template class AbstractImpl : public ast_basic::ExprInstance, public ast_gen::SyntaxElement { public: AbstractImpl(std::shared_ptr rule_bind) : ExprInstance(rule_bind) { } // 通过 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(); } int depth() const { return parent().lock()->depth() + 1; } virtual std::weak_ptr parent() const override { return std::dynamic_pointer_cast(ExprInstance::parentExpr().lock()); } 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 FragmentRefers : public AbstractImpl { private: QString story_refs, slice_ref; public: FragmentRefers(std::shared_ptr rule_bind); QString storyRefer() const; void setStoryRefer(const QString& refer); QString sliceRefer() const; void setSliceRefer(const QString& refer); QString referSignature() const; // 通过 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; }; /** * @brief 全局根元素 */ class LIBSYNTAX_EXPORT NGlobalElement : public ast_basic::ExprProgram, public ast_gen::SyntaxElement { private: QList _errors_store; public: NGlobalElement(const QString& root); void appendError(const QList& errors); QList errors() const; // 通过 SyntaxElement 继承 std::shared_ptr bindExpression() const override; int typeMark() const override; bool isAnonymous() const override; QString path() const override; QString signature() const override; int depth() const override; std::weak_ptr parent() const override; QList> selfTokens() const override; }; }