けいじゅ@日本ラショナルソフトウェアです.

In [ruby-list :12350 ] the message: "[ruby-list:12350] Re: [REQ]
rlex.rb ", on Feb/24 22:16(JST) YANAGAWA Kazuhisa writes:

>> 柳川さんのrlex.rbですが, リクエストがあります.
>おお,なんかの役に立ってるんでしょうか.

# まだ秘密ですが, 例の本に使用例を紹介しようかとちょっと考えていま
# す. でも, どうなるか分からないのであまり期待しないで下さいね(^^;;;

まだ, ちょっと使ってみただけですが, ある意味lexとかとちがってやってい
ることが見えるので安心ですね(^^;;; 

# それに実行効率も問題ないし.

>> 1. unget(str)
>> 一度切りだした文字列をungetするメソッドです. 

>Scanner のインスタンス変数 @__line__ に対してマッチを行っているわけで,
>`@__line__[0, 0] = str' というのをアクションに書いておけば ungets を実
>現できます.何だったら変形した後に後ろに付け足す事だってできます.
># できてもあんまり嬉しくないと思います (^^;

(^^;;;

>あっても困らないし,付け足してみます.

ありがとうございます(__;;;

># でもスキャナの作りからして,改行をまたいだパターンマッチや ungets は
># 保証できなかったりはします.

ですね. でも, この割りきりがあるから簡単になっている(コストの問題もな
い)んですから, いいんじゃないですか?

>> # 時々使いたくなるのですが, 邪道ですかね??
>どうでしょうね.良くわからないです.

知らないうちにこの件で盛り上がっているみたいですネ(^^;;;

># fold.rb を書いている時に「無制限の ungetc,ungets をゆるす IO」なん
># ていうねたは考えたんですけど.先読みしなくて済むから楽.読みすぎたら
># 戻せばいい.

ですね. irbで使っているrubyのscannerも無限に戻せますし, 実際に戻すこと
もあります(^^;;;

>> 2. $1,...
>> そのときに, 一つ目の括弧なのに$2てするのはちょっとカッコ悪いと思うんで
>> す.
>「`$&' があるじゃん」っていうことで,`(?:)' に書き直して
> `matched = $&' になるようにしてみました.多分これだけでいいんじゃない
>かと思います.

おぉ. 全然気がつかなかった(^^;;;

>`# patterns' っていうコメントがあるあたり(80 行目近辺)の
(中略)
>に書き換えてみてください.

了解.

>> あと, これはリクエストではないんですが, 大域ジャンプに例外を使っていま
>> すね? これって, catch/throwを使うのが正しい道だと思うですが...
>
>何か深い理由があったような気もしますが,今となってはなぜだかわからない.
(中略)
># でもよっぽど必要に迫られない限りは変えないんじゃないか,とも思います (^^;

まあ, 実装のことですから私がとやかく言うことでないでからね.

># GOTO や RETURN は private になってないから外からスキャナの状態を書き
># 換えられるな,とか,変な事ばかりすぐ気が付いたり.

それができると, rubyのscanにも仕えそう(^^;;;


__
................................石塚 圭樹@日本ラショナルソフトェア...
----------------------------------->> e-mail: keiju / rational.com <<---