#pragma once #include #include #include #include "libsyntax.h" namespace ast_basic { // 抽象语法树 ================================================================================================ /** * @brief 抽象语法树集合节点/表达式节点 */ class Expression { public: virtual ~Expression() = default; /** * @brief 获取表达式的解析规则 * @return */ virtual std::shared_ptr definedRule() const = 0; //===================================================== /** * 获取语法节点的源码文件路径. * * \return 文件路径 */ virtual QString filePath() const = 0; /** * 获取语法节点关联token序列. * * \return token序列 */ virtual QList> tokens() const = 0; virtual void tokensReset(const QList> &list) = 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 ExpressionElement : public ast_basic::Expression, public std::enable_shared_from_this { private: std::shared_ptr _expr_rule; QList> children_store; QList> tokens_bind; public: ExpressionElement(std::shared_ptr bind); // 通过 Expression 继承 std::shared_ptr definedRule() const override; QString filePath() const override; QList> tokens() const override; void tokensReset(const QList>& list) override; void addToken(std::shared_ptr token_inst) override; QList> children() const override; void addChild(std::shared_ptr inst) override; }; class LIBSYNTAX_EXPORT ExpressionContext : public lib_syntax::ParseContext, public std::enable_shared_from_this { private: QList> rule_stack; QList> expression_stack; public: ExpressionContext(){} // 通过 ParseContext 继承 std::shared_ptr currentInst() const override; void pushInst(std::shared_ptr current_inst) override; std::shared_ptr popInst() override; std::shared_ptr currentExpressionRule() const override; void pushExpressionRule(std::shared_ptr inst) override; std::shared_ptr popExpressionRule() override; }; }