#pragma once #include #include #include "libtokens.h" #include "libsyntax.h" namespace ast_basic { // 抽象语法树 ================================================================================================ /** * @brief 抽象语法树集合节点/表达式节点 */ class IExprInst { public: virtual ~IExprInst() = default; /** * @brief 获取表达式的解析规则 * @return */ virtual std::shared_ptr definedRule() const = 0; //===================================================== /** * 获取语法节点的源码文件路径. * * \return 文件路径 */ virtual QString filePath() const = 0; /** * 获取语法节点关联token序列. * * \return token序列 */ virtual QList> tokens() const = 0; /** * 解析过程中,向表达式内部添加token实例. * * \param token_inst 实例 */ virtual void addToken(std::shared_ptr token_inst) = 0; //===================================================== /** * @brief 子表达式集合 * @return */ virtual QList> children() const = 0; /** * @brief 添加子表达式. * * \param inst 子表达式实例 */ virtual void addChild(std::shared_ptr inst) = 0; }; // 基础语法树构成 ========================================================================================== /** * @brief 表达式节点 */ class LIBSYNTAX_EXPORT ExprInstance : public ast_basic::IExprInst, public std::enable_shared_from_this { private: std::shared_ptr _expr_rule; QList> children_store; QList> tokens_bind; public: ExprInstance(std::shared_ptr bind); // 通过 Expression 继承 std::shared_ptr definedRule() const override; QString filePath() const override; QList> tokens() const override; void addToken(std::shared_ptr token_inst) override; QList> children() const override; void addChild(std::shared_ptr inst) override; }; }