From 431aae0b0d949b831e59ab9d23e5db20810f4a20 Mon Sep 17 00:00:00 2001 From: sofia Date: Wed, 23 Jul 2025 19:52:46 +0300 Subject: [PATCH] Add lexing to loops --- examples/loops.reid | 15 +++++++++++++++ reid/src/ast/mod.rs | 2 ++ reid/src/ast/parse.rs | 4 ++-- reid/src/ast/process.rs | 4 ++++ reid/src/lexer.rs | 8 ++++++++ 5 files changed, 31 insertions(+), 2 deletions(-) create mode 100644 examples/loops.reid diff --git a/examples/loops.reid b/examples/loops.reid new file mode 100644 index 0000000..8f776e9 --- /dev/null +++ b/examples/loops.reid @@ -0,0 +1,15 @@ +// Arithmetic, function calls and imports! + + +fn main() -> u32 { + for i in [0, 1, 2, 3, 4, 5, 6, 7, 9, 10] { + print("hello") + } + + let mut num = 0; + while num < 10 { + num = num + 1; + } + + return num; +} diff --git a/reid/src/ast/mod.rs b/reid/src/ast/mod.rs index ff4ab7a..daff3ac 100644 --- a/reid/src/ast/mod.rs +++ b/reid/src/ast/mod.rs @@ -178,6 +178,8 @@ pub enum BlockLevelStatement { }, Expression(Expression), Return(ReturnType, Expression), + ForLoop(String, Expression, Block), + WhileLoop(Expression, Block), } #[derive(Debug, Clone)] diff --git a/reid/src/ast/parse.rs b/reid/src/ast/parse.rs index 4141abc..6e9a3cb 100644 --- a/reid/src/ast/parse.rs +++ b/reid/src/ast/parse.rs @@ -231,10 +231,10 @@ impl Parse for PrimaryExpression { stream.expect(Token::BracketClose)?; Expression(Kind::Array(expressions), stream.get_range().unwrap()) } - _ => Err(stream.expected_err("expression inner")?)?, + _ => Err(stream.expecting_err("expression")?)?, } } else { - Err(stream.expected_err("expression")?)? + Err(stream.expecting_err("expression")?)? }; while let Ok(index) = stream.parse::() { diff --git a/reid/src/ast/process.rs b/reid/src/ast/process.rs index 8ebd252..ad321e8 100644 --- a/reid/src/ast/process.rs +++ b/reid/src/ast/process.rs @@ -148,6 +148,10 @@ impl ast::Block { ast::BlockLevelStatement::Return(_, e) => { (StmtKind::Expression(e.process(module_id)), e.1) } + ast::BlockLevelStatement::ForLoop(expression, expression1, block) => { + todo!() + } + ast::BlockLevelStatement::WhileLoop(expression, block) => todo!(), }; mir_statements.push(mir::Statement(kind, range.as_meta(module_id))); diff --git a/reid/src/lexer.rs b/reid/src/lexer.rs index 4032f4c..e6f19d8 100644 --- a/reid/src/lexer.rs +++ b/reid/src/lexer.rs @@ -42,6 +42,10 @@ pub enum Token { Extern, /// `struct` Struct, + /// `while` + While, + /// `for` + For, // Symbols /// `;` @@ -136,6 +140,8 @@ impl ToString for Token { Token::Extern => String::from("extern"), Token::Struct => String::from("struct"), Token::AsKeyword => String::from("as"), + Token::For => String::from("for"), + Token::While => String::from("while"), Token::Semi => String::from(';'), Token::Equals => String::from('='), Token::Colon => String::from(':'), @@ -322,6 +328,8 @@ pub fn tokenize>(to_tokenize: T) -> Result, Error "pub" => Token::PubKeyword, "struct" => Token::Struct, "as" => Token::AsKeyword, + "for" => Token::For, + "while" => Token::While, _ => Token::Identifier(value), }; variant