From: Masaya Tarui Date: 2011-06-12T09:18:46+09:00 Subject: [ruby-dev:43762] [Ruby 1.9 - Bug #4544] Ripperで「:"a \n b \n c"」を正常にパースできない Issue #4544 has been updated by Masaya Tarui. ripperのコードを読んでみましたが通常のparse.cとの何が違うか理解するのが難しいですね。 このチケットの原因になってる 、yylex でdelayed_tokenをdispatchするコード(parse.y:7855)の直後のreturnを r24557([Bug #1071])で削除していますが、 ripper_dispatch_delayed_token(parser, t); ripper_dispatch_scan_event(parser, t); と実行される可能性があるのは違和感を感じます。 そもそもこのif文に入るのはどういう場合を想定していたんでしょう? patchをhere document部分のripperコードを参考に書いてみましたが、 想定がわからないのでyylexの部分は触ってません。 自信はないのでレビューしてもらえませんでしょうか?(中田さん?) diff --git a/parse.y b/parse.y index 06f96ce..31bdc6f 100644 --- a/parse.y +++ b/parse.y @@ -5984,6 +5984,21 @@ parser_parse_string(struct parser_params *parser, NODE *quote) tokfix(); set_yylval_str(STR_NEW3(tok(), toklen(), enc, func)); + +#ifdef RIPPER + if (!NIL_P(parser->delayed)){ + if(lex_p - parser->tokp > 0 ){ + rb_str_append(parser->delayed, + STR_NEW3(parser->tokp, + lex_p - parser->tokp, + enc, + func)); + } + ripper_dispatch_delayed_token(parser, tSTRING_CONTENT); + parser->tokp = lex_p; + } +#endif + return tSTRING_CONTENT; } diff --git a/test/ripper/test_scanner_events.rb b/test/ripper/test_scanner_events.rb index 25e4b13..3c62f52 100644 --- a/test/ripper/test_scanner_events.rb +++ b/test/ripper/test_scanner_events.rb @@ -67,8 +67,7 @@ class TestRipper::ScannerEvents < Test::Unit::TestCase [[3, 0], :on_heredoc_end, "EOS"]], Ripper.lex("<