テンプレートのみを使用して、教育目的である種のパーサー ライブラリを実装しようとして、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>>;
型のみを使用し、コンストラクタ引数を使用せずに Factor の前方宣言を行うにはどうすればよいですか? その可能性はありますか?、注: 空の構造体「Self」を使用して再帰にタグを付けています。
テンプレートの定義へのリンク: