ruby-changes:23219
From: nobu <ko1@a...>
Date: Mon, 9 Apr 2012 15:16:21 +0900 (JST)
Subject: [ruby-changes:23219] nobu:r35269 (trunk): * parse.y (string_content, parser_yylex): count brace nesting to
nobu 2012-04-09 15:16:07 +0900 (Mon, 09 Apr 2012) New Revision: 35269 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=35269 Log: * parse.y (string_content, parser_yylex): count brace nesting to dispatch embexpr_end. [ruby-core:43775][Bug #6211] Modified files: trunk/ChangeLog trunk/ext/ripper/eventids2.c trunk/parse.y trunk/test/ripper/test_scanner_events.rb Index: ChangeLog =================================================================== --- ChangeLog (revision 35268) +++ ChangeLog (revision 35269) @@ -1,3 +1,8 @@ +Mon Apr 9 15:16:01 2012 Nobuyoshi Nakada <nobu@r...> + + * parse.y (string_content, parser_yylex): count brace nesting to + dispatch embexpr_end. [ruby-core:43775][Bug #6211] + Mon Apr 9 13:06:58 2012 Marc-Andre Lafortune <ruby-core@m...> * hash.c (rb_hash_set_default_proc): Accept nil, patch by Run Paint Index: parse.y =================================================================== --- parse.y (revision 35268) +++ parse.y (revision 35269) @@ -213,6 +213,7 @@ int parser_lpar_beg; int parser_in_single; int parser_in_def; + int parser_brace_nest; int parser_compile_for_eval; VALUE parser_cur_mid; int parser_in_defined; @@ -287,6 +288,7 @@ #define class_nest (parser->parser_class_nest) #define paren_nest (parser->parser_paren_nest) #define lpar_beg (parser->parser_lpar_beg) +#define brace_nest (parser->parser_brace_nest) #define in_single (parser->parser_in_single) #define in_def (parser->parser_in_def) #define compile_for_eval (parser->parser_compile_for_eval) @@ -760,7 +762,7 @@ %token tAMPER /* & */ %token tLAMBDA /* -> */ %token tSYMBEG tSTRING_BEG tXSTRING_BEG tREGEXP_BEG tWORDS_BEG tQWORDS_BEG -%token tSTRING_DBEG tSTRING_DVAR tSTRING_END tLAMBEG +%token tSTRING_DBEG tSTRING_DEND tSTRING_DVAR tSTRING_END tLAMBEG /* * precedence table @@ -4219,16 +4221,21 @@ lex_strterm = 0; lex_state = EXPR_BEG; } - compstmt '}' { + $<num>$ = brace_nest; + brace_nest = 0; + } + compstmt tSTRING_DEND + { cond_stack = $<val>1; cmdarg_stack = $<val>2; lex_strterm = $<node>3; + brace_nest = $<num>4; /*%%%*/ - if ($4) $4->flags &= ~NODE_FL_NEWLINE; - $$ = new_evstr($4); + if ($5) $5->flags &= ~NODE_FL_NEWLINE; + $$ = new_evstr($5); /*% - $$ = dispatch1(string_embexpr, $4); + $$ = dispatch1(string_embexpr, $5); %*/ } ; @@ -7517,6 +7524,9 @@ lex_state = EXPR_ENDFN; else lex_state = EXPR_ENDARG; + if (c == '}') { + if (!brace_nest--) c = tSTRING_DEND; + } return c; case ':': @@ -7650,6 +7660,7 @@ return c; case '{': + ++brace_nest; if (lpar_beg && lpar_beg == paren_nest) { lex_state = EXPR_BEG; lpar_beg = 0; @@ -10390,6 +10401,7 @@ parser->parser_class_nest = 0; parser->parser_paren_nest = 0; parser->parser_lpar_beg = 0; + parser->parser_brace_nest = 0; parser->parser_in_single = 0; parser->parser_in_def = 0; parser->parser_in_defined = 0; Index: ext/ripper/eventids2.c =================================================================== --- ext/ripper/eventids2.c (revision 35268) +++ ext/ripper/eventids2.c (revision 35269) @@ -236,6 +236,7 @@ {tSTRING_BEG, &ripper_id_tstring_beg}, {tSTRING_CONTENT, &ripper_id_tstring_content}, {tSTRING_DBEG, &ripper_id_embexpr_beg}, + {tSTRING_DEND, &ripper_id_embexpr_end}, {tSTRING_DVAR, &ripper_id_embvar}, {tSTRING_END, &ripper_id_tstring_end}, {tSYMBEG, &ripper_id_symbeg}, Index: test/ripper/test_scanner_events.rb =================================================================== --- test/ripper/test_scanner_events.rb (revision 35268) +++ test/ripper/test_scanner_events.rb (revision 35269) @@ -210,8 +210,6 @@ end def test_embexpr_end -=begin - # currently detected as "rbrace" assert_equal [], scan('embexpr_end', '') assert_equal ['}'], @@ -222,7 +220,6 @@ scan('embexpr_end', '%Q[#{expr}]') assert_equal ['}'], scan('embexpr_end', "m(<<EOS)\n\#{expr}\nEOS") -=end end def test_embvar -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/