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/