163 lines
4.2 KiB
C++
163 lines
4.2 KiB
C++
#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
|