WsParser_VS/libSyntax/libtokens.h

126 lines
2.8 KiB
C++

#pragma once
#include "libsyntax_global.h"
#include <libwords.h>
namespace lib_token {
/**
* @brief 解析异常
*/
class LIBSYNTAX_EXPORT TokenException {
private:
QString msg_store;
public:
TokenException(const QString& message);
virtual QString message() const;
};
/**
* @brief token类型定义
*/
class ITokenDefine {
public:
/**
* @brief 整数类型标识.
*
* \return
*/
virtual int typeMark() const = 0;
/**
* @brief 解析机制关键定义
* @return
*/
virtual QString regex() const = 0;
};
/**
* @brief token解析结果
*/
class IToken : public lib_words::IWordBase {
public:
/**
* @brief token解析机制关联
* @return
*/
virtual std::shared_ptr<const ITokenDefine> defines() const = 0;
/**
* @brief 上一个Token
* @return
*/
virtual std::shared_ptr<const IToken> previousToken() const = 0;
};
/**
* @brief token解析机制定义
*/
class ITokenProcess : public ITokenDefine {
public:
/**
* @brief 解析机制名称
* @return
*/
virtual QString reviseWords() const = 0;
/**
* @brief 解析词语处理过程
* @param content 词语
* @return tuple<token/null,remains> 解析结果
*/
virtual std::tuple<std::shared_ptr<const IToken>, std::shared_ptr<const lib_words::IPrimitiveWord>>
analysis(std::shared_ptr<const lib_words::IPrimitiveWord> content) const = 0;
};
/**
* @brief 词法解析成果
*/
class TokenContent : public IToken {
private:
int row_n, col_n, doc_offset;
QString text_n, path_p;
std::shared_ptr<const ITokenDefine> type_def;
public:
/**
* @brief 词法解析内容
* @param r 行
* @param c 列
* @param pos 位置
* @param t 内容
* @param p path
* @param paramType 类型定义
*/
TokenContent(int r, int c, uint64_t pos, const QString& t, const QString& p, std::shared_ptr<const ITokenDefine> paramType);
// WordBase interface
public:
virtual QString file() const override;
virtual uint64_t position() const override;
virtual QString content() const override;
virtual int row() const override;
virtual int column() const override;
// Token interface
public:
virtual std::shared_ptr<const ITokenDefine> defines() const override;
virtual std::shared_ptr<const IToken> previousToken() const override;
};
class TokenChain : public IToken {
private:
std::shared_ptr<const IToken> _token_previous;
std::shared_ptr<const IToken> _token_content;
public:
TokenChain(std::shared_ptr<const IToken> content, std::shared_ptr<const IToken> prev);
// 通过 IToken 继承
QString file() const override;
uint64_t position() const override;
QString content() const override;
int row() const override;
int column() const override;
std::shared_ptr<const ITokenDefine> defines() const override;
std::shared_ptr<const IToken> previousToken() const override;
};
}