QtNovelUI/libParse/lex_foundation.h

163 lines
4.2 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#pragma once
#include <QFileInfo>
#include <QList>
#include <QString>
#include <QTextStream>
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<TokenDef *> sequence, const QFileInfo &target);
/**
* @brief 通过文件内容构建Token数据源
* @param sequence 词法解析器定义
* @param target 指定文件info
* @param content 指定文件的内容文本
*/
TokenReader(QList<TokenDef *> 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<TokenDef *> analysis_sequences;
QList<Token *> tokens_buffer;
/**
* \brief 获取Token序列集合移交所有权
* \param source 获取一列内容包含的
* \return
*/
QList<Token *> get_tokens_of_line(const QFileInfo &associate, QTextStream &lines_source);
/**
* \brief 分析单个单词的类型产生Token结果实例移交所有权
* \param 传入的词语文本
* \returns 解析结果无法处理则返回null
*/
Token *get_token(const WordBase &word);
};
} // namespace Lex