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 {
|
pub enum Statement {
|
||||||
Expr(Expr),
|
Expr(Expr),
|
||||||
Let(Definition),
|
Let(Definition),
|
||||||
|
Return(Option<Expr>),
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(PartialEq, PartialOrd, Debug, Clone)]
|
#[derive(PartialEq, PartialOrd, Debug, Clone)]
|
||||||
|
|
|
||||||
|
|
@ -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!(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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) {
|
||||||
|
|
|
||||||
|
|
@ -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))
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue