あおきです。

  In mail "[ruby-list:20326] Re: RD with method index (again)"
    Toshiro Kuwabara <toshirok / yb3.so-net.ne.jp> wrote:

> Toshです。

> >という場合は 6 - 1 = 5 (2 が正解)になりません?
> 
> 今のところ"=end ... =begin"をまたいでブロックを繋げることができません。
> こういうブロックが繋がってしまうのはわかりづらいだろうと思ったので、
> "=end ... =begin"はWHITELINEとみなされる、ことにしてます。

> だから、この例の問題は起こらないはずです。

そうだったんですか。知らなかった。

と、これだけではゴミなので、ぼくが修正した部分のパッチをつけます。
役には立たないと思いますけど。
-------------------------------------------------------------------
あおきみねろう

diff -urN rdtool-0.5.7/rd/rdblockparser.ry diff.rdtool/rd/rdblockparser.ry --- rdtool-0.5.7/rd/rdblockparser.ry Wed Dec 29 19:13:09 1999 +++ diff.rdtool/rd/rdblockparser.ry Thu Jan 20 15:20:08 2000 @@ -128,7 +128,7 @@ ---- inner def initialize - @inline_parser = RDInlineParser.new() + @inline_parser = RDInlineParser.new( self ) end def parse(src) @@ -137,13 +137,14 @@ @src.unshift("\n") @src.push("\n") @src.push(false) + @i = 0 # @yydebug = true do_parse end def next_token currentIndent = @indent_stack.join("") - case line = @src[0] + case line = @src[ @i ] when false if @indent_stack.pop return [:DEDENT, ':DEDENT'] @@ -154,18 +155,17 @@ # if @indent_stack.pop # return [:DEDENT, ':DEDENT'] # else -# @src.shift +# @i += 1 # return [:BLANKLINE, ':BLANKLINE'] # end when /^\s*$/ - @src.shift + @i += 1 return [:WHITELINE, ':WHITELINE'] when /^(=+|\++)\s*/ if @indent_stack.pop return [:DEDENT, ':DEDENT'] else - @src.shift - @src.unshift($') + @src[ @i ] = $' mark = $1 return [:HEADLINEMARK, Headline.mark_to_level(mark)] end @@ -173,8 +173,7 @@ if @indent_stack.pop return [:DEDENT, ':DEDENT'] else - @src.shift - @src.unshift($') + @src[ @i ] = $' return [:INCLUDEMARK, ':INCLUDEMARK'] end when /^#{currentIndent}(\s+)/ @@ -182,33 +181,30 @@ return [:INDENT, ':INDENT'] when /^#{currentIndent}\*/ if @in_verbatim - @src.shift + @i += 1 return [:STRINGLINE, line] else - @src.shift - @src.unshift(currentIndent + "\s" + $') + @src[ @i ] = currentIndent + "\s" + $' return [:ITEMLISTMARK, "*"] end when /^#{currentIndent}(\(\d+\))/ if @in_verbatim - @src.shift + @i += 1 return [:STRINGLINE, line] else - @src.shift - @src.unshift(currentIndent + "\s" * $1.size + $') + @src[ @i ] = currentIndent + "\s" * $1.size + $' return [:ENUMLISTMARK, $1] end when /^#{currentIndent}:/ if @in_verbatim - @src.shift + @i += 1 return [:STRINGLINE, line] else - @src.shift - @src.unshift(currentIndent + "\s" + $') + @src[ @i ] = currentIndent + "\s" + $' return [:DESCLISTMARK, ':'] end when /^#{currentIndent}/ - @src.shift + @i += 1 return [:STRINGLINE, line] else @indent_stack.pop @@ -216,7 +212,12 @@ end end +def line_index + @i +end + private + def cut_off(src) ret = [] line = src.shift @@ -234,6 +235,16 @@ end ret end + +def on_error( et, ev, _values ) + raise ParseError, <<S + +RD syntax error: line #{@i}: +#{@src[@i].chomp} + +S +end + ---- prepare require "rd/rdinlineparser.tab.rb" diff -urN rdtool-0.5.7/rd/rdinlineparser.ry diff.rdtool/rd/rdinlineparser.ry --- rdtool-0.5.7/rd/rdinlineparser.ry Wed Dec 29 19:13:10 1999 +++ diff.rdtool/rd/rdinlineparser.ry Thu Jan 20 15:23:31 2000 @@ -180,6 +180,20 @@ [@token_queue.shift, @value_queue.shift] end +def on_error( et, ev, _values ) + raise ParseError, <<S + +RD syntax error: line #{@blockp.line_index - @token_queue.size}: +... #{(ev||'') + @value_queue.join('')} + ^ + +S +end + +def initialize( bp ) + @blockp = bp +end + ---- prepare =begin = rdinlineparser.ry