aboutsummaryrefslogtreecommitdiff
path: root/src/ast
diff options
context:
space:
mode:
authorCody <cody@codyq.dev>2023-02-27 11:55:17 -0600
committerCody <cody@codyq.dev>2023-02-27 11:55:17 -0600
commit17110bf563c2f57ab4e9e25e977b74df06b8c1ab (patch)
tree5f63b6047db1771aee798293c86682ded0ca4fd6 /src/ast
parentebfd74ddf0ef6372624ea171e06f8460d0e1351b (diff)
downloadsloth-17110bf563c2f57ab4e9e25e977b74df06b8c1ab.tar.gz
Functions beginnings
Diffstat (limited to 'src/ast')
-rw-r--r--src/ast/mod.rs7
-rw-r--r--src/ast/parser.rs40
2 files changed, 33 insertions, 14 deletions
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<Expr>),
+ Call {
+ ident: String,
+ arguments: Vec<Expr>,
+ },
Binary {
operator: TokenType,
lhs: Box<Expr>,
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::<Expr>::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 {