@@ -76,13 +76,6 @@ DelStatement: ast::LocatedStatement = {
76
76
77
77
ExpressionStatement: ast::LocatedStatement = {
78
78
<loc:@L> <expr:TestOrStarExprList> <suffix:AssignSuffix*> => {
79
- // First build tuple from first item:
80
- let expr = if expr.len() > 1 {
81
- ast::Expression::Tuple { elements: expr }
82
- } else {
83
- expr.into_iter().next().unwrap()
84
- };
85
-
86
79
// Just an expression, no assignment:
87
80
if suffix.is_empty() {
88
81
ast::LocatedStatement {
@@ -106,12 +99,6 @@ ExpressionStatement: ast::LocatedStatement = {
106
99
}
107
100
},
108
101
<loc:@L> <expr:TestOrStarExprList> <op:AugAssign> <e2:TestList> => {
109
- let expr = if expr.len() > 1 {
110
- ast::Expression::Tuple { elements: expr }
111
- } else {
112
- expr.into_iter().next().unwrap()
113
- };
114
-
115
102
// TODO: this works in most cases:
116
103
let rhs = e2.into_iter().next().unwrap();
117
104
ast::LocatedStatement {
@@ -134,11 +121,19 @@ AssignSuffix: ast::Expression = {
134
121
"=" <e:YieldExpr> => e,
135
122
};
136
123
137
- TestOrStarExprList: Vec< ast::Expression> = {
138
- <e:TestOrStarExpr> <e2:("," TestOrStarExpr)*> => {
124
+ TestOrStarExprList: ast::Expression = {
125
+ <e:TestOrStarExpr> <e2:("," TestOrStarExpr)*> <comma:","?> => {
139
126
let mut res = vec![e];
140
127
res.extend(e2.into_iter().map(|x| x.1));
141
- res
128
+
129
+ // First build tuple from first item:
130
+ let expr = if (res.len() > 1) || comma.is_some() {
131
+ ast::Expression::Tuple { elements: res }
132
+ } else {
133
+ res.into_iter().next().unwrap()
134
+ };
135
+
136
+ expr
142
137
}
143
138
};
144
139
@@ -453,29 +448,8 @@ Parameters: ast::Parameters = {
453
448
// parameters are (String, None), kwargs are (String, Some(Test)) where Test is
454
449
// the default
455
450
TypedArgsList: ast::Parameters = {
456
- <param1:TypedParameterDef> <param2:("," TypedParameterDef)*> <args2:("," ParameterListStarArgs)?> => {
457
- // Combine first parameters:
458
- let mut args = vec![param1];
459
- args.extend(param2.into_iter().map(|x| x.1));
460
-
461
- let mut names = vec![];
462
- let mut default_elements = vec![];
463
-
464
- for (name, default) in args.into_iter() {
465
- names.push(name.clone());
466
- if let Some(default) = default {
467
- default_elements.push(default);
468
- } else {
469
- if default_elements.len() > 0 {
470
- // Once we have started with defaults, all remaining arguments must
471
- // have defaults
472
- panic!(
473
- "non-default argument follows default argument: {}",
474
- name
475
- );
476
- }
477
- }
478
- }
451
+ <param1:TypedParameters> <args2:("," ParameterListStarArgs)?> => {
452
+ let (names, default_elements) = param1;
479
453
480
454
// Now gather rest of parameters:
481
455
let (vararg, kwonlyargs, kw_defaults, kwarg) = match args2 {
@@ -492,35 +466,14 @@ TypedArgsList: ast::Parameters = {
492
466
kw_defaults: kw_defaults,
493
467
}
494
468
},
495
- <param1:TypedParameterDef> <param2:("," TypedParameterDef)*> <kw:("," "**" Identifier)> => {
496
- // Combine first parameters:
497
- let mut args = vec![param1];
498
- args.extend(param2.into_iter().map(|x| x.1));
499
-
500
- let mut names = vec![];
501
- let mut default_elements = vec![];
502
-
503
- for (name, default) in args.into_iter() {
504
- names.push(name.clone());
505
- if let Some(default) = default {
506
- default_elements.push(default);
507
- } else {
508
- if default_elements.len() > 0 {
509
- // Once we have started with defaults, all remaining arguments must
510
- // have defaults
511
- panic!(
512
- "non-default argument follows default argument: {}",
513
- name
514
- );
515
- }
516
- }
517
- }
469
+ <param1:TypedParameters> <kw:("," KwargParameter)> => {
470
+ let (names, default_elements) = param1;
518
471
519
472
// Now gather rest of parameters:
520
473
let vararg = None;
521
474
let kwonlyargs = vec![];
522
475
let kw_defaults = vec![];
523
- let kwarg = Some(kw.2 );
476
+ let kwarg = Some(kw.1 );
524
477
525
478
ast::Parameters {
526
479
args: names,
@@ -542,7 +495,7 @@ TypedArgsList: ast::Parameters = {
542
495
kw_defaults: kw_defaults,
543
496
}
544
497
},
545
- "**" <kw:Identifier > => {
498
+ <kw:KwargParameter > => {
546
499
ast::Parameters {
547
500
args: vec![],
548
501
kwonlyargs: vec![],
@@ -554,6 +507,37 @@ TypedArgsList: ast::Parameters = {
554
507
},
555
508
};
556
509
510
+ // Use inline here to make sure the "," is not creating an ambiguity.
511
+ #[inline]
512
+ TypedParameters: (Vec<String>, Vec<ast::Expression>) = {
513
+ <param1:TypedParameterDef> <param2:("," TypedParameterDef)*> => {
514
+ // Combine first parameters:
515
+ let mut args = vec![param1];
516
+ args.extend(param2.into_iter().map(|x| x.1));
517
+
518
+ let mut names = vec![];
519
+ let mut default_elements = vec![];
520
+
521
+ for (name, default) in args.into_iter() {
522
+ names.push(name.clone());
523
+ if let Some(default) = default {
524
+ default_elements.push(default);
525
+ } else {
526
+ if default_elements.len() > 0 {
527
+ // Once we have started with defaults, all remaining arguments must
528
+ // have defaults
529
+ panic!(
530
+ "non-default argument follows default argument: {}",
531
+ name
532
+ );
533
+ }
534
+ }
535
+ }
536
+
537
+ (names, default_elements)
538
+ }
539
+ };
540
+
557
541
TypedParameterDef: (String, Option<ast::Expression>) = {
558
542
<i:TypedParameter> => (i, None),
559
543
<i:TypedParameter> "=" <e:Test> => (i, Some(e)),
@@ -564,8 +548,8 @@ TypedParameter: String = {
564
548
Identifier,
565
549
};
566
550
567
- ParameterListStarArgs: (Option<String>, Vec<String>, Vec<Option<ast::Expression>>, Option<String>) = {
568
- "*" <va:Identifier> <kw:("," TypedParameterDef)*> <kwarg:("," "**" Identifier )?> => {
551
+ ParameterListStarArgs: (Option<Option< String>> , Vec<String>, Vec<Option<ast::Expression>>, Option<Option< String> >) = {
552
+ "*" <va:Identifier? > <kw:("," TypedParameterDef)*> <kwarg:("," KwargParameter )?> => {
569
553
// Extract keyword arguments:
570
554
let mut kwonlyargs = vec![];
571
555
let mut kw_defaults = vec![];
@@ -575,14 +559,20 @@ ParameterListStarArgs: (Option<String>, Vec<String>, Vec<Option<ast::Expression>
575
559
}
576
560
577
561
let kwarg = match kwarg {
578
- Some((_, _, name)) => Some(name),
562
+ Some((_, name)) => Some(name),
579
563
None => None,
580
564
};
581
565
582
566
(Some(va), kwonlyargs, kw_defaults, kwarg)
583
567
}
584
568
};
585
569
570
+ KwargParameter: Option<String> = {
571
+ "**" <kwarg:Identifier?> => {
572
+ kwarg
573
+ }
574
+ };
575
+
586
576
ClassDef: ast::LocatedStatement = {
587
577
<d:Decorator*> <loc:@L> "class" <n:Identifier> <a:("(" ArgumentList ")")?> ":" <s:Suite> => {
588
578
let (bases, keywords) = match a {
0 commit comments