TK-BLOG: QMail3 Ver.2.9.6用メニューの日本語化で、Pocket PC版でメニューを日本語化するためのmenus.xmlを公開してくださっています。ありがとうございます。
VGAだとPocket PCでも使い甲斐がありそうですね。
こんなことを書いた舌の根も乾かないうちに、正規表現周りをさらにいじってしまいました^^;。
まずは簡単にできそうな、貪欲でない数量子(*?, +?, ??, {m,n}?)を。これはNFAのステートを処理するときに、ε遷移の方を優先させてマッチするほうをバックトラック用のスタックに突っ込んでおけば良さそうです。というわけで実装しました。
貪欲でない方をやったからには強欲な数量子(*+, ++, ?+, {m,n}+)もやりたいところ。こっちはマッチしたときにε遷移をバックトラック用のスタックに積まないようにすれば良さそうです。ただし、グループに適用された場合((x)*+とか)にはその部分だけは独立した正規表現として処理する必要がありそうです。ただし、キャプチャした情報は共有する必要があります。というわけで、実装。
(x)*+が独立した正規表現だとすると、(?>(x)*)と同じということになるので、これも自動的に実装されることになりました。
(?>x)は肯定先読みの(?=(x))\1と同じということで、実装はほぼ同じで次のマッチを始める位置だけが異なるだけなのでこれも実装。肯定先読みができれば否定先読みもできるのでこれも実装しました。
ここまでやったら後読みもやりたくなるのが人情です。現在のマッチ位置の後ろ側にマッチさせる必要がある程度で、やり方はほぼ先読みと一緒です。Perlのようにマッチする文字数は固定ということにするとその分だけ戻ってマッチさせればいいので楽なのですが、それもなんだかいまいちなので文字数は可変でも良い事にして、後ろ向きにシフトさせながらマッチするようにしました。
というわけで、主だったものはほとんど入ってしまいました。