143 lines
3.6 KiB
C
143 lines
3.6 KiB
C
|
|
#pragma once
|
|||
|
|
|
|||
|
|
#include <QFileInfo>
|
|||
|
|
#include <QList>
|
|||
|
|
#include <QString>
|
|||
|
|
#include <QTextStream>
|
|||
|
|
|
|||
|
|
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<TokenDef *> sequence);
|
|||
|
|
virtual ~TokensReader() = default;
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* \brief 获取此文件的所有Tokens,转移所有权
|
|||
|
|
* \return
|
|||
|
|
*/
|
|||
|
|
QList<Token *> getTokensOfDocument(const QFileInfo &file);
|
|||
|
|
/**
|
|||
|
|
* @brief 获取指定缓冲区内的文本代表的所有Tokens,转移所有权
|
|||
|
|
* @param buff 缓冲区
|
|||
|
|
* @param file 提供文件符号
|
|||
|
|
* @return
|
|||
|
|
*/
|
|||
|
|
QList<Token *> getTokensOfContents(const QByteArray &buff, const QFileInfo &file);
|
|||
|
|
|
|||
|
|
private:
|
|||
|
|
QList<TokenDef *> analysis_sequences;
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* \brief 获取Token序列集合,移交所有权
|
|||
|
|
* \param source 获取一列内容包含的
|
|||
|
|
* \return
|
|||
|
|
*/
|
|||
|
|
QList<Token *> 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
|