#pragma once #include "libsyntax_global.h" #include #include #include #include namespace ast_basic { class Expression; class ExpressionElement; } namespace lib_syntax { class BaseRule; /** * @brief 语法异常 */ class SyntaxException { private: QString msg_store; public: SyntaxException(const QString& message); virtual ~SyntaxException() = default; virtual QString message() const; }; // 基础语法解析接口 =================================================================================================== /** * @brief 解析上下文接口 */ class ParseContext { public: virtual ~ParseContext() = default; /** * \brief 当前表达式元素. * * \return 返回当前表达式 */ virtual std::shared_ptr currentInst() const = 0; virtual void pushInst(std::shared_ptr current_inst) = 0; virtual std::shared_ptr popInst() = 0; virtual std::shared_ptr currentExpressionRule() const = 0; virtual void pushExpressionRule(std::shared_ptr inst) = 0; virtual std::shared_ptr popExpressionRule() = 0; }; /** * @brief 基础语法匹配规则接口 */ class BaseRule { public: virtual ~BaseRule() = default; /** * @brief 子规则 * @return */ virtual QList> children() const = 0; /** * @brief 匹配结果 */ enum class MatchResult { Success, // 符合匹配条件 Part, // 部分匹配 Fail // 从第一个词起完全不匹配 }; /** * @brief token流匹配 * @return 首部对齐,匹配token集合<匹配结果,匹配长度,剩余列表头指针> */ virtual std::tuple> match(std::shared_ptr remains_head) const = 0; /** * @brief 解析 * @param rt_inst 解析上下文 * @param head 列表头 * @return 返回结果<匹配完成新列表头,匹配长度> */ virtual std::tuple, std::shared_ptr> parse(std::shared_ptr rt_inst, std::shared_ptr head) const = 0; /** * 返回匹配语法规则的词法序列表达 * * \return 词法表达序列 */ virtual QString token_present() const = 0; }; /** * @brief token匹配 */ class LIBSYNTAX_EXPORT TokenMatch : public BaseRule, public std::enable_shared_from_this { private: std::shared_ptr define_peer; public: TokenMatch(std::shared_ptr define); // BaseRule interface public: virtual QList> children() const override; virtual std::tuple> match(std::shared_ptr head) const override; virtual std::tuple, std::shared_ptr> parse(std::shared_ptr rt_inst, std::shared_ptr head) const override; virtual QString token_present() const override; }; /** * @brief 语法规则或匹配 */ class LIBSYNTAX_EXPORT Any : public BaseRule, public std::enable_shared_from_this { private: QList> mbrs_store; std::tuple, std::shared_ptr> rule_select(std::shared_ptr head) const; public: Any(const QList> mbrs); // BaseRule interface public: virtual QList> children() const override; virtual std::tuple> match(std::shared_ptr list_head) const override; virtual std::tuple, std::shared_ptr> parse(std::shared_ptr rt_inst, std::shared_ptr head) const override; virtual QString token_present() const override; }; /** * @brief 语法规则序列匹配 */ class LIBSYNTAX_EXPORT Seqs : public BaseRule, public std::enable_shared_from_this { private: QList> mbrs_store; public: Seqs(const QList> mbrs); // BaseRule interface public: virtual QList> children() const override; virtual std::tuple> match(std::shared_ptr list_head) const override; virtual std::tuple, std::shared_ptr> parse(std::shared_ptr rt_inst, std::shared_ptr head) const override; virtual QString token_present() const override; }; /** * @brief 语法规则重复匹配 */ class LIBSYNTAX_EXPORT Rept : public BaseRule, 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); // BaseRule interface public: virtual QList> children() const override; virtual std::tuple> match(std::shared_ptr list_head) const override; virtual std::tuple, std::shared_ptr> parse(std::shared_ptr rt_inst, std::shared_ptr head) const override; virtual QString token_present() const override; }; // 组合语法实体解析 =================================================================================================== /** * @brief 对应语法表达式解析规则 */ class LIBSYNTAX_EXPORT ExpressionRule : public lib_syntax::BaseRule, public std::enable_shared_from_this { public: typedef QList> TokenSeqs; ExpressionRule(const QString& rule_name, int expr_mark); virtual std::shared_ptr reloadRule(std::function filter, 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; // BaseRule interface public: virtual QList> children() const override; virtual std::tuple> match(std::shared_ptr remains_head) const override; virtual std::tuple, std::shared_ptr> parse(std::shared_ptr rt_inst, std::shared_ptr head) const override; virtual QString token_present() const override; private: std::function filter_proc; std::shared_ptr child_store; QString name_store; int mark_store; }; /** * 语法元素解析规则. */ template class ElementRule : public ExpressionRule { public: ElementRule(const QString& rule_name, int expr_mark) :ExpressionRule(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()); } }; class MismatchException : public SyntaxException { private: std::shared_ptr target; public: MismatchException(std::shared_ptr inst); virtual ~MismatchException() = default; virtual std::shared_ptr targetToken() const; }; class InputTerminal : public SyntaxException { public: InputTerminal(); }; } // namespace lib_syntax