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() を下位に使うユーティリティみたいなもので、 本質的な中核ではない。ソースコードとなる正規表現がどういうものか、 というのはもうよくわかっていると思うので、以下そのほか三点について 順番に見ていく。