コードを分析し、シェーダーごとに処理する必要がある入力と出力を動的に決定できるようにする GLSL シェーダー コード用のプロセッサを作成しようとしています。
これを実現するために、正規表現を使用してシェーダー コードを解析してから、OpenGL 経由でコンパイルすることにしました。
正規表現が期待どおりに機能していることを確認するために、いくつかのテスト コードを作成しました。
コード:
#include <iostream>
#include <string>
#include <regex>
using namespace std;
int main()
{
string strInput = " in vec3 i_vPosition; ";
smatch match;
// Will appear in regex as:
// \bin\s+[a-zA-Z0-9]+\s+[a-zA-Z0-9_]+\s*(\[[0-9]+\])?\s*;
regex rgx("\\bin\\s+[a-zA-Z0-9]+\\s+[a-zA-Z0-9_]+\\s*(\\[[0-9]+\\])?\\s*;");
bool bMatchFound = regex_search(strInput, match, rgx);
cout << "Match found: " << bMatchFound << endl;
for (int i = 0; i < match.size(); ++i)
{
cout << "match " << i << " (" << match[i] << ") ";
cout << "at position " << match.position(i) << std::endl;
}
}
唯一の問題は、上記のコードが 1 つではなく 2 つの結果を生成することです。結果の1つは空ですが。
出力:
Match found: 1
match 0 (in vec3 i_vPosition;) at position 6
match 1 () at position 34
最終的には、ファイル全体を入力として提供するときに複数の結果を生成したいのですが、一貫した方法で結果を処理できるように、ある程度の一貫性を確保したいと考えています。
1つしか期待していないのに、なぜ複数の結果が得られるのかについてのアイデアはありますか?