@@ -76,13 +76,6 @@ DelStatement: ast::LocatedStatement = {
7676
7777ExpressionStatement: ast::LocatedStatement = {
7878 <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-
8679 // Just an expression, no assignment:
8780 if suffix.is_empty() {
8881 ast::LocatedStatement {
@@ -106,12 +99,6 @@ ExpressionStatement: ast::LocatedStatement = {
10699 }
107100 },
108101 <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-
115102 // TODO: this works in most cases:
116103 let rhs = e2.into_iter().next().unwrap();
117104 ast::LocatedStatement {
@@ -134,11 +121,19 @@ AssignSuffix: ast::Expression = {
134121 "=" <e:YieldExpr> => e,
135122};
136123
137- TestOrStarExprList: Vec< ast::Expression> = {
138- <e:TestOrStarExpr> <e2:("," TestOrStarExpr)*> => {
124+ TestOrStarExprList: ast::Expression = {
125+ <e:TestOrStarExpr> <e2:("," TestOrStarExpr)*> <comma:","?> => {
139126 let mut res = vec![e];
140127 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
142137 }
143138};
144139
@@ -453,29 +448,8 @@ Parameters: ast::Parameters = {
453448// parameters are (String, None), kwargs are (String, Some(Test)) where Test is
454449// the default
455450TypedArgsList: 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;
479453
480454 // Now gather rest of parameters:
481455 let (vararg, kwonlyargs, kw_defaults, kwarg) = match args2 {
@@ -492,35 +466,14 @@ TypedArgsList: ast::Parameters = {
492466 kw_defaults: kw_defaults,
493467 }
494468 },
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;
518471
519472 // Now gather rest of parameters:
520473 let vararg = None;
521474 let kwonlyargs = vec![];
522475 let kw_defaults = vec![];
523- let kwarg = Some(kw.2 );
476+ let kwarg = Some(kw.1 );
524477
525478 ast::Parameters {
526479 args: names,
@@ -542,7 +495,7 @@ TypedArgsList: ast::Parameters = {
542495 kw_defaults: kw_defaults,
543496 }
544497 },
545- "**" <kw:Identifier > => {
498+ <kw:KwargParameter > => {
546499 ast::Parameters {
547500 args: vec![],
548501 kwonlyargs: vec![],
@@ -554,6 +507,37 @@ TypedArgsList: ast::Parameters = {
554507 },
555508};
556509
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+
557541TypedParameterDef: (String, Option<ast::Expression>) = {
558542 <i:TypedParameter> => (i, None),
559543 <i:TypedParameter> "=" <e:Test> => (i, Some(e)),
@@ -564,8 +548,8 @@ TypedParameter: String = {
564548 Identifier,
565549};
566550
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 )?> => {
569553 // Extract keyword arguments:
570554 let mut kwonlyargs = vec![];
571555 let mut kw_defaults = vec![];
@@ -575,14 +559,20 @@ ParameterListStarArgs: (Option<String>, Vec<String>, Vec<Option<ast::Expression>
575559 }
576560
577561 let kwarg = match kwarg {
578- Some((_, _, name)) => Some(name),
562+ Some((_, name)) => Some(name),
579563 None => None,
580564 };
581565
582566 (Some(va), kwonlyargs, kw_defaults, kwarg)
583567 }
584568};
585569
570+ KwargParameter: Option<String> = {
571+ "**" <kwarg:Identifier?> => {
572+ kwarg
573+ }
574+ };
575+
586576ClassDef: ast::LocatedStatement = {
587577 <d:Decorator*> <loc:@L> "class" <n:Identifier> <a:("(" ArgumentList ")")?> ":" <s:Suite> => {
588578 let (bases, keywords) = match a {
0 commit comments