a few more things

This commit is contained in:
me 2025-12-15 23:58:29 +02:00
parent 290dcab5e9
commit 8b677c037b
3 changed files with 83 additions and 40 deletions

View file

@ -1,46 +1,6 @@
use super::types::*;
use crate::ast;
fn parse_expr(tokens: &mut Tokens) -> ParseResult<ast::Expr> {
todo!()
}
fn parse_simple_expr(tokens: &mut Tokens) -> ParseResult<ast::Expr> {
tokens.one_of(vec![
|t| t.between(Token::OpenParen, Token::CloseParen, parse_expr),
parse_number,
|_| Err(Error::UnexpectedEndOfInput),
])
}
fn parse_string(tokens: &mut Tokens) -> ParseResult<ast::Expr> {
{
if let Some(LocatedToken {
token: Token::String(string),
..
}) = tokens.next_if(Token::String("".into()))
{
Ok(Some(ast::Expr::Value(ast::Value::String(string))))
} else {
Ok(None)
}
}
}
fn parse_number(tokens: &mut Tokens) -> ParseResult<ast::Expr> {
{
if let Some(LocatedToken {
token: Token::Number(number),
..
}) = tokens.next_if(Token::Number(0))
{
Ok(Some(ast::Expr::Value(ast::Value::Int(number.into()))))
} else {
Ok(None)
}
}
}
fn parse_definition(tokens: &mut Tokens) -> Result<ast::Definition, Error> {
if let Some(start) = tokens.next_if(Token::Let) {
if let Some(LocatedToken {
@ -76,3 +36,82 @@ fn parse_definition(tokens: &mut Tokens) -> Result<ast::Definition, Error> {
Err(Error::UnexpectedEndOfInput)
}
}
fn parse_expr(tokens: &mut Tokens) -> ParseResult<ast::Expr> {
parse_simple_expr(tokens)
}
fn parse_simple_expr(tokens: &mut Tokens) -> ParseResult<ast::Expr> {
tokens.one_of(vec![
|t| t.between(Token::OpenParen, Token::CloseParen, parse_expr),
parse_identifier,
parse_number,
parse_string,
parse_bool,
])
}
fn parse_string(tokens: &mut Tokens) -> ParseResult<ast::Expr> {
{
if let Some(LocatedToken {
token: Token::String(string),
..
}) = tokens.next_if(Token::String("".into()))
{
Ok(Some(ast::Expr::Value(ast::Value::String(string))))
} else {
Ok(None)
}
}
}
fn parse_number(tokens: &mut Tokens) -> ParseResult<ast::Expr> {
{
if let Some(LocatedToken {
token: Token::Number(number),
..
}) = tokens.next_if(Token::Number(0))
{
Ok(Some(ast::Expr::Value(ast::Value::Int(number.into()))))
} else {
Ok(None)
}
}
}
fn parse_identifier(tokens: &mut Tokens) -> ParseResult<ast::Expr> {
{
if let Some(LocatedToken {
token: Token::Identifier(string),
..
}) = tokens.next_if(Token::String("".into()))
{
Ok(Some(ast::Expr::Var(ast::Name(string))))
} else {
Ok(None)
}
}
}
fn parse_bool(tokens: &mut Tokens) -> ParseResult<ast::Expr> {
tokens.one_of(vec![
|t| {
Ok({
if let Some(_) = t.next_if(Token::True) {
Some(ast::Expr::Value(ast::Value::Boolean(true)))
} else {
None
}
})
},
|t| {
Ok({
if let Some(_) = t.next_if(Token::False) {
Some(ast::Expr::Value(ast::Value::Boolean(false)))
} else {
None
}
})
},
])
}

View file

@ -137,6 +137,8 @@ fn scan(source: String) -> Vec<LocatedToken> {
"fn" => Token::Fn,
"let" => Token::Let,
"return" => Token::Return,
"true" => Token::True,
"false" => Token::False,
_ => Token::Identifier(str),
},
});

View file

@ -21,6 +21,8 @@ pub enum Token {
Comma,
Semicolon,
Colon,
True,
False,
Number(u32),
String(String),
Identifier(String),