Skip to content

Commit 41c1991

Browse files
committed
* parse.y (string_content, parser_yylex): count brace nesting to
dispatch embexpr_end. [ruby-core:43775][Bug ruby#6211] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@35269 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
1 parent 6b18a8c commit 41c1991

File tree

4 files changed

+23
-8
lines changed

4 files changed

+23
-8
lines changed

ChangeLog

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,8 @@
1+
Mon Apr 9 15:16:01 2012 Nobuyoshi Nakada <nobu@ruby-lang.org>
2+
3+
* parse.y (string_content, parser_yylex): count brace nesting to
4+
dispatch embexpr_end. [ruby-core:43775][Bug #6211]
5+
16
Mon Apr 9 13:06:58 2012 Marc-Andre Lafortune <ruby-core@marc-andre.ca>
27

38
* hash.c (rb_hash_set_default_proc): Accept nil, patch by Run Paint

ext/ripper/eventids2.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -236,6 +236,7 @@ static const struct token_assoc {
236236
{tSTRING_BEG, &ripper_id_tstring_beg},
237237
{tSTRING_CONTENT, &ripper_id_tstring_content},
238238
{tSTRING_DBEG, &ripper_id_embexpr_beg},
239+
{tSTRING_DEND, &ripper_id_embexpr_end},
239240
{tSTRING_DVAR, &ripper_id_embvar},
240241
{tSTRING_END, &ripper_id_tstring_end},
241242
{tSYMBEG, &ripper_id_symbeg},

parse.y

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -213,6 +213,7 @@ struct parser_params {
213213
int parser_lpar_beg;
214214
int parser_in_single;
215215
int parser_in_def;
216+
int parser_brace_nest;
216217
int parser_compile_for_eval;
217218
VALUE parser_cur_mid;
218219
int parser_in_defined;
@@ -287,6 +288,7 @@ static int parser_yyerror(struct parser_params*, const char*);
287288
#define class_nest (parser->parser_class_nest)
288289
#define paren_nest (parser->parser_paren_nest)
289290
#define lpar_beg (parser->parser_lpar_beg)
291+
#define brace_nest (parser->parser_brace_nest)
290292
#define in_single (parser->parser_in_single)
291293
#define in_def (parser->parser_in_def)
292294
#define compile_for_eval (parser->parser_compile_for_eval)
@@ -760,7 +762,7 @@ static void token_info_pop(struct parser_params*, const char *token);
760762
%token tAMPER /* & */
761763
%token tLAMBDA /* -> */
762764
%token tSYMBEG tSTRING_BEG tXSTRING_BEG tREGEXP_BEG tWORDS_BEG tQWORDS_BEG
763-
%token tSTRING_DBEG tSTRING_DVAR tSTRING_END tLAMBEG
765+
%token tSTRING_DBEG tSTRING_DEND tSTRING_DVAR tSTRING_END tLAMBEG
764766

765767
/*
766768
* precedence table
@@ -4219,16 +4221,21 @@ string_content : tSTRING_CONTENT
42194221
lex_strterm = 0;
42204222
lex_state = EXPR_BEG;
42214223
}
4222-
compstmt '}'
4224+
{
4225+
$<num>$ = brace_nest;
4226+
brace_nest = 0;
4227+
}
4228+
compstmt tSTRING_DEND
42234229
{
42244230
cond_stack = $<val>1;
42254231
cmdarg_stack = $<val>2;
42264232
lex_strterm = $<node>3;
4233+
brace_nest = $<num>4;
42274234
/*%%%*/
4228-
if ($4) $4->flags &= ~NODE_FL_NEWLINE;
4229-
$$ = new_evstr($4);
4235+
if ($5) $5->flags &= ~NODE_FL_NEWLINE;
4236+
$$ = new_evstr($5);
42304237
/*%
4231-
$$ = dispatch1(string_embexpr, $4);
4238+
$$ = dispatch1(string_embexpr, $5);
42324239
%*/
42334240
}
42344241
;
@@ -7517,6 +7524,9 @@ parser_yylex(struct parser_params *parser)
75177524
lex_state = EXPR_ENDFN;
75187525
else
75197526
lex_state = EXPR_ENDARG;
7527+
if (c == '}') {
7528+
if (!brace_nest--) c = tSTRING_DEND;
7529+
}
75207530
return c;
75217531

75227532
case ':':
@@ -7650,6 +7660,7 @@ parser_yylex(struct parser_params *parser)
76507660
return c;
76517661

76527662
case '{':
7663+
++brace_nest;
76537664
if (lpar_beg && lpar_beg == paren_nest) {
76547665
lex_state = EXPR_BEG;
76557666
lpar_beg = 0;
@@ -10390,6 +10401,7 @@ parser_initialize(struct parser_params *parser)
1039010401
parser->parser_class_nest = 0;
1039110402
parser->parser_paren_nest = 0;
1039210403
parser->parser_lpar_beg = 0;
10404+
parser->parser_brace_nest = 0;
1039310405
parser->parser_in_single = 0;
1039410406
parser->parser_in_def = 0;
1039510407
parser->parser_in_defined = 0;

test/ripper/test_scanner_events.rb

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -210,8 +210,6 @@ def test_embexpr_beg
210210
end
211211

212212
def test_embexpr_end
213-
=begin
214-
# currently detected as "rbrace"
215213
assert_equal [],
216214
scan('embexpr_end', '')
217215
assert_equal ['}'],
@@ -222,7 +220,6 @@ def test_embexpr_end
222220
scan('embexpr_end', '%Q[#{expr}]')
223221
assert_equal ['}'],
224222
scan('embexpr_end', "m(<<EOS)\n\#{expr}\nEOS")
225-
=end
226223
end
227224

228225
def test_embvar

0 commit comments

Comments
 (0)