In message <199903200402.NAA00595.keiju / bc.mbn.or.jp>
keiju / rational.com (石塚圭樹) writes:

> 大体そうです. でも,
> 
> s = Rlex.new
> s.def_action(:default, pattern1) {
>   action1
> }
> s.def_action(:default, pattern2) {
>   action2
> }
> 
> とか
>
> s = Rlex.new
> s.def_state(:default) {
>   s.def_action(pattern1) {
>     action1
>   }
>   s.def_action(pattern2) {
>     action2
>   }
> }
> 
> みたいなかんじがよいかと...

そういうのだったらごとけんさんの lax をつかう,とか(see [ruby-list:11175]).


> # 後者の実装は苦しいかな...
> # それに, 今のrlexと違い過ぎるという問題点も(^^;;;

そうですね.そういうのだと Hash でモードとルールとを保持して,each で
マッチをとるっていう風にすることになります.

    rule[@__mode__].each do
      |pat, act|
      if pat =~ @__line__
        @__line__ = $'
        act.call # マッチングデータでも引数で渡すことになるんだな
        break
      end
    end

メインループの中が,こんな感じ.しかもいちいち新しいクラスやメソッドを
作る必要が無いから,今よりずっと簡単な枠組にできる.


アクションが Proc にならざるをえないのと,それにともなってユーザ定義の
メソッドやインスタンス変数のあつかいがちょこっとめんどうくさくなること,
更には rlex を作った時にはすでに lax でそういうアプローチの物は作られ
ていた,ということで rlex は今のようになっています.


> >やるんだったら今の枠組も当然残しますけど.生成ってどれくらいの計算量に
> >なってるかな.あんだけ手抜きなら平気かな.
> 
> 大きさにもよるでしょうけど... いちいちファイルを生成する手間と比べると
> デバッグ効率は良いような...

デバッグの時には間違いなくそうですね.といっても rlex のはくスキャナは
あんまり複雑なことをしなければそうバグもでないと思うんですが.スキャナ
単独でデバッグできるし.

# rlex のバグはでるかもしれない.


実際やるとしたらあくまで仕様を文字列で与える,っていう方向に固執します.
その方がスキャナの保守は楽そうな気がする,

# こういう場合宣言的な記述が,その場だけで完全に閉じている方が扱いやす
# そうな気がする,っていう薄弱な根拠しかありません.単に字面が増えるの
# を嫌っているだけかもしれない.


平日は時間が無いし,休日は出かけてしまうのであんまり作業は進まなかった
り.まあ,出かけるのを止めればいいんですが (^^;

-- 
柳川和久 @ 東大阪市 . 大阪府                                 March 21, 1999
What can't be seen is what can't be there.