#pragma once #include #include #include #include namespace Lex { class Token; /** * @brief 此法解析过程中出现的异常 */ class WsBaseException : std::exception { public: explicit WsBaseException(const QString &msg); virtual QString message() const; 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() const = 0; /** * \brief 基准定义单元的正则表达式定义 * \return */ virtual QString regexp() const = 0; /** * \brief 对指定的文字段落进行解析,生成Token实例并移交实例所有权 * @param word 文字段落 * \return 获取结果,如果失败则返回nullptr */ virtual Token *analysis(const WordBase &word) = 0; }; /** * 词法分析结果Token. */ class Token : public WordBase { public: virtual ~Token() = default; /** * @brief 获取此Token关联的(生成源)解析单元 * @return */ virtual TokenDef *def() const = 0; /** * @brief 解析完成后剩余的文字段落 * @return */ virtual WordBase *remains() const = 0; }; /** * \brief Token读取数据源定义类型 */ class TokenReader { public: /** * @brief 拖过文件构建Token数据源 * @param sequence 词法解析器定义 * @param target 指定文件info */ TokenReader(QList sequence, const QFileInfo &target); /** * @brief 通过文件内容构建Token数据源 * @param sequence 词法解析器定义 * @param target 指定文件info * @param content 指定文件的内容文本 */ TokenReader(QList sequence, const QFileInfo &target, const QString &content); virtual ~TokenReader(); /** * @brief 提取下一个Token,交付控制权 * @return 返回Token*实例 */ Token *read(); /** * @brief 删除指定索引的token实例 * @param index */ void tokenRemove(uint index); /** * @brief 当前的Token进度下,预读指定数量的Token * @param count 指定预读数量 * @return 预读的Token数量列表 */ Token *tokenPeak(uint index); private: int line_number; QFileInfo target_info; QFile *bin_source; QString content_stack; QTextStream *line_source; QList analysis_sequences; QList tokens_buffer; /** * \brief 获取Token序列集合,移交所有权 * \param source 获取一列内容包含的 * \return */ QList get_tokens_of_line(const QFileInfo &associate, QTextStream &lines_source); /** * \brief 分析单个单词的类型,产生Token结果实例,移交所有权 * \param 传入的词语文本 * \returns 解析结果,无法处理则返回null */ Token *get_token(const WordBase &word); }; } // namespace Lex