QtNovelUI/libParse/lex_foundation.h

143 lines
3.6 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 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