強力な正規表現#4
難しい言葉で言うと再帰。
正規表現の検索では、普通の検索と違ってたくさんの枝分かれが起こる。
その分かれた枝からさらに別の枝分かれが起こる。
全部の枝を検証して最長一致を求めるっていう事をやらせるために、
TRegExprは再帰っていう方法を使っている。
マッチしているかどうかを判断すべきメソッドは、枝分かれ前の現在の枝しか評価せず、
枝分かれの分岐点からは、それぞれの枝について自分と同じ仕事をするメソッドに託す。
それれぞれの枝がさらに枝分かれすれば、さらに同じ仕事をするメソッドを呼ぶ。
外注が外注するってのを繰り返しながら検索が続くのだが、発注元に内緒の外注になってて、
検索が終わった時点でようやく、最初に発注した人に結果のみを帰すことになるんだが、
1万回くらい外注の外注をやると、発注元に帰れなくなるらしい。
スタックがあふれているらしいが、いまどきスタックなんて言葉を聞くとは思わなかった。
ここがあふれるとかなり致命的なようで、
エラーが出るとか間違った検索をするとかのレベルではなく、アプリが無言で落ちる。
オーバーフローなんて生涯出会わない物と思っていたが、
正規表現だけは簡単にアプリ落としちゃうんだな。
再帰をやるから落ちるんであって、再帰をやめれば落ちないんだから、
再帰以外の方法で正規表現を実装すれば良いんだよな。
でも、枝分かれする物は再帰ってのはもう体で覚えちゃってて、
たとえばGrepとかだと、フォルダの中にフォルダがあるという構造だから、
あたしだって再帰という方法でこれを実装していて、再帰以外ではアイデアが浮かばない。
1万回もフォルダの中にフォルダを作る事はないから、たまたまGrepはうまくいっているし、
おそらく誰が書いてもGrepは再帰だろうよ。
枝が1万回も分かれる事なんて想定出来ないことの方が多いから、
たいがいの人は再帰で落ちるかも知れないとは疑うことなく使ってるんじゃなかろうか。
これを再帰以外でやるってのはもうやたら手間がかかりそうなんだが。
これ別にTRegExprに限った事じゃなくて、別の正規表現エンジンでも落ちる物があるようだ。
k2topからのアクセス急増中で話題のK2Editorも無言で落ちる。
これは確か外部DLLを使うタイプだったはずだから、
それとおなじ派生元のDLLを使うエディタも全滅ということだな。
萌ディタの日記によると、WZEditorもテキストのサイズが大きくなると落ちるってさ。
でも萌ディタは落ちないように作ったみたいだな。EmEditorも落ちない。
この辺が他人の作った物を使って手を抜いてる人種との大きな差だな。
再帰以外の書き方をあえてしているのか、+や*の時だけ特別な処理をしているのか。
やっぱり理解して自分で書いたライブラリじゃないとダメだなぁ。
さて、他人の作ったライブラリで動く真魚は落ちるわけだが、
.NETの正規表現で動くぎょえは同じ方法で落ちずにまともに動く。
なんかもう知力の限界だ。
かしこさのたねとか手にはいるなら狩りに行きたいよ。