WsParser_VS/libSyntax/tokens_impl.h

193 lines
5.4 KiB
C
Raw Normal View History

2025-02-07 15:26:20 +00:00
#pragma once
#include "libtokens.h"
#include "ast_basic.h"
namespace lib_token {
2025-02-12 02:13:35 +00:00
template<typename ExprT> requires std::derived_from<ExprT, ast_basic::IExprInstance>
using TokenProc = void(*)(std::shared_ptr<ExprT> expr, std::shared_ptr<const lib_token::IToken> t);
2025-02-07 15:26:20 +00:00
2025-02-11 14:32:10 +00:00
// 基础token实现 ===================================================
2025-02-07 15:26:20 +00:00
/**
2025-02-11 14:32:10 +00:00
* @brief
2025-02-07 15:26:20 +00:00
*/
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:
/**
2025-02-11 14:32:10 +00:00
* @brief
* @param r
* @param c
* @param pos
* @param t
2025-02-07 15:26:20 +00:00
* @param p path
2025-02-11 14:32:10 +00:00
* @param paramType
2025-02-07 15:26:20 +00:00
*/
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;
};
/**
2025-02-11 14:32:10 +00:00
* @brief Token
2025-02-07 15:26:20 +00:00
*/
2025-02-12 02:13:35 +00:00
template<typename ExprT, TokenProc<ExprT> p> requires std::derived_from<ExprT, ast_basic::IExprInstance>
2025-02-07 15:26:20 +00:00
class ActionToken : public IActionToken {
private:
std::shared_ptr<const IToken> _bind_content;
std::shared_ptr<const IActionToken> _bind_previous;
public:
ActionToken(std::shared_ptr<const IToken> content, std::shared_ptr<const IActionToken> prev)
: _bind_content(content), _bind_previous(prev) { }
virtual std::shared_ptr<ast_basic::IExprInstance> makeSure(std::shared_ptr<ast_basic::IExprInstance> expr) {
auto expr_inst = std::dynamic_pointer_cast<ExprT>(expr);
2025-02-12 02:13:35 +00:00
p(expr_inst, shared_from_this());
2025-02-07 15:26:20 +00:00
return expr;
}
2025-02-11 14:32:10 +00:00
// 通过 IActionToken 继承
2025-02-07 15:26:20 +00:00
QString file() const override {
return _bind_content->file();
}
uint64_t position() const override {
return _bind_content->position();
}
QString content() const override {
return _bind_content->content();
}
int row() const override {
return _bind_content->row();
}
int column() const override {
return _bind_content->column();
}
std::shared_ptr<const ITokenDefine> defines() const override {
return _bind_content->defines();
}
std::shared_ptr<const IActionToken> prevToken() const override {
return this->_bind_previous;
}
};
/**
2025-02-11 14:32:10 +00:00
* @brief token
2025-02-07 15:26:20 +00:00
*/
2025-02-12 02:13:35 +00:00
template<typename NExpr> requires std::derived_from<NExpr, ast_basic::IExprInstance>
2025-02-11 15:36:30 +00:00
class ExprBeginToken : public IActionToken {
2025-02-07 15:26:20 +00:00
private:
std::shared_ptr<const IActionToken> _prev_token = nullptr;
std::shared_ptr<const lib_syntax::ExprRule> _self_rule = nullptr;
std::shared_ptr<ast_basic::IExprInstance> _parent_expr = nullptr;
std::shared_ptr<NExpr> _self_expr = nullptr;
public:
ExprBeginToken(std::shared_ptr<const lib_syntax::ExprRule> rule, std::shared_ptr<const IActionToken> prev)
:_prev_token(prev), _self_rule(rule) { }
2025-02-11 15:36:30 +00:00
std::shared_ptr<ast_basic::IExprInstance> parentExpr() {
2025-02-07 15:26:20 +00:00
return this->_parent_expr;
}
2025-02-11 14:32:10 +00:00
// 通过 IActionToken 继承
2025-02-07 15:26:20 +00:00
QString file() const override {
2025-02-12 13:50:45 +00:00
return this->prevToken()->file();
2025-02-07 15:26:20 +00:00
}
uint64_t position() const override {
2025-02-14 01:26:42 +00:00
if (!this->prevToken())
return 0;
2025-02-12 13:50:45 +00:00
return this->prevToken()->position();
2025-02-07 15:26:20 +00:00
}
QString content() const override {
2025-02-11 14:32:10 +00:00
throw new lib_token::TokenException("不应该直接访问ExprBeginToken");
2025-02-07 15:26:20 +00:00
}
int row() const override {
2025-02-14 01:26:42 +00:00
if (!this->prevToken())
return 0;
2025-02-12 13:50:45 +00:00
return this->prevToken()->row();
2025-02-07 15:26:20 +00:00
}
int column() const override {
2025-02-14 01:26:42 +00:00
if (!this->prevToken())
return 0;
2025-02-12 13:50:45 +00:00
return this->prevToken()->column();
2025-02-07 15:26:20 +00:00
}
std::shared_ptr<const ITokenDefine> defines() const override {
2025-02-08 05:40:36 +00:00
return nullptr;
2025-02-07 15:26:20 +00:00
}
std::shared_ptr<const IActionToken> prevToken() const override {
return _prev_token;
}
std::shared_ptr<ast_basic::IExprInstance> makeSure(std::shared_ptr<ast_basic::IExprInstance> expr) override {
this->_parent_expr = expr;
this->_self_expr = std::make_shared<NExpr>(_self_rule);
this->_parent_expr->addChild(this->_self_expr);
return this->_self_expr;
}
};
/**
2025-02-11 14:32:10 +00:00
* @brief token
2025-02-07 15:26:20 +00:00
*/
2025-02-12 02:13:35 +00:00
template<typename ExprT> requires std::derived_from<ExprT, ast_basic::IExprInstance>
2025-02-11 15:36:30 +00:00
class ExprEndToken : public IActionToken {
2025-02-07 15:26:20 +00:00
private:
std::shared_ptr<const IActionToken> _prev_token = nullptr;
std::shared_ptr<ExprBeginToken<ExprT>> _self_start = nullptr;
public:
ExprEndToken(std::shared_ptr<ExprBeginToken<ExprT>> start, std::shared_ptr<const IActionToken> prev)
2025-02-11 15:36:30 +00:00
: _prev_token(prev), _self_start(start) { }
2025-02-07 15:26:20 +00:00
2025-02-11 14:32:10 +00:00
// 通过 IActionToken 继承
2025-02-07 15:26:20 +00:00
QString file() const override {
2025-02-12 13:50:45 +00:00
return this->prevToken()->file();
2025-02-07 15:26:20 +00:00
}
uint64_t position() const override {
2025-02-12 13:50:45 +00:00
return this->prevToken()->position();
2025-02-07 15:26:20 +00:00
}
QString content() const override {
2025-02-11 14:32:10 +00:00
throw new lib_token::TokenException("不应该直接访问ExprEndToken");
2025-02-07 15:26:20 +00:00
}
int row() const override {
2025-02-12 13:50:45 +00:00
return this->prevToken()->row();
2025-02-07 15:26:20 +00:00
}
int column() const override {
2025-02-12 13:50:45 +00:00
return this->prevToken()->column();
2025-02-07 15:26:20 +00:00
}
std::shared_ptr<const ITokenDefine> defines() const override {
2025-02-08 05:40:36 +00:00
return nullptr;
2025-02-07 15:26:20 +00:00
}
std::shared_ptr<const IActionToken> prevToken() const override {
return _prev_token;
}
std::shared_ptr<ast_basic::IExprInstance> makeSure(std::shared_ptr<ast_basic::IExprInstance> expr) override {
return this->_self_start->parentExpr();
}
};
}