作者: Bruce.
日時: 2005/11/14(22:30)
Bruce.です。

Kazuhiro NISHIYAMA さんは書きました (2005/11/14 17:29):

>>>>Mon, 14 Nov 2005 00:09:33 +0900 の刻に
>>>>kbk@...("Bruce.") 氏曰く
>>
>>要は/gフラグつきで繰り返しマッチングしているときに、マッチが
>>失敗しても\Gなんかで参照する位置情報をリセットしないということです。
>>
>>perlfaqによれば、lexerなんかを記述するのに便利だとか。
> 
> 
> 用途から考えるとstrscanで代用できそうな気がします。

ふむ。たとえば↓みたいのはどう記述するのでしょうか?

-- ここから --
perlfaq6より

    while (<>) {
      chomp;
      PARSER: {
           m/ \G( \d+\b    )/gcx   && do { print "number: $1\n";  redo; };
           m/ \G( \w+      )/gcx   && do { print "word:   $1\n";  redo; };
           m/ \G( \s+      )/gcx   && do { print "space:  $1\n";  redo; };
           m/ \G( [^\w\d]+ )/gcx   && do { print "other:  $1\n";  redo; };
      }
    }

各行で、PARSERループは最初に語境界が後続する数字の並びのマッチを試みま
す。このマッチは最後のマッチ残した位置 (最初のマッチの時には文字列の先
頭)から始まる必要があります。 m/ \G( \d+\b)/gcxはcフラグを使っているの
で、文字列がその正規表現にマッチしなかったときに、perlはpos()をリセット
することなしに同じ位置で異なるパターンにより次のマッチを試みます。

-- ここまで --

まあTokenizerを書くのに必ずしも上記のやり方をする必要は
ないわけですけど。

-- 
木村浩一
  I thought what I'd do was, I'd pretend I was one of those deaf-mutes.
  mail kbk@...
	web  www.kt.rim.or.jp/~kbk/index.html#zakkicho
	     homepage3.nifty.com/farstar/