From 17110bf563c2f57ab4e9e25e977b74df06b8c1ab Mon Sep 17 00:00:00 2001 From: Cody Date: Mon, 27 Feb 2023 11:55:17 -0600 Subject: Functions beginnings --- src/ast/mod.rs | 7 ++++--- src/ast/parser.rs | 40 +++++++++++++++++++++++++++++----------- 2 files changed, 33 insertions(+), 14 deletions(-) (limited to 'src/ast') diff --git a/src/ast/mod.rs b/src/ast/mod.rs index 04b1d26..d006737 100644 --- a/src/ast/mod.rs +++ b/src/ast/mod.rs @@ -39,9 +39,6 @@ pub enum Stmt { Return { value: Expr, }, - Print { - value: Expr, - }, } #[derive(Debug, Eq, PartialEq)] @@ -55,6 +52,10 @@ pub enum Expr { Literal(Literal), Variable(String), Grouping(Box), + Call { + ident: String, + arguments: Vec, + }, Binary { operator: TokenType, lhs: Box, diff --git a/src/ast/parser.rs b/src/ast/parser.rs index 64ed352..842ad09 100644 --- a/src/ast/parser.rs +++ b/src/ast/parser.rs @@ -102,10 +102,6 @@ impl<'a> AstParser<'a> { return Stmt::Block(self.block()); } - if self.advance_if_eq(&TokenType::Print) { - return self.print_statement(); - } - if self.advance_if_eq(&TokenType::Var) { return self.var_statement(); } @@ -126,12 +122,6 @@ impl<'a> AstParser<'a> { self.expression_statement() } - fn print_statement(&mut self) -> Stmt { - let value = self.expression(); - self.consume(TokenType::SemiColon, "Expected ';' at end of statement"); - Stmt::Print { value } - } - fn var_statement(&mut self) -> Stmt { let TokenType::Identifier(ident) = self.peek().tt.clone() else { panic!("Identifier expected after 'var'"); @@ -240,7 +230,35 @@ impl<'a> AstParser<'a> { }; } - self.primary() + self.call() + } + + fn call(&mut self) -> Expr { + let mut expr = self.primary(); + + if self.advance_if_eq(&TokenType::LeftParen) { + let mut arguments = Vec::::new(); + + if self.peek().tt != TokenType::RightParen { + loop { + arguments.push(self.expression()); + if !self.advance_if_eq(&TokenType::Comma) { + break; + } + } + } + + self.consume( + TokenType::RightParen, + "Expected ')' to close off function call", + ); + + let Expr::Variable(ident) = expr else { panic!("uh oh spaghettio"); }; + + expr = Expr::Call { ident, arguments } + } + + expr } fn primary(&mut self) -> Expr { -- cgit v1.2.3