ayin/src/parser/parser.rs
2025-12-14 11:37:35 +02:00

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)
}
}