From 8b677c037bdcf93d725cc05aae6e64a3fea36c3b Mon Sep 17 00:00:00 2001 From: me Date: Mon, 15 Dec 2025 23:58:29 +0200 Subject: [PATCH] a few more things --- src/parser/parser.rs | 119 ++++++++++++++++++++++++++++-------------- src/parser/scanner.rs | 2 + src/parser/types.rs | 2 + 3 files changed, 83 insertions(+), 40 deletions(-) diff --git a/src/parser/parser.rs b/src/parser/parser.rs index 4f9a396..eec912a 100644 --- a/src/parser/parser.rs +++ b/src/parser/parser.rs @@ -1,46 +1,6 @@ use super::types::*; use crate::ast; -fn parse_expr(tokens: &mut Tokens) -> ParseResult { - todo!() -} - -fn parse_simple_expr(tokens: &mut Tokens) -> ParseResult { - 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 { - { - 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 { - { - 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 { if let Some(start) = tokens.next_if(Token::Let) { if let Some(LocatedToken { @@ -76,3 +36,82 @@ fn parse_definition(tokens: &mut Tokens) -> Result { Err(Error::UnexpectedEndOfInput) } } + +fn parse_expr(tokens: &mut Tokens) -> ParseResult { + parse_simple_expr(tokens) +} + +fn parse_simple_expr(tokens: &mut Tokens) -> ParseResult { + 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 { + { + 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 { + { + 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 { + { + 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 { + 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 + } + }) + }, + ]) +} diff --git a/src/parser/scanner.rs b/src/parser/scanner.rs index 59b3fb7..bbf9a71 100644 --- a/src/parser/scanner.rs +++ b/src/parser/scanner.rs @@ -137,6 +137,8 @@ fn scan(source: String) -> Vec { "fn" => Token::Fn, "let" => Token::Let, "return" => Token::Return, + "true" => Token::True, + "false" => Token::False, _ => Token::Identifier(str), }, }); diff --git a/src/parser/types.rs b/src/parser/types.rs index e722b13..01596bc 100644 --- a/src/parser/types.rs +++ b/src/parser/types.rs @@ -21,6 +21,8 @@ pub enum Token { Comma, Semicolon, Colon, + True, + False, Number(u32), String(String), Identifier(String),