月別アーカイブ: 2013年7月

SkRegExp はまだ終わらない!

ただ今、SkRegExp version 3.0 を鋭意開発中。

version 3.0 でやろうとしていることは?

1.大文字小文字を区別しない比較を Unicode 標準に対応。

今までのバージョンは、大文字小文字を区別しない比較は UnicodeData.txt の UpperCase のデータを使っている。

つまり、大文字に変換して比較していた。

ところが、この方法には問題がある。

ヨーロッパの言語の中には、複数の大文字がひとつの小文字に対応したり、その逆だったりする。

UnicodeData.txt のデータではこういうのを取りこぼしてしまう。

こう言う用途には CaseFolding.txt を使えばいいのだそうだ。

変な(失礼!)対応をしてる文字も全部同じ文字に揃えてくれる変換テーブルだ。

この実装は終わっている。

2.Perl 5.14 互換の正規表現への対応

2つのメタ文字 N, o{} と拡張構文 (?^) 、それと修飾子 /a /aa /l /d /u の実装。

コレについてはずいぶん前に作ってあってテストも完了している。

なお、Perl 5.16 で導入された F はサポートしない。

F は E までを CaseFold するモノ。

version 3.0 は Unicode の CaseFolding に対応するので実は F をサポートするのは可能。

ただし、F をサポートして似たような機能の l u L U をサポートしないのは一貫性に欠ける。

l u L U をサポートしないと決めているので F もサポートするつもりはない。

3.UnicodeProp.pas の切り離し。

UnicodeProp.pas は今でも巨大なテーブルだが、CaseFolding 情報を入れるとさらに巨大化する。

これ、ASCII の範囲しか扱わないケースではムダである。

たとえば、MIME 解析には UnicodeProp.pas など一文字も必要ない。

だから、USE_UNICODE_PROPERTY とか言う条件定義を用意して、Unicdoe プロパティを無効にできるようにしたら?

少しはサイズが小さくなるかもしれない。

実はこれも何度かチャレンジしている。

導入は難しくなく、動作もするのだが、テストが面倒なのだ。

ただでさえ見通しが悪いテストプログラムを、新しい条件で書き直すのは正直やりたくない。

だから、アンドキュメンテッドな機能で良ければ追加したいと思う。

4.最適化の見直し

最適化の見直しに関するアイデアがいくつかある。

今ココの作業中。

ま、コレはキリがないんだけどね。

5.UFT-16 からの解放

SkRegExp の実装は UTF-16 べったりだ。

だが他のエンコーディングで使えたらもっと用途が増えるかも?

たとえば、TREStringBuffer と言う仮想クラスを作って、このクラスに文字比較、文字位置変更、UnicodeProperty、POSIX 文字クラス の照合を閉じ込めておくとか。

SkRegExpは正規表現エンジンだけで、実際の照合は TREStringBuffer を継承したクラスに任せるのはどうだろう。

また、エンコードによっては意味のない正規表現もある。

たとえば、Binary データで UnicodeProperty は不要だ。

SkRegExp が TREStringBuffer を継承したクラスに問い合わせをして使える機能を選択できるのがいいだろう。

実はコレに関してはまだひな形を書き始めた段階。

たぶん、version 3.0 での実装は難しいだろう。