From e8e2b4cebda4ed8228d3cf681cb356e2190530a7 Mon Sep 17 00:00:00 2001 From: sofia Date: Sun, 20 Jul 2025 15:32:56 +0300 Subject: [PATCH] Implement parsing of multiple parameters --- reid/src/ast/parse.rs | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/reid/src/ast/parse.rs b/reid/src/ast/parse.rs index 8f1263c..fed01fd 100644 --- a/reid/src/ast/parse.rs +++ b/reid/src/ast/parse.rs @@ -349,16 +349,32 @@ impl Parse for FunctionDefinition { } } +#[derive(Debug)] +struct FunctionParam(String, Type); + +impl Parse for FunctionParam { + fn parse(mut stream: TokenStream) -> Result { + let Some(Token::Identifier(arg_name)) = stream.next() else { + return Err(stream.expected_err("parameter name")?); + }; + stream.expect(Token::Colon)?; + Ok(FunctionParam(arg_name, stream.parse()?)) + } +} + impl Parse for FunctionSignature { fn parse(mut stream: TokenStream) -> Result { if let Some(Token::Identifier(name)) = stream.next() { stream.expect(Token::ParenOpen)?; let mut args = Vec::new(); - while let Some(Token::Identifier(arg_name)) = stream.peek() { - stream.next(); - stream.expect(Token::Colon)?; - args.push((arg_name, stream.parse()?)); + if let Ok(param) = stream.parse::() { + args.push((param.0, param.1)); + while let Some(Token::Comma) = stream.peek() { + stream.next(); + let param = stream.parse::()?; + args.push((param.0, param.1)); + } } stream.expect(Token::ParenClose)?;