From 1514eee54923f35a69d2500ed198b0102780f3d0 Mon Sep 17 00:00:00 2001 From: Garrit Franke Date: Sat, 5 Dec 2020 20:58:35 +0100 Subject: [PATCH] Add function arguments --- examples/hello_world.sb | 4 ++-- examples_out/out.js | 4 ++-- src/parser/mod.rs | 23 ++++++++++++++++++++++- 3 files changed, 26 insertions(+), 5 deletions(-) diff --git a/examples/hello_world.sb b/examples/hello_world.sb index 26184fd..22dd2aa 100644 --- a/examples/hello_world.sb +++ b/examples/hello_world.sb @@ -1,5 +1,5 @@ -fn main() { - return "Hello World"; +fn main(message) { + return message; } fn fib() {} \ No newline at end of file diff --git a/examples_out/out.js b/examples_out/out.js index be3aad0..e221fee 100644 --- a/examples_out/out.js +++ b/examples_out/out.js @@ -1,5 +1,5 @@ -function main() { -return "Hello World" +function main(message,) { +return message } function fib() { } diff --git a/src/parser/mod.rs b/src/parser/mod.rs index f503dff..c73674a 100644 --- a/src/parser/mod.rs +++ b/src/parser/mod.rs @@ -138,6 +138,14 @@ impl Parser { let name = self.match_identifier()?; self.match_token(TokenKind::BraceOpen)?; + + let arguments: Vec = match self.peek() { + Some(t) if t.kind == TokenKind::BraceClose => Vec::new(), + _ => self + .parse_arguments() + .expect("Failed to parse function arguments"), + }; + self.match_token(TokenKind::BraceClose)?; self.match_token(TokenKind::CurlyBracesOpen)?; @@ -153,11 +161,24 @@ impl Parser { Ok(Function { name: name, - arguments: Vec::new(), + arguments: arguments, statements: statements, }) } + fn parse_arguments(&mut self) -> Result, String> { + let mut args = Vec::new(); + while let Err(_) = self.peek_token(TokenKind::BraceClose) { + let next = self.next().ok_or_else(|| "Expected identifier")?; + match next.kind { + TokenKind::Identifier(name) => args.push(Variable { name: name }), + _ => return Err(self.make_error(TokenKind::Identifier("".into()), next)), + } + } + + Ok(args) + } + fn parse_statement(&mut self) -> Result { let token = self.next_token(); dbg!(&token);