WsParser_VS/libSyntax/tokens_impl.h

185 lines
5.3 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 {
template<typename ExprT>
using TokenProcs = void(*)(std::shared_ptr<ExprT> expr, std::shared_ptr<const lib_token::IToken> t);
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
*/
template<typename ExprT, TokenProcs<ExprT> proc>
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);
proc(expr_inst, shared_from_this());
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
*/
template<typename NExpr> class ExprBeginToken : public IActionToken {
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) { }
std::shared_ptr<ast_basic::IExprInstance> parentExpr(){
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-11 14:32:10 +00:00
throw new lib_token::TokenException("不应该直接访问ExprBeginToken");
2025-02-07 15:26:20 +00:00
}
uint64_t position() const override {
2025-02-11 14:32:10 +00:00
throw new lib_token::TokenException("不应该直接访问ExprBeginToken");
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-11 14:32:10 +00:00
throw new lib_token::TokenException("不应该直接访问ExprBeginToken");
2025-02-07 15:26:20 +00:00
}
int column() const override {
2025-02-11 14:32:10 +00:00
throw new lib_token::TokenException("不应该直接访问ExprBeginToken");
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
*/
template<typename ExprT> class ExprEndToken : public IActionToken {
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)
: _prev_token(prev), _self_start(start){ }
2025-02-11 14:32:10 +00:00
// 通过 IActionToken 继承
2025-02-07 15:26:20 +00:00
QString file() const override {
2025-02-11 14:32:10 +00:00
throw new lib_token::TokenException("不应该直接访问ExprEndToken");
2025-02-07 15:26:20 +00:00
}
uint64_t position() const override {
2025-02-11 14:32:10 +00:00
throw new lib_token::TokenException("不应该直接访问ExprEndToken");
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-11 14:32:10 +00:00
throw new lib_token::TokenException("不应该直接访问ExprEndToken");
2025-02-07 15:26:20 +00:00
}
int column() const override {
2025-02-11 14:32:10 +00:00
throw new lib_token::TokenException("不应该直接访问ExprEndToken");
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();
}
};
}