From: nobu.nakada@... Date: 2002-06-23T15:19:14+09:00 Subject: [ruby-dev:17551] Re: __END__ in literal なかだです。 At Sat, 22 Jun 2002 11:31:37 +0900, Tanaka Akira wrote: > > > いろいろ考えたらやっぱまずいよなあ、と思いました。 > > > どういう風にするのがよいかなあ。 > > 迷っているようなので、私の好みを押しつけるべく意見を表明しておくと、む > ろん、私は __END__ は式を受け付ける文脈での行頭でしか認識しないのが好 > みです。つまり、here document を "" に合わせるのではなく、"" を here > document に合わせるわけです。__END__ を受け付ける文脈を =begin を受け > 付ける文脈と同じにすると表現してもいいかもしれません。 どっちかに揃ってれば私としては文句はないのですが、こちらのほう がよさそうな気がして来ました。少なくとも、できていたものができ なくなるより、エラーになっていたものが通るようになるほうが問題 が起きにくいでしょう。 > > [ruby-dev:17530]のパッチを当てると、こう書けます。ちとかっこ悪 > > いですが。 > > やっぱ必然的にこうなりますよねぇ。#{} の外を here document で参照でき > るという。 余談ですが、パーザの違いを調べる方法。 p (("#{<<-':old ||'}" if false) || :old || :new) Index: parse.y =================================================================== RCS file: /cvs/ruby/src/ruby/parse.y,v retrieving revision 1.188 diff -u -2 -p -r1.188 parse.y --- parse.y 18 Jun 2002 15:53:57 -0000 1.188 +++ parse.y 23 Jun 2002 05:47:04 -0000 @@ -2308,10 +2308,4 @@ nextc() lex_pbeg = lex_p = RSTRING(v)->ptr; lex_pend = lex_p + RSTRING(v)->len; - if (strncmp(lex_pbeg, "__END__", 7) == 0 && - (RSTRING(v)->len == 7 || lex_pbeg[7] == '\n' || lex_pbeg[7] == '\r')) { - ruby__end__seen = 1; - lex_lastline = 0; - return -1; - } lex_lastline = v; } @@ -3956,4 +3950,14 @@ yylex() break; + case '_': + if (lex_p == lex_pbeg + 1 && strncmp(lex_pbeg, "__END__", 7) == 0 && + (lex_pend == lex_pbeg + 7 || lex_pbeg[7] == '\n' || lex_pbeg[7] == '\r')) { + ruby__end__seen = 1; + lex_lastline = 0; + return -1; + } + newtok(); + break; + default: if (!is_identchar(c) || ISDIGIT(c)) { -- --- 僕の前にBugはない。 --- 僕の後ろにBugはできる。 中田 伸悦