- 106 名前:デフォルトの名無しさん mailto:sage [2008/07/19(土) 15:01:55 .net]
- C++で正規表現エンジン?らしきものをやってみました
10行ですが、これ以上は厳しい・・・ #include <iostream> struct a{a*b;char*c,*d;int e,f,g;};struct{int h(a*i,char*j,char*&k){a l={i,k,0, 99,99,1};return(*k-')'&&*k-'|'?(m(0,0,k),*k=='*'||*k=='+'&&++l.f||(l.f=1,*k== '?')?(l.g=*++k-'?')||++k:(l.e=0),l.d=k,i=&l,0):!(j&&(k=i->c,i->b)))||n(i,j,k);} int n(a*i,char*j,char*&k){a l=*i,o=l;return j?l.e<l.f--?m(&l,j,o.c):l.f<0?h(l.b ,j,o.d):l.g&&m(&l,j,o.c)||h(l.b,j,o.d)||!l.g&&m(&l,j,o.c):h(0,0,k);}int m(a*i, char*j,char*&k){int p=*k++;if(p=='('||(p=j&&(p=='$'?!*j:((p-'.'?p==*j:*j)&&++j) )&&n(i,j,k),0))while(!((p=h(i,j,k))&&j||*k++-'|'));return p;}}q;int main(int r, char**s){return 2<r&&q.h(0,s[2],s[1]=(char*)(std::string("(.*?")+s[1]+")"). c_str())&&std::cerr<<"ktkr.\n";} コマンドラインの引数に”正規表現”と”マッチ対象の文字列”をこの順番で与えて実行すると マッチした場合だけ”ktkr”と出力します。使えるメタ文字: . $ ? ?? * *? + +? ( | ) ^はグローバル変数を使わないと実装出来なそうだったので却下しました・・・
|

|