QtNovelUI/libParse/lex_foundation.h

163 lines
4.2 KiB
C
Raw Normal View History

2023-03-25 02:10:32 +00:00
#pragma once
#include <QFileInfo>
#include <QList>
#include <QString>
#include <QTextStream>
namespace Lex {
class Token;
/**
* @brief
*/
class WsBaseException : std::exception {
2023-03-25 02:10:32 +00:00
public:
explicit WsBaseException(const QString &msg);
2023-03-25 02:10:32 +00:00
virtual QString message() const;
2023-03-25 02:10:32 +00:00
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;
2023-03-25 02:10:32 +00:00
/**
* \brief
* \return
*/
virtual QString regexp() const = 0;
2023-03-25 02:10:32 +00:00
/**
* \brief Token实例并移交实例所有权
* @param word
* \return nullptr
*/
virtual Token *analysis(const WordBase &word) = 0;
};
/**
* Token.
*/
class Token : public WordBase {
public:
virtual ~Token() = default;
2023-03-25 02:10:32 +00:00
/**
* @brief Token关联的
* @return
*/
virtual TokenDef *def() const = 0;
/**
* @brief
* @return
*/
virtual WordBase *remains() const = 0;
};
/**
* \brief Token读取数据源定义类型
*/
class TokenReader {
2023-03-25 02:10:32 +00:00
public:
/**
* @brief Token数据源
* @param sequence
* @param target info
2023-03-25 02:10:32 +00:00
*/
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();
2023-03-25 02:10:32 +00:00
/**
* @brief Token
* @return Token*
*/
Token *read();
/**
* @brief token实例
* @param index
2023-03-25 02:10:32 +00:00
*/
void tokenRemove(uint index);
2023-03-25 02:10:32 +00:00
/**
* @brief Token进度下Token
* @param count
* @return Token数量列表
2023-03-25 02:10:32 +00:00
*/
Token *tokenPeak(uint index);
2023-03-25 02:10:32 +00:00
private:
int line_number;
QFileInfo target_info;
QFile *bin_source;
QString content_stack;
QTextStream *line_source;
2023-03-25 02:10:32 +00:00
QList<TokenDef *> analysis_sequences;
QList<Token *> tokens_buffer;
2023-03-25 02:10:32 +00:00
/**
* \brief Token序列集合
* \param source
* \return
*/
QList<Token *> get_tokens_of_line(const QFileInfo &associate, QTextStream &lines_source);
2023-03-25 02:10:32 +00:00
/**
* \brief Token结果实例
* \param
* \returns null
*/
Token *get_token(const WordBase &word);
};
} // namespace Lex