[#20227] dyna_vars problem? — Tanaka Akira <akr@...17n.org>

しばらく前から、稀に Ruby が core を吐くという問題を追いかけているので

15 messages 2003/05/19
[#20234] Re: dyna_vars problem? — matz@... (Yukihiro Matsumoto) 2003/05/19

まつもと ゆきひろです

[#20236] Re: dyna_vars problem? — Tanaka Akira <akr@...17n.org> 2003/05/19

In article <1053363181.529491.30320.nullmailer@picachu.netlab.jp>,

[ruby-dev:20212] Re: /()*\1/ =~ ""

From: kkosako@...
Date: 2003-05-19 07:08:08 UTC
List: ruby-dev #20212
> -----Original Message-----
> From: Tanaka Akira [mailto:akr@m17n.org]
> >   空にしかならない場合は、特別に置き換えをしています。
> >   /()*/ ==> /()?/
> >
> >   一般的に、空になることもある繰り返しは、一回の繰り返し毎に
> >   空になったかどうかチェックして、空の場合には繰り返しを終了
> >   させます。
> 
> よくわかんないです。
> 
> 「一回の繰り返し毎に空になったかどうかチェックして、空の場合には繰り返
> しを終了させます」というのは、私には、繰り返しの最中に中身が空にマッチ
> したらそれでもう繰り返さないというように聞こえるのですが、
> 
> % ./ruby -rpp -e 'pp /a(?:()|(b))*c\1/.match("abc")'
> #<MatchData "abc" "" "b">
> 
> というような場合には、() にも (b) にもマッチしています。つまり、中身が
> () にマッチしたあと、さらに繰り返して (b) にマッチしているように思いま
> す。とすると、私の理解は間違っているわけで、上記の終了させますっていう
> のはどいう意味なんでしょう?

説明が不正確でした。
繰り返しを終了するのではなくて、繰り返しを中断して、
繰り返しの後の部分に処理が移動します。
そこで失敗するとバックトラックして、もしも繰り返しの中に他の選択肢が残ってい
れば
それを実行します。

上記の例だと、
() => 繰り返し中断 => 失敗 => (b) => () => 繰り返し中断 => 成功
となります。

--
小迫@出向中
 

In This Thread

Prev Next