struct RRegexp {
struct RBasic basic;
struct re_pattern_buffer *ptr;
long len;
char *str;
};
Regexp の実体。struct re_pattern_buffer *ptr が正規表現のパターンを
コンパイルしたもので、char *str はコンパイル前のパターン。ソースが
わざわざとってあるのは、$KCODE の変化にあわせて再コンパイルする時に
使うため。そのほか inspect、== などでも使われている。
これから M17N が進めばこの文字列もエンコードを保持したりする必要が あるわけで、たぶん String を持つようになっていくのではないだろうか。
正規表現の動作はインタプリタに近いものがある。ソースコードがあり、 それをコンパイルしたものがあり、インタプリタはそれをたどって実行 する。正規表現がひとつの「言語」であると言われるのはそういうことだ。
実際には、「ソースコード」は RRegexp.str であり、「オブジェクトコード」 は RRegexp.ptr であり、「コンパイラ」は re_compile_pattern()、 「インタプリタ」が re_match() である。他に大きな関数に re_search() が あるが、これは re_match() を下位に使うユーティリティみたいなもので、 本質的な中核ではない。ソースコードとなる正規表現がどういうものか、 というのはもうよくわかっていると思うので、以下そのほか三点について 順番に見ていく。