TR1ちょっとやってみた@regex

自宅にもVC++9Express入れちゃった。
無料でVC++が使えるなんていい時代になったもんだよなぁ。


↓のは、簡易な、変数宣言の構文かどうかを調べるプログラム。
全然完全なモノじゃないのであしからず。

#include 
#include

using namespace std;

bool MatchVarDeclaration(const string& s)
{
tr1::smatch result;
if (tr1::regex_match(s, result,
tr1::regex("^(static\\s*|\\s*)(const\\s|\\s*)(\\w[\\w\\d\\s:]*)\\s+(\\w[\\w\\d]*);"))
)
{
std::string static_ = result.str(1);
std::string const_ = result.str(2);
std::string type_ = result.str(3);
std::string name_ = result.str(4);

cout << "static=" << static_ << endl;
cout << "const=" << const_ << endl;
cout << "type=" << type_ << endl;
cout << "name=" << name_ << endl;

return true;
}
return false;
}

int main()
{
MatchVarDeclaration("static const unsigned int var_name;");

cout << "--------" << endl;

MatchVarDeclaration("int var_name;");

return 0;
}

static=static
const=const
type=unsigned int
name=var_name

              • -

static=
const=
type=int
name=var_name

正規表現perlとかで使う構文が使えるみたい。
ただ、C++の文字列で書くんで、
「\」を書くには「\\」と書かねばならずちょっと冗長。
確か、C++0xが全部実装されれば、D言語のウィズウィグ文字列みたい
なのが実装されて解決するんですよね。違ったっけ。


後、"(static\\s*|\\s*)"とかの部分で、後ろを空にして"(static|)\\s*"
とかにするとエラーで落ちる。perlだとだいじょぶだったんだけどな。


しかしregex使えると構文解析がヒジョーに楽になってよろしいね!
パーサーとかを文字列処理を理由にperlとかで作らなくても良くなりそうだ。