#pragma once #include "libsyntax_global.h" #include #include #include #include namespace ast_basic { class IExprInst; class ExpressionElement; } namespace lib_syntax { class IBasicRule; /** * @brief 语法异常 */ class LIBSYNTAX_EXPORT SyntaxException { private: QString msg_store; public: SyntaxException(const QString& message); virtual ~SyntaxException() = default; virtual QString message() const; }; // 基础语法解析接口 =================================================================================================== /** * @brief 修正类型 */ enum class ErrDeals { None, // 无错误 Surplus, // 多一个词 Absence, // 少一个词 Replace, // 错一个词 Abort, // 中断解析过程 TerminalAOT, // 输入提前终止 }; /** * @brief 解析分支 */ struct LIBSYNTAX_EXPORT ParseFork { ErrDeals occurs = ErrDeals::None; // 解析过程中的错误 QList error_messages; // 累计错误信息 QList> mbrs_list; // 成员存储 QList> tokens_list; // token列表 std::shared_ptr next = nullptr; // 下一个解析词 ParseFork(); ParseFork(const ParseFork& other); }; /** * @brief 基础语法匹配规则接口 */ class IBasicRule { public: virtual ~IBasicRule() = default; /** * @brief 子规则 * @return */ virtual QList> children() const = 0; /** * @brief 解析 * @param context 累计上下文 * @return 返回结果<解析分支> */ virtual QList parse(const ParseFork& context) const = 0; /** * 返回匹配语法规则的词法序列表达 * * \return 词法表达序列 */ virtual QString token_present() const = 0; }; /** * @brief token匹配 */ class LIBSYNTAX_EXPORT TokenMatch : public IBasicRule, public std::enable_shared_from_this { private: std::shared_ptr define_peer; public: TokenMatch(std::shared_ptr define); // IBasicRule interface public: virtual QList> children() const override; virtual QList parse(const ParseFork& context) const override; virtual QString token_present() const override; }; /** * @brief 语法规则或匹配 */ class LIBSYNTAX_EXPORT Any : public IBasicRule, public std::enable_shared_from_this { private: QList> mbrs_store; public: Any(const QList> mbrs); // IBasicRule interface public: virtual QList> children() const override; virtual QList parse(const ParseFork& context) const override; virtual QString token_present() const override; }; /** * @brief 语法规则序列匹配 */ class LIBSYNTAX_EXPORT Seqs : public IBasicRule, public std::enable_shared_from_this { private: QList> mbrs_store; public: Seqs(const QList> mbrs); // IBasicRule interface public: virtual QList> children() const override; virtual QList parse(const ParseFork& context) const override; virtual QString token_present() const override; }; /** * @brief 语法规则重复匹配 */ class LIBSYNTAX_EXPORT Rept : public IBasicRule, public std::enable_shared_from_this { private: std::shared_ptr rule_peer; int min_match, max_match; public: Rept(std::shared_ptr rule, int min, int max); // IBasicRule interface public: virtual QList> children() const override; virtual QList parse(const ParseFork& context) const override; virtual QString token_present() const override; }; // 组合语法实体解析 =================================================================================================== /** * @brief 对应语法表达式解析规则 */ class LIBSYNTAX_EXPORT ExprRule : public IBasicRule, public std::enable_shared_from_this { public: typedef QList> TokenSeqs; ExprRule(const QString& rule_name, int expr_mark); virtual std::shared_ptr reloadRule(std::shared_ptr rule); virtual QString name() const; virtual int typeMark() const; virtual std::shared_ptr newEmptyInstance() const = 0; virtual std::shared_ptr makeCopy() const = 0; // IBasicRule interface public: virtual QList> children() const override; virtual QList parse(const ParseFork& context) const override; virtual QString token_present() const override; protected: std::shared_ptr child_store; private: QString name_store; int mark_store; }; /** * 语法元素解析规则. */ template class ElementRule : public ExprRule { public: ElementRule(const QString& rule_name, int expr_mark) :ExprRule(rule_name, expr_mark) {} virtual std::shared_ptr newEmptyInstance() const { return std::dynamic_pointer_cast( std::make_shared(this->shared_from_this())); } virtual std::shared_ptr makeCopy() const { return std::make_shared>(name(), typeMark()); } }; } // namespace lib_syntax