return
This commit is contained in:
parent
ff3b45352d
commit
ca926cf39a
4 changed files with 20 additions and 6 deletions
|
|
@ -48,6 +48,7 @@ pub enum Op {
|
|||
pub enum Statement {
|
||||
Expr(Expr),
|
||||
Let(Definition),
|
||||
Return(Option<Expr>),
|
||||
}
|
||||
|
||||
#[derive(PartialEq, PartialOrd, Debug, Clone)]
|
||||
|
|
|
|||
|
|
@ -39,6 +39,7 @@ fn eval_statement(
|
|||
expr_env.insert(name.clone(), result.clone());
|
||||
Ok(result)
|
||||
}
|
||||
ast::Statement::Return(_) => todo!(),
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -133,6 +133,21 @@ fn parse_statement(tokens: &mut Tokens) -> ParseResult<ast::Statement> {
|
|||
tokens.one_of(vec![
|
||||
|tokens| Ok(parse_expr(tokens)?.map(ast::Statement::Expr)),
|
||||
|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() {
|
||||
return {
|
||||
player: { position: { x: 10, y: 20 }, },
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
let update = fn(state, events) {
|
||||
return state';
|
||||
return state2;
|
||||
};
|
||||
|
||||
let draw = fn(frame, state) {
|
||||
|
|
|
|||
|
|
@ -112,10 +112,7 @@ impl Tokens {
|
|||
if let Some(result) = parser(self)? {
|
||||
results.push(result);
|
||||
} else {
|
||||
return Err(Error::UnexpectedTokenForParser(
|
||||
"sep_by_many".into(),
|
||||
self.next(),
|
||||
));
|
||||
break;
|
||||
}
|
||||
}
|
||||
Ok(Some(results))
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue