@@ -407,13 +407,22 @@ FuncDef: ast::LocatedStatement = {
407407};
408408
409409Parameters: ast::Parameters = {
410- "(" <a: TypedArgsList> ")" => a,
410+ "(" <a: (TypedArgsList)?> ")" => {
411+ match a {
412+ Some(a) => a,
413+ None => Default::default(),
414+ }
415+ },
411416};
412417
413418// parameters are (String, None), kwargs are (String, Some(Test)) where Test is
414419// the default
415420TypedArgsList: ast::Parameters = {
416- <args: Comma<Parameter>> => {
421+ <param1:TypedParameterDef> <param2:("," TypedParameterDef)*> <args2:("," ParameterListStarArgs)?> => {
422+ // Combine first parameters:
423+ let mut args = vec![param1];
424+ args.extend(param2.into_iter().map(|x| x.1));
425+
417426 let mut names = vec![];
418427 let mut default_elements = vec![];
419428
@@ -433,17 +442,71 @@ TypedArgsList: ast::Parameters = {
433442 }
434443 }
435444
445+ // Now gather rest of parameters:
446+ let (vararg, kwonlyargs, kw_defaults, kwarg) = match args2 {
447+ Some((_, x)) => x,
448+ None => (None, vec![], vec![], None),
449+ };
450+
436451 ast::Parameters {
437452 args: names,
438- vararg: None,
453+ kwonlyargs: kwonlyargs,
454+ vararg: vararg,
455+ kwarg: kwarg,
439456 defaults: default_elements,
457+ kw_defaults: kw_defaults,
440458 }
441- }
459+ },
460+ <params:ParameterListStarArgs> => {
461+ let (vararg, kwonlyargs, kw_defaults, kwarg) = params;
462+ ast::Parameters {
463+ args: vec![],
464+ kwonlyargs: kwonlyargs,
465+ vararg: vararg,
466+ kwarg: kwarg,
467+ defaults: vec![],
468+ kw_defaults: kw_defaults,
469+ }
470+ },
471+ "**" <kw:Identifier> => {
472+ ast::Parameters {
473+ args: vec![],
474+ kwonlyargs: vec![],
475+ vararg: None,
476+ kwarg: Some(kw),
477+ defaults: vec![],
478+ kw_defaults: vec![],
479+ }
480+ },
481+ };
482+
483+ TypedParameterDef: (String, Option<ast::Expression>) = {
484+ <i:TypedParameter> => (i, None),
485+ <i:TypedParameter> "=" <e:Test> => (i, Some(e)),
486+ };
487+
488+ // TODO: add type annotations here:
489+ TypedParameter: String = {
490+ Identifier,
442491};
443492
444- Parameter: (String, Option<ast::Expression>) = {
445- <i:Identifier> => (i.clone(), None),
446- <i:Identifier> "=" <e:Test> => (i.clone(), Some(e)),
493+ ParameterListStarArgs: (Option<String>, Vec<String>, Vec<Option<ast::Expression>>, Option<String>) = {
494+ "*" <va:Identifier> <kw:("," TypedParameterDef)*> <kwarg:("," "**" Identifier)?> => {
495+ // Extract keyword arguments:
496+ let mut kwonlyargs = vec![];
497+ let mut kw_defaults = vec![];
498+ for (name, value) in kw.into_iter().map(|x| x.1) {
499+ kwonlyargs.push(name);
500+ kw_defaults.push(value);
501+ }
502+
503+ let kwarg = match kwarg {
504+ Some((_, _, name)) => Some(name),
505+ None => None,
506+ };
507+
508+ (Some(va), kwonlyargs, kw_defaults, kwarg)
509+ }
447510};
448511
449512ClassDef: ast::LocatedStatement = {
@@ -505,9 +568,9 @@ Test: ast::Expression = {
505568};
506569
507570LambdaDef: ast::Expression = {
508- "lambda" <p:TypedArgsList> ":" <b:Expression> =>
571+ "lambda" <p:TypedArgsList? > ":" <b:Expression> =>
509572 ast::Expression::Lambda {
510- args:p ,
573+ args: p.unwrap_or(Default::default()) ,
511574 body:Box::new(b)
512575 }
513576}
0 commit comments