This commit is contained in:
codeboss 2025-02-12 10:13:35 +08:00
parent 805169bad1
commit 4c1e698b14
4 changed files with 17 additions and 19 deletions

View File

@ -178,7 +178,7 @@ namespace lib_syntax {
/** /**
* @brief token匹配 * @brief token匹配
*/ */
template<typename ELEM, lib_token::TokenProcs<ELEM> XProc = nullptr> template<typename ELEM, lib_token::TokenProc<ELEM> XProc = nullptr>
requires std::derived_from<ELEM, ast_basic::IExprInstance> requires std::derived_from<ELEM, ast_basic::IExprInstance>
class TokenMatch : public IBasicRule, public std::enable_shared_from_this<TokenMatch<ELEM, XProc>> { class TokenMatch : public IBasicRule, public std::enable_shared_from_this<TokenMatch<ELEM, XProc>> {
private: private:

View File

@ -253,7 +253,7 @@ class MM : public lib_syntax::IBasicRule {
#include "syntax_templets.h" #include "syntax_templets.h"
std::shared_ptr<const ExprRule> NovalSyntax::getSyntaxTree() { std::shared_ptr<const ExprRule> NovalSyntax::getSyntaxTree() {
lib_composit::TypeList<MM, MM> vv; lib_composit::__types_list<MM, MM> vv;
return std::make_shared<DocumentSyntax>(); return std::make_shared<DocumentSyntax>();
} }

View File

@ -4,9 +4,9 @@
#include <concepts> #include <concepts>
namespace lib_composit { namespace lib_composit {
template<typename... TYPES> class TypeList; template<typename... TYPES> class __types_list;
template<> class TypeList<> { template<> class __types_list<> {
public: public:
static QList<std::shared_ptr<const lib_syntax::IBasicRule>> getRules() { static QList<std::shared_ptr<const lib_syntax::IBasicRule>> getRules() {
return QList<std::shared_ptr<const lib_syntax::IBasicRule>>(); return QList<std::shared_ptr<const lib_syntax::IBasicRule>>();
@ -15,25 +15,25 @@ namespace lib_composit {
template<typename T, typename... Rets> template<typename T, typename... Rets>
requires std::derived_from<T, lib_syntax::IBasicRule> requires std::derived_from<T, lib_syntax::IBasicRule>
class TypeList<T, Rets...> : public TypeList<Rets...> { class __types_list<T, Rets...> : public __types_list<Rets...> {
public: public:
static QList<std::shared_ptr<const lib_syntax::IBasicRule>> getRules() { static QList<std::shared_ptr<const lib_syntax::IBasicRule>> getRules() {
auto list = TypeList<Rets...>::getRules(); auto list = __types_list<Rets...>::getRules();
list.prepend(std::make_shared<const T>()); list.prepend(std::make_shared<const T>());
return list; return list;
} }
}; };
template<typename... TYPES> template<typename... TYPES>
class AnyR : public lib_syntax::Any, public TypeList<TYPES...> { class AnyR : public lib_syntax::Any, public __types_list<TYPES...> {
public: public:
AnyR() : Any(TypeList<TYPES...>::getRules()){ } AnyR() : Any(__types_list<TYPES...>::getRules()){ }
}; };
template<typename... TYPES> template<typename... TYPES>
class SeqsR : public lib_syntax::Seqs, public TypeList<TYPES...> { class SeqsR : public lib_syntax::Seqs, public __types_list<TYPES...> {
public: public:
SeqsR() : Seqs(TypeList<TYPES...>::getRules()){ } SeqsR() : Seqs(__types_list<TYPES...>::getRules()){ }
}; };
template<typename TYPE, int min, int max> template<typename TYPE, int min, int max>
@ -42,7 +42,7 @@ namespace lib_composit {
ReptR() : Rept(std::make_shared<TYPE>(), min, max){ } ReptR() : Rept(std::make_shared<TYPE>(), min, max){ }
}; };
template<typename E, typename T, lib_token::TokenProcs<E> xproc = nullptr> template<typename E, typename T, lib_token::TokenProc<E> xproc = nullptr>
requires std::derived_from<E, ast_basic::IExprInstance> && std::derived_from<T, lib_token::ITokenProcess> requires std::derived_from<E, ast_basic::IExprInstance> && std::derived_from<T, lib_token::ITokenProcess>
class TokenR : public lib_syntax::TokenMatch<E, xproc> { class TokenR : public lib_syntax::TokenMatch<E, xproc> {
public: public:

View File

@ -5,8 +5,8 @@
namespace lib_token { namespace lib_token {
template<typename ExprT> template<typename ExprT> requires std::derived_from<ExprT, ast_basic::IExprInstance>
using TokenProcs = void(*)(std::shared_ptr<ExprT> expr, std::shared_ptr<const lib_token::IToken> t); using TokenProc = void(*)(std::shared_ptr<ExprT> expr, std::shared_ptr<const lib_token::IToken> t);
// 基础token实现 =================================================== // 基础token实现 ===================================================
@ -48,7 +48,7 @@ namespace lib_token {
/** /**
* @brief Token * @brief Token
*/ */
template<typename ExprT, TokenProcs<ExprT> proc> template<typename ExprT, TokenProc<ExprT> p> requires std::derived_from<ExprT, ast_basic::IExprInstance>
class ActionToken : public IActionToken { class ActionToken : public IActionToken {
private: private:
std::shared_ptr<const IToken> _bind_content; std::shared_ptr<const IToken> _bind_content;
@ -60,7 +60,7 @@ namespace lib_token {
virtual std::shared_ptr<ast_basic::IExprInstance> makeSure(std::shared_ptr<ast_basic::IExprInstance> expr) { virtual std::shared_ptr<ast_basic::IExprInstance> makeSure(std::shared_ptr<ast_basic::IExprInstance> expr) {
auto expr_inst = std::dynamic_pointer_cast<ExprT>(expr); auto expr_inst = std::dynamic_pointer_cast<ExprT>(expr);
proc(expr_inst, shared_from_this()); p(expr_inst, shared_from_this());
return expr; return expr;
} }
@ -91,8 +91,7 @@ namespace lib_token {
/** /**
* @brief token * @brief token
*/ */
template<typename NExpr> template<typename NExpr> requires std::derived_from<NExpr, ast_basic::IExprInstance>
requires std::derived_from<NExpr, ast_basic::IExprInstance>
class ExprBeginToken : public IActionToken { class ExprBeginToken : public IActionToken {
private: private:
std::shared_ptr<const IActionToken> _prev_token = nullptr; std::shared_ptr<const IActionToken> _prev_token = nullptr;
@ -149,8 +148,7 @@ namespace lib_token {
/** /**
* @brief token * @brief token
*/ */
template<typename ExprT> template<typename ExprT> requires std::derived_from<ExprT, ast_basic::IExprInstance>
requires std::derived_from<ExprT, ast_basic::IExprInstance>
class ExprEndToken : public IActionToken { class ExprEndToken : public IActionToken {
private: private:
std::shared_ptr<const IActionToken> _prev_token = nullptr; std::shared_ptr<const IActionToken> _prev_token = nullptr;