From fb37bae29f0ffd043fffa7727aaa556d01c1ab55 Mon Sep 17 00:00:00 2001 From: me Date: Tue, 16 Dec 2025 15:23:19 +0200 Subject: [PATCH] fun call --- src/parser/parser.rs | 33 +++++++++++++++-- ... ayin__parser__parser__tests__fn_def.snap} | 0 .../ayin__parser__parser__tests__fncall.snap | 25 +++++++++++++ ...__parser__parser__tests__paren_fncall.snap | 35 +++++++++++++++++++ src/parser/types.rs | 2 +- 5 files changed, 92 insertions(+), 3 deletions(-) rename src/parser/snapshots/{ayin__parser__parser__tests__paren_fn.snap => ayin__parser__parser__tests__fn_def.snap} (100%) create mode 100644 src/parser/snapshots/ayin__parser__parser__tests__fncall.snap create mode 100644 src/parser/snapshots/ayin__parser__parser__tests__paren_fncall.snap diff --git a/src/parser/parser.rs b/src/parser/parser.rs index 700782c..b8d0c0f 100644 --- a/src/parser/parser.rs +++ b/src/parser/parser.rs @@ -14,6 +14,10 @@ pub fn parse(tokens: &mut Tokens, parser: Parser) -> Result { } } +fn parse_definitions(tokens: &mut Tokens) -> ParseResult> { + tokens.many(parse_definition) +} + fn parse_definition(tokens: &mut Tokens) -> ParseResult { if let Some(_) = tokens.next_if(&Token::Let) { if let Some(name) = parse_identifier_name(tokens)? { @@ -51,7 +55,20 @@ fn parse_definition(tokens: &mut Tokens) -> ParseResult { } fn parse_expr(tokens: &mut Tokens) -> ParseResult { - parse_simple_expr(tokens) + if let Some(expr1) = parse_simple_expr(tokens)? { + if let Some(args) = tokens.between(&Token::OpenParen, &Token::CloseParen, |ts| { + ts.many_sep_by(&Token::Comma, parse_expr) + })? { + Ok(Some(ast::Expr::FunCall { + func: Box::new(expr1), + args: args, + })) + } else { + Ok(Some(expr1)) + } + } else { + Ok(None) + } } fn parse_simple_expr(tokens: &mut Tokens) -> ParseResult { @@ -178,12 +195,24 @@ mod tests { insta::assert_debug_snapshot!(result); } #[test] - fn paren_fn() { + fn fn_def() { let program = "fn(a1, boco, c_c) { 108 }".to_string(); let result = parse(&mut scan(program), parse_expr); insta::assert_debug_snapshot!(result); } #[test] + fn fncall() { + let program = "call(arg1, arg2)".to_string(); + let result = parse(&mut scan(program), parse_expr); + insta::assert_debug_snapshot!(result); + } + #[test] + fn paren_fncall() { + let program = "(fn(a1, boco, c_c) { 108 })()".to_string(); + let result = parse(&mut scan(program), parse_expr); + insta::assert_debug_snapshot!(result); + } + #[test] fn let_number() { let program = "let x = 108;".to_string(); let result = parse(&mut scan(program), parse_definition); diff --git a/src/parser/snapshots/ayin__parser__parser__tests__paren_fn.snap b/src/parser/snapshots/ayin__parser__parser__tests__fn_def.snap similarity index 100% rename from src/parser/snapshots/ayin__parser__parser__tests__paren_fn.snap rename to src/parser/snapshots/ayin__parser__parser__tests__fn_def.snap diff --git a/src/parser/snapshots/ayin__parser__parser__tests__fncall.snap b/src/parser/snapshots/ayin__parser__parser__tests__fncall.snap new file mode 100644 index 0000000..28e4be6 --- /dev/null +++ b/src/parser/snapshots/ayin__parser__parser__tests__fncall.snap @@ -0,0 +1,25 @@ +--- +source: src/parser/parser.rs +expression: result +--- +Ok( + FunCall { + func: Var( + Name( + "call", + ), + ), + args: [ + Var( + Name( + "arg1", + ), + ), + Var( + Name( + "arg2", + ), + ), + ], + }, +) diff --git a/src/parser/snapshots/ayin__parser__parser__tests__paren_fncall.snap b/src/parser/snapshots/ayin__parser__parser__tests__paren_fncall.snap new file mode 100644 index 0000000..ad5534c --- /dev/null +++ b/src/parser/snapshots/ayin__parser__parser__tests__paren_fncall.snap @@ -0,0 +1,35 @@ +--- +source: src/parser/parser.rs +expression: result +--- +Ok( + FunCall { + func: Func( + Fn { + args: [ + Arg { + name: Name( + "a1", + ), + }, + Arg { + name: Name( + "boco", + ), + }, + Arg { + name: Name( + "c_c", + ), + }, + ], + body: Value( + Int( + 108, + ), + ), + }, + ), + args: [], + }, +) diff --git a/src/parser/types.rs b/src/parser/types.rs index 3a60c2f..85ddacd 100644 --- a/src/parser/types.rs +++ b/src/parser/types.rs @@ -120,7 +120,7 @@ impl Tokens { } Ok(Some(results)) } else { - Ok(None) + Ok(Some(vec![])) } } pub fn many(&mut self, parser: Parser) -> ParseResult> {