#pragma once #include #include #include #include namespace Lex { class Token; /** * @brief 此法解析过程中出现的异常 */ class LexException : std::exception { public: explicit LexException(const QString &msg); virtual QString message(); private: QString msg_store; // exception interface public: virtual const char *what() const override; }; /** * \brief 定义了一个文本词语 */ class WordBase { public: virtual ~WordBase() = default; /** * \brief 获取Token包含内容 * \return 内容 */ virtual QString content() const = 0; /** * \brief 获取Token绑定的文档路径 * \return 路径 */ virtual QString filePath() const = 0; /** * \brief 本Token源代码行定义 * \return 行号 */ virtual int row() const = 0; /** * \brief 本Token源代码列定义 * \return 列号 */ virtual int column() const = 0; }; /** * 词法解析基准定义 */ class TokenDef { public: virtual ~TokenDef() = default; /** * \brief 获取Token类型 * \return */ virtual QString typeName() = 0; /** * \brief 基准定义单元的正则表达式定义 * \return */ virtual QString regexp() = 0; /** * \brief 对指定的文字段落进行解析,生成Token实例并移交实例所有权 * @param word 文字段落 * \return 获取结果,如果失败则返回nullptr */ virtual Token *analysis(const WordBase &word) = 0; }; /** * 词法分析结果Token. */ class Token : public WordBase { public: /** * @brief 获取此Token关联的(生成源)解析单元 * @return */ virtual TokenDef *def() const = 0; /** * @brief 解析完成后剩余的文字段落 * @return */ virtual WordBase *remains() const = 0; }; /** * \brief Token读取数据源定义类型 */ class TokensReader { public: /** * @brief 构建Token数据源 * @param file * @param sequence */ TokensReader(QList sequence); virtual ~TokensReader() = default; /** * \brief 获取此文件的所有Tokens,转移所有权 * \return */ QList getTokensOfDocument(const QFileInfo &file); /** * @brief 获取指定缓冲区内的文本代表的所有Tokens,转移所有权 * @param buff 缓冲区 * @param file 提供文件符号 * @return */ QList getTokensOfContents(const QByteArray &buff, const QFileInfo &file); private: QList analysis_sequences; /** * \brief 获取Token序列集合,移交所有权 * \param source 获取一列内容包含的 * \return */ QList get_tokens_of_line(const QFileInfo &associate, const QString &line, int row); /** * \brief 分析单个单词的类型,产生Token结果实例,移交所有权 * \param 传入的词语文本 * \returns 解析结果,无法处理则返回null */ Token *get_token(const WordBase &word); }; } // namespace Lex