From: Koji Arai Date: 2002-09-21T17:46:21+09:00 Subject: [ruby-dev:18324] Re: broken string when unterminated "#{". 新井です。 In message "[ruby-dev:18183] Re: broken string when unterminated "#{"." on 05 Sep 2002 15:09:09 +0900, matz@ruby-lang.org (Yukihiro Matsumoto) wrote: > まつもと ゆきひろです > |ですが、1.6 latest では、 > | > |p "#{ "foo" }" > | > |=> -:1: warning: bad substitution in string > | -:1: parse error > | p "#{ "foo" }" > | ^ > | ruby 1.6.7 (2002-08-21) [i586-linux] > | > |っとエラーになります。これは、1.8 への移行を促す際に問題にな > |りますよね?少なくとも 1.6 latest は 1.6.7 リリース版の挙動 > |に戻す必要があるのではないでしょうか? > > そのとおりですね。1.6で変更した時点では1.7にも適用するつもり > でしたが、1.7のほうが変化してしまいました。戻します。 > > って、えーと差分を取り出さなきゃな.... どうやら、parse.y の 1.74.2.56 から 1.74.2.57 への変更によるもののようです。 | revision 1.74.2.57 | date: 2002/06/13 03:54:39; author: matz; state: Exp; lines: +14 -8 | * hash.c (rb_hash_s_create): use rb_hash_aset() instead of calling | st_insert() directly, to dup&freeze string keys. | | * parse.y (yylex): proper error message for "@@0". | | * parse.y (yylex): paren to parse_string() must be zero for | unparenthesized strings. | | * parse.y (str_extend): broken string when unterminated "#{". これで良いでしょうか?(ヒアドキュメントのとこをちゃんと追い かけてないのですが) p "#{ "foo" }" p "#{ \"foo\" }" p `#{ "echo foo" # foo }` => ruby 1.6.7 (2002-09-12) [i586-linux] "foo" "foo" "foo\n" Sat Sep 21 17:39:49 2002 Koji Arai * parse.y (here_document): apply reverse patch to back the 1.6.7 behavior. [ruby-dev:18170] * parse.y (yylex): ditto. Index: parse.y =================================================================== RCS file: /usr/local/cvsup/ruby/ruby/parse.y,v retrieving revision 1.74.2.65 diff -u -p -r1.74.2.65 parse.y --- parse.y 6 Sep 2002 23:41:43 -0000 1.74.2.65 +++ parse.y 21 Sep 2002 08:33:52 -0000 @@ -2858,7 +2858,7 @@ here_document(term, indent) } #endif retry: - switch (parse_string(term, '\n', 0)) { + switch (parse_string(term, '\n', '\n')) { case tSTRING: case tXSTRING: rb_str_cat2(yylval.val, "\n"); @@ -3128,7 +3128,7 @@ yylex() return '>'; case '"': - return parse_string(c,c,0); + return parse_string(c,c,c); case '`': if (lex_state == EXPR_FNAME) { lex_state = EXPR_END; @@ -3138,7 +3138,7 @@ yylex() lex_state = EXPR_ARG; return c; } - return parse_string(c,c,0); + return parse_string(c,c,c); case '\'': return parse_qstring(c,0); -- 新井康司 (Koji Arai)