36 lines
1 KiB
Rust
36 lines
1 KiB
Rust
use crate::ast;
|
|
|
|
fn parse_expr(tokens: &mut Vec<LocatedToken>) -> Result<ast::Expr, Error> {
|
|
todo!()
|
|
}
|
|
|
|
enum Error {
|
|
UnexpectedToken(LocatedToken),
|
|
UnexpectedEndOfInput,
|
|
}
|
|
|
|
fn parse_definition(tokens: &mut Vec<LocatedToken>) -> Result<ast::Definition, Error> {
|
|
if let Some(start) = tokens.pop_if(|tok| tok.token == Token::Let) {
|
|
if let Some(LocatedToken {
|
|
token: Token::Identifier(identifier),
|
|
..
|
|
}) = tokens.pop_if(|tok| match tok.token {
|
|
Token::Identifier(_) => true,
|
|
_ => false,
|
|
}) {
|
|
if let Some(_eq) = tokens.pop_if(|tok| tok.token == Token::Equals) {
|
|
let expr = parse_expr(tokens)?;
|
|
Ok(ast::Definition {
|
|
name: ast::Name(identifier),
|
|
expr,
|
|
})
|
|
} else {
|
|
Err(Error::UnexpectedToken(start))
|
|
}
|
|
} else {
|
|
Err(Error::UnexpectedToken(start))
|
|
}
|
|
} else {
|
|
Err(Error::UnexpectedEndOfInput)
|
|
}
|
|
}
|