#pragma once #include "libtoken_global.h" #include #include #include namespace lib_token { class TokenDefine; /** * @brief 源码词语实例 */ class WordBase { public: /** * @brief 源文件路径 * @return */ virtual QString file() const = 0; /** * @brief 词语内容 * @return */ virtual QString content() const = 0; /** * @brief 源码行号 * @return */ virtual int row() const = 0; /** * @brief 源码列号 * @return */ virtual int column() const = 0; }; /** * @brief token解析结果 */ class Token : public WordBase { public: /** * @brief token解析机制关联 * @return */ virtual std::shared_ptr define() const = 0; }; /** * @brief token解析机制定义 */ class TokenDefine { public: /** * @brief 解析机制名称 * @return */ virtual QString name() const = 0; /** * @brief 解析机制关键定义 * @return */ virtual QString regex() const = 0; /** * @brief 解析词语处理过程 * @param content 词语 * @return tuple 解析结果 */ virtual std::tuple, std::shared_ptr> analysis(std::shared_ptr content) const = 0; }; /** * @brief 解析异常 */ class LIBTOKEN_EXPORT TokenException { private: QString msg_store; public: TokenException(const QString& message); virtual QString message() const; }; /** * @brief 未解析原始词语 */ class LIBTOKEN_EXPORT WordPeaks : public WordBase { private: int row_n, col_n; QString text_n, path_p; public: WordPeaks(int r, int c, const QString& t, const QString& p); // WordBase interface public: virtual QString file() const override; virtual QString content() const override; virtual int row() const override; virtual int column() const override; }; /** * @brief 词法解析成果 */ class LIBTOKEN_EXPORT TokenInst : public Token { private: int row_n, col_n; QString text_n, path_p; std::shared_ptr type_def; public: TokenInst(int r, int c, const QString& t, const QString& p, std::shared_ptr type); // WordBase interface public: virtual QString file() const override; virtual QString content() const override; virtual int row() const override; virtual int column() const override; // Token interface public: virtual std::shared_ptr define() const override; }; /** * @brief 词法获取器 */ class LIBTOKEN_EXPORT TokenReader { private: QList> rules_store; QList> parse_line(int row, const QString& line_text, const QString& path) const; std::tuple, std::shared_ptr> parse_token(std::shared_ptr word) const; public: TokenReader(const QList> rulers); QList> extractFrom(const QString& path) const; }; } // namespace lib_token