Я занимаюсь шаблонным программированием на C ++, пытаясь реализовать какую-то библиотеку синтаксического анализатора для образовательных целей, используя только шаблоны.
Пример того, как предполагается использовать мою библиотеку:
std::stringstream ss { "identif1er 123123 hell0 world 3rror" };
// zM = zero or more , aO = any of
using Identifier = Matcher<Alpha, zM<AlphaNum>>;
using Number = Matcher<Digit, zM<Digit>>;
Matcher<aO<Identifier, Number>> numberOrIdentifier;
while(!ss.eof()) {
if(ss.peek() == ' ') ss.ignore(1);
if(numberLetters.s_match(ss)) {
std::cout << "Token: " << (*numberLetters.val) << std::endl;
} else {
std::cout << "Error\n";
}
}
это работает, но я столкнулся с проблемой, что иногда мне приходится определять пару типов, которые зависят от другого, и наоборот.
Я просто хочу знать, как я могу сделать, например, это:
using Expr = Matcher<..... Factor ....>
using Factor = Matcher<aO<Number, Expr>>;
Как я могу сделать предварительное объявление фактора, используя только типы и без аргументов конструктора? его возможно ?,
примечание: я использую пустую структуру «Self», чтобы пометить рекурсию.
Ссылка на определение шаблонов:
Задача ещё не решена.
Других решений пока нет …