diff --git a/schala-lang/language/src/ast.rs b/schala-lang/language/src/ast.rs index 9f47ee0..d440a82 100644 --- a/schala-lang/language/src/ast.rs +++ b/schala-lang/language/src/ast.rs @@ -125,7 +125,7 @@ pub enum ExpressionKind { }, Call { f: Box>, - arguments: Vec>, + arguments: Vec>, }, Index { indexee: Box>, @@ -151,6 +151,16 @@ pub enum ExpressionKind { ListLiteral(Vec>), } +#[derive(Debug, PartialEq, Clone)] +pub enum InvocationArgument { + Positional(Expression), + Keyword { + name: Rc, + expr: Expression, + }, + Ignored +} + #[derive(Debug, PartialEq, Clone)] pub enum Discriminator { Simple(Expression), diff --git a/schala-lang/language/src/parsing.rs b/schala-lang/language/src/parsing.rs index dace2c2..5fa1524 100644 --- a/schala-lang/language/src/parsing.rs +++ b/schala-lang/language/src/parsing.rs @@ -69,8 +69,9 @@ //! precedence_expr := prefix_expr //! prefix_expr := prefix_op call_expr //! prefix_op := "+" | "-" | "!" | "~" -//! call_expr := index_expr ( "(" expr_list ")" )* | ε -//! expr_list := expression ("," expression)* | ε +//! call_expr := index_expr ( "(" invocation_list ")" )* | ε +//! invocation_list := invocation_argument ("," invocation_argument)* | ε +//! invocation_argument := expression | IDENTIFIER "=" expression | "_" //! index_expr := primary ( "[" (expression ("," (expression)* | ε) "]" )* //! primary := literal | paren_expr | if_expr | for_expr | while_expr | identifier_expr | lambda_expr | anonymous_struct | list_expr //! expr_or_block := "{" (statement delimiter)* "}" | expr @@ -627,6 +628,11 @@ impl Parser { Ok(expr) } + #[recursive_descent_method] + fn invocation_argument(&mut self) -> ParseResult { + panic!() + } + #[recursive_descent_method] fn index_expr(&mut self) -> ParseResult { let primary = self.primary()?;