#pragma once #include #include #include #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 ExpressionElement : public ast_basic::IExprInst, 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 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::IContext, public std::enable_shared_from_this { private: QList> rule_stack; QList> expression_stack; QList> document_store; QString current_file_path; QList> errors_storage; public: ExpressionContext(); virtual void setCurrentFile(const QString& path); virtual QString currentFile() const; // 通过 IContext 继承 std::shared_ptr currentExprInst() const override; void pushExprInst(std::shared_ptr current_inst) override; std::shared_ptr popExprInst() override; std::shared_ptr currentExprRule() const override; void pushExprRule(std::shared_ptr inst) override; std::shared_ptr popExprRule() override; virtual QList> currentExpressionRuleStack() const; virtual void appendDoc(std::shared_ptr inst) override; virtual QList> getDocs() const override; void appendParseErrors(const QString& file_path, int start, const QString& error_msg) override; QStringList errors() const override; void clearErrors(const QString& file_path, int start) override; }; }