2025-02-11 14:32:10 +00:00
|
|
|
#pragma once
|
|
|
|
|
|
|
|
#include "libsyntax.h"
|
|
|
|
#include <concepts>
|
|
|
|
|
|
|
|
namespace lib_composit {
|
2025-02-12 02:13:35 +00:00
|
|
|
template<typename... TYPES> class __types_list;
|
2025-02-11 14:32:10 +00:00
|
|
|
|
2025-02-12 02:13:35 +00:00
|
|
|
template<> class __types_list<> {
|
2025-02-11 14:32:10 +00:00
|
|
|
public:
|
|
|
|
static QList<std::shared_ptr<const lib_syntax::IBasicRule>> getRules() {
|
|
|
|
return QList<std::shared_ptr<const lib_syntax::IBasicRule>>();
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
template<typename T, typename... Rets>
|
|
|
|
requires std::derived_from<T, lib_syntax::IBasicRule>
|
2025-02-12 02:13:35 +00:00
|
|
|
class __types_list<T, Rets...> : public __types_list<Rets...> {
|
2025-02-11 14:32:10 +00:00
|
|
|
public:
|
|
|
|
static QList<std::shared_ptr<const lib_syntax::IBasicRule>> getRules() {
|
2025-02-12 02:13:35 +00:00
|
|
|
auto list = __types_list<Rets...>::getRules();
|
2025-02-11 14:32:10 +00:00
|
|
|
list.prepend(std::make_shared<const T>());
|
|
|
|
return list;
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
template<typename... TYPES>
|
2025-02-12 02:13:35 +00:00
|
|
|
class AnyR : public lib_syntax::Any, public __types_list<TYPES...> {
|
2025-02-11 14:32:10 +00:00
|
|
|
public:
|
2025-02-12 02:13:35 +00:00
|
|
|
AnyR() : Any(__types_list<TYPES...>::getRules()){ }
|
2025-02-11 14:32:10 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
template<typename... TYPES>
|
2025-02-12 02:13:35 +00:00
|
|
|
class SeqsR : public lib_syntax::Seqs, public __types_list<TYPES...> {
|
2025-02-11 14:32:10 +00:00
|
|
|
public:
|
2025-02-12 02:13:35 +00:00
|
|
|
SeqsR() : Seqs(__types_list<TYPES...>::getRules()){ }
|
2025-02-11 14:32:10 +00:00
|
|
|
};
|
|
|
|
|
2025-02-12 02:26:39 +00:00
|
|
|
template<typename TYPE, int min, int max> requires std::derived_from<TYPE, lib_syntax::IBasicRule>
|
2025-02-11 14:32:10 +00:00
|
|
|
class ReptR : public lib_syntax::Rept {
|
|
|
|
public:
|
|
|
|
ReptR() : Rept(std::make_shared<TYPE>(), min, max){ }
|
|
|
|
};
|
2025-02-12 02:26:39 +00:00
|
|
|
template<typename TYPE> class OptMulti : public ReptR<TYPE, 0, INT_MAX>{ };
|
|
|
|
template<typename TYPE> class Multi : public ReptR<TYPE, 1, INT_MAX>{ };
|
|
|
|
template<typename TYPE> class Opt : public ReptR<TYPE, 0, 1>{ };
|
2025-02-11 14:32:10 +00:00
|
|
|
|
2025-02-12 02:26:39 +00:00
|
|
|
|
|
|
|
template<typename E, typename T, lib_token::TokenProc<E> p = nullptr>
|
2025-02-11 14:32:10 +00:00
|
|
|
requires std::derived_from<E, ast_basic::IExprInstance> && std::derived_from<T, lib_token::ITokenProcess>
|
2025-02-12 02:26:39 +00:00
|
|
|
class TokenR : public lib_syntax::TokenMatch<E, p> {
|
2025-02-11 14:32:10 +00:00
|
|
|
public:
|
2025-02-12 02:26:39 +00:00
|
|
|
TokenR() : TokenMatch<E, p>(std::make_shared<T>()){ }
|
2025-02-11 14:32:10 +00:00
|
|
|
};
|
|
|
|
}
|