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

In [ruby-list :12691 ] the message: "[ruby-list:12691] Re: [REQ]
rlex.rb ", on Mar/09 21:59(JST) YANAGAWA Kazuhisa writes:

>まあそうですねぇ.....空読みする事に根拠があったわけでも無し,素直に例
>外をあげるようにしましょうか.

やった\(^^/

>    class ScanError < Exception; end
>として,
>
>    raise ScanError, "string \"#{@__line__}\" doesn't match with any
>                      pattern in mode \"#{__@mode__}\"."
>
>ぐらい言っとくとデバッグには便利かな.

おお. これだけあるとかなり嬉しいです(^^;;;

>行番号も数えてあるといいかもしれないけど,それはめんどう臭そうだ.

行番号についてですが, rlexとかraccでは, __FILE__/__LINE__とかに代入で
きると便利ですよね. そうすると, エラーのあったオリジナルファイルの行番
号がわかる. >> 松本氏いかが?

>    >  ruby -r irb/xmp.rb
>    xmp <<EOX
>    str = "foo\nbar\nbaz"
>    str =~  /.+$/; str = $'
>    p $&
>    str =~ /.+$/; str = $'
>    p $&
>    EOX
>    str = "foo
>    bar
>    baz"
>        ==>"foo\nbar\nbaz"
>    str =~  /.+$/; str = $'
>        ==>"\nbar\nbaz"
>    p $&
>    "foo"
>        ==>nil
>    str =~ /.+$/; str = $'
>        ==>"\nbaz"
>    p $&
>    "bar"
>        ==>nil

# 何か難しいxmpの使い方ですね(^^;;;

>`.' によるマッチは `\n' を乗り越えて進んでいくような.

そうか. どれだとよいんですね.

str = "foo\nbar\nbaz\n"
    ==>"foo\nbar\nbaz\n"
str =~ /.*$/; str = $'
    ==>"\nbar\nbaz\n"
str =~ /.*$/; str = $'
    ==>"\nbar\nbaz\n"

こういう風にすると駄目なんですね....

>`\n' を数えて行を数えるっていうのはけっこう楽だし.だいいち中間の `\n' 
>は chomp では消えないし.....ということで,やっぱり chomp の必要性が見
>えてきません.

これはいえていますね. それに, 行末の\nをなくすと行末に\nがあったかどう
かもわからなくなるし...

chompしたくなるのは, きっと特殊な例なんでしょうね.

ところで, もう1つきになる動作を発見しました(^^;;;

Scanner.newに文字列を渡した時の動作ってちゃんと確認しています?

無限ループに陥るんですけど...

プログラムは以下のようになっていますよね.

  def scan
    while true
      begin
	@__line__ = @__inf__.gets if @__line__.empty? and not @__inf__.nil?
	return nil if @__line__.nil?
	while not @__line__.empty?
	  send @__mode__
	end
      rescue ScanReturn
	return $!.val
      end
    end
  end

@__line__ == "" だと, 無限ループにはいるような....

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