feat(tazjin/rlox): Implement function definitions

... with this, functions now work.

Note that this bubbled up another weird code structure nit: The
parser::Function type should probably not carry its name directly.

However this doesn't matter much and I don't care right now.

Change-Id: If8e3b23f07033260433b9acd45f37c0e61fd2ff8
Reviewed-on: https://cl.tvl.fyi/c/depot/+/2393
Reviewed-by: tazjin <mail@tazj.in>
Tested-by: BuildkiteCI
This commit is contained in:
Vincent Ambo 2021-01-14 18:16:31 +03:00 committed by tazjin
parent 56d8fa97ed
commit 1d8e3f4f8b
3 changed files with 28 additions and 5 deletions

View file

@ -7,6 +7,7 @@
// have real types.
use crate::errors::{Error, ErrorKind};
use crate::scanner::{Token, TokenKind};
use std::rc::Rc;
// AST
@ -108,7 +109,7 @@ pub enum Statement<'a> {
Block(Block<'a>),
If(If<'a>),
While(While<'a>),
Function(Function<'a>),
Function(Rc<Function<'a>>),
}
// Parser
@ -221,11 +222,11 @@ impl<'a> Parser<'a> {
ErrorKind::ExpectedToken("Expect '{' before function body."),
)?;
Ok(Statement::Function(Function {
Ok(Statement::Function(Rc::new(Function {
name,
params,
body: self.block_statement()?,
}))
})))
}
fn var_declaration(&mut self) -> StmtResult<'a> {