@@ -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 ;
0 commit comments