This commit is contained in:
me 2025-12-16 17:55:34 +02:00
parent ff3b45352d
commit ca926cf39a
4 changed files with 20 additions and 6 deletions

View file

@ -48,6 +48,7 @@ pub enum Op {
pub enum Statement { pub enum Statement {
Expr(Expr), Expr(Expr),
Let(Definition), Let(Definition),
Return(Option<Expr>),
} }
#[derive(PartialEq, PartialOrd, Debug, Clone)] #[derive(PartialEq, PartialOrd, Debug, Clone)]

View file

@ -39,6 +39,7 @@ fn eval_statement(
expr_env.insert(name.clone(), result.clone()); expr_env.insert(name.clone(), result.clone());
Ok(result) Ok(result)
} }
ast::Statement::Return(_) => todo!(),
} }
} }

View file

@ -133,6 +133,21 @@ fn parse_statement(tokens: &mut Tokens) -> ParseResult<ast::Statement> {
tokens.one_of(vec![ tokens.one_of(vec![
|tokens| Ok(parse_expr(tokens)?.map(ast::Statement::Expr)), |tokens| Ok(parse_expr(tokens)?.map(ast::Statement::Expr)),
|tokens| Ok(parse_definition(tokens)?.map(ast::Statement::Let)), |tokens| Ok(parse_definition(tokens)?.map(ast::Statement::Let)),
|tokens| {
if let Some(_) = tokens.next_if(&Token::Return) {
let expr = parse_expr(tokens)?;
if let Some(_) = tokens.next_if(&Token::Semicolon) {
Ok(Some(ast::Statement::Return(expr)))
} else {
Err(Error::UnexpectedToken {
expected: (Token::Return),
got: tokens.next(),
})
}
} else {
Ok(None)
}
},
]) ])
} }
@ -334,11 +349,11 @@ mod tests {
let init = fn() { let init = fn() {
return { return {
player: { position: { x: 10, y: 20 }, }, player: { position: { x: 10, y: 20 }, },
} };
}; };
let update = fn(state, events) { let update = fn(state, events) {
return state'; return state2;
}; };
let draw = fn(frame, state) { let draw = fn(frame, state) {

View file

@ -112,10 +112,7 @@ impl Tokens {
if let Some(result) = parser(self)? { if let Some(result) = parser(self)? {
results.push(result); results.push(result);
} else { } else {
return Err(Error::UnexpectedTokenForParser( break;
"sep_by_many".into(),
self.next(),
));
} }
} }
Ok(Some(results)) Ok(Some(results))