08/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”と出力します。使えるメタ文字: . $ ? ?? * *? + +? ( | )
^はグローバル変数を使わないと実装出来なそうだったので却下しました・・・