@@ -1246,9 +1246,29 @@ class parser {
1246
1246
1247
1247
fn parse_matchers( ) -> ~[ matcher] {
1248
1248
let name_idx = @mut 0 u;
1249
- ret self . parse_seq( token:: LBRACE , token:: RBRACE ,
1250
- common:: seq_sep_none( ) ,
1251
- |p| p. parse_matcher( name_idx) ) . node;
1249
+ ret self . parse_matcher_subseq( name_idx, token:: LBRACE , token:: RBRACE ) ;
1250
+ }
1251
+
1252
+
1253
+ // This goofy function is necessary to correctly match parens in matchers.
1254
+ // Otherwise, `$( ( )` would be a valid matcher, and `$( () )` would be
1255
+ // invalid. It's similar to common::parse_seq.
1256
+ fn parse_matcher_subseq( name_idx: @mut uint, bra: token:: token,
1257
+ ket: token:: token) -> ~[ matcher] {
1258
+ let mut ret_val = ~[ ] ;
1259
+ let mut lparens = 0 u;
1260
+
1261
+ self . expect( bra) ;
1262
+
1263
+ while self . token != ket || lparens > 0 u {
1264
+ if self . token == token:: LPAREN { lparens += 1 u; }
1265
+ if self . token == token:: RPAREN { lparens -= 1 u; }
1266
+ vec:: push( ret_val, self . parse_matcher( name_idx) ) ;
1267
+ }
1268
+
1269
+ self . bump( ) ;
1270
+
1271
+ ret ret_val;
1252
1272
}
1253
1273
1254
1274
fn parse_matcher( name_idx: @mut uint) -> matcher {
@@ -1257,9 +1277,8 @@ class parser {
1257
1277
let m = if self . token == token:: DOLLAR {
1258
1278
self . bump( ) ;
1259
1279
if self . token == token:: LPAREN {
1260
- let ms = ( self . parse_seq( token:: LPAREN , token:: RPAREN ,
1261
- common:: seq_sep_none( ) ,
1262
- |p| p. parse_matcher( name_idx) ) . node) ;
1280
+ let ms = self . parse_matcher_subseq( name_idx, token:: LPAREN ,
1281
+ token:: RPAREN ) ;
1263
1282
if ms. len( ) == 0 u {
1264
1283
self . fatal( "repetition body must be nonempty" ) ;
1265
1284
}
0 commit comments