From: nobu.nakada@... Date: 2002-03-17T17:54:18+09:00 Subject: [ruby-dev:16432] Re: [ruby-list:34478] Re: #{} 内の文字コード なかだです。 At Sun, 17 Mar 2002 17:49:52 +0900, Nobuyoshi-Nakada wrote: > At Sun, 17 Mar 2002 17:12:57 +0900, > Takaishi Hayato wrote: > > #!ruby -Ks > > > > a = "#{"表"}" > > > > が、compile errorになります。 > > > > a = "#{'a' + "表"}" > > > > にするとparse errorになって、 > > > > 'a' + "・ > > ^ > > と表示されるところを見ると、SJISの'表'の2byte目が'\'と同じな > > ために、 > > > > a = "#{'a' + " \"}" > > > > のように解釈されている。つまり、#{}内では文字コードが考慮さ > > れないようです。 > > これは仕様でしょうか? > > バグでしょうねぇ。こんなのもparse errorになります。SJISでは'評' > の2バイト目が']'と同じだからですが。 > > #!ruby -Ks > > p %[評価] てなわけで、パッチです。 あと、mbclen(c)-1だけtokadd()する関数でも作ったほうがいいんじゃ ないかとか、str_extend()のbraceは実は定数なんじゃないかとかいう 気もしたり。 Index: parse.y =================================================================== RCS file: /cvs/ruby/src/ruby/parse.y,v retrieving revision 1.159 diff -u -2 -p -r1.159 parse.y --- parse.y 2002/03/12 09:28:48 1.159 +++ parse.y 2002/03/17 08:44:04 @@ -2609,4 +2609,8 @@ parse_string(func, term, paren) return 0; } + if (paren) { + if (c == paren) nest++; + if (c == term && nest-- == 0) break; + } if (ismbchar(c)) { int i, len = mbclen(c)-1; @@ -2636,8 +2640,4 @@ parse_string(func, term, paren) continue; } - if (paren) { - if (c == paren) nest++; - if (c == term && nest-- == 0) break; - } tokadd(c); } @@ -2683,4 +2683,8 @@ parse_qstring(term, paren) return 0; } + if (paren) { + if (c == paren) nest++; + if (c == term && nest-- == 0) break; + } if (ismbchar(c)) { int i, len = mbclen(c)-1; @@ -2710,8 +2714,4 @@ parse_qstring(term, paren) } } - if (paren) { - if (c == paren) nest++; - if (c == term && nest-- == 0) break; - } tokadd(c); } @@ -2744,4 +2744,8 @@ parse_quotedwords(term, paren) return 0; } + if (paren) { + if (c == paren) nest++; + if (c == term && nest-- == 0) break; + } if (ismbchar(c)) { int i, len = mbclen(c)-1; @@ -2783,8 +2787,4 @@ parse_quotedwords(term, paren) continue; } - if (paren) { - if (c == paren) nest++; - if (c == term && nest-- == 0) break; - } tokadd(c); } @@ -4108,4 +4108,12 @@ str_extend(list, term, paren) return list; } + else if (ismbchar(c)) { + int i, len = mbclen(c)-1; + + for (i = 0; i < len; i++) { + tokadd(c); + c = nextc(); + } + } case '\n': tokadd(c); -- --- 僕の前にBugはない。 --- 僕の後ろにBugはできる。 中田 伸悦