けいじゅ@日本ラショナルソフトウェアです. 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 <<---