Tanaka Akiraさんの<hvopu1hxfyd.fsf / coulee.a02.aist.go.jp>から
> パターン中で、同じ部分パターンを複数記述しなければならない時に、最初の
> ひとつだけを記述して、後の部分は最初のを参照するような機能を入れられな
> いでしょうか?
> 
> 仮に参照を行なう構文を (?*n) とし、n 番目の group (shy group を含む)を
> 参照するとすると、/(?:a+)(?*1)/ が /(?:a+)(?:a+)/ と等価になるというよ
> うなものです。
> # 後方参照とは異なり、マッチした文字列ではなく、パターンそのものが入り
> # ます。
>
> ただし、内部的に複製は行なわないで部分パターンを共有するというのが前提
> です。

サイズが問題だから共有するということは、
元のパターンだけでなくて、生成されたバイトコードも共有するということですよね。

共有された部分の実行を、関数呼び出しのように実行するために、
スタックと命令コードのを新規追加すれば可能ではないかと思います。
(呼び出しではない直接実行の場合も、呼び出しのように実行しなければいけない
ので、速度的には不利と思いますが。実用に適さないほど遅くなるかどうかは不明。)

> # なお、番号ではなく、group に名前が付けられて、名前で参照できるという
> # ほうが望ましいです。

今は、()にしか番号を振っていませんので、名前で参照する方法だけにしたほうが
良いと思います。
名前定義グループと名前参照の二個分、ノードの種類を増やしてやればできるような
気がします。

私が拡張を行うとすれば、Rubyに取り込まれて実用に耐えることが確認できた後に
なると思います。
面倒そうなので、私以外の人に拡張してもらってもいいですけど。
(正規表現の拡張なので、まつもとさんに確認が必要でしょうが。)
--
小迫@ソフネック   渋谷区恵比寿1-15-1