From bee31f4b9236dca32419baa808585fe10b72d273 Mon Sep 17 00:00:00 2001 From: sofia Date: Sun, 27 Jul 2025 02:33:11 +0300 Subject: [PATCH] Add associated function parsing partially --- reid/src/ast/mod.rs | 1 + reid/src/ast/parse.rs | 27 ++++++++++++++++++++++++++- reid/src/ast/process.rs | 1 + 3 files changed, 28 insertions(+), 1 deletion(-) diff --git a/reid/src/ast/mod.rs b/reid/src/ast/mod.rs index d821953..e2a64e1 100644 --- a/reid/src/ast/mod.rs +++ b/reid/src/ast/mod.rs @@ -236,6 +236,7 @@ pub enum TopLevelStatement { FunctionDefinition(FunctionDefinition), TypeDefinition(TypeDefinition), BinopDefinition(BinopDefinition), + AssociatedFunction(Type, Vec), } #[derive(Debug)] diff --git a/reid/src/ast/parse.rs b/reid/src/ast/parse.rs index 604c955..aecfd6a 100644 --- a/reid/src/ast/parse.rs +++ b/reid/src/ast/parse.rs @@ -874,7 +874,14 @@ impl Parse for TopLevelStatement { range, }) } - Some(Token::Impl) => Stmt::BinopDefinition(stream.parse()?), + Some(Token::Impl) => match stream.peek2() { + Some(Token::Binop) => Stmt::BinopDefinition(stream.parse()?), + Some(_) => { + let AssociatedFunctionBlock(ty, functions) = stream.parse::()?; + Stmt::AssociatedFunction(ty, functions) + } + _ => Err(stream.expecting_err("binop or associated function block")?)?, + }, _ => Err(stream.expecting_err("import or fn")?)?, }) } @@ -917,3 +924,21 @@ impl Parse for BinopDefinition { }) } } + +#[derive(Debug)] +pub struct AssociatedFunctionBlock(Type, Vec); + +impl Parse for AssociatedFunctionBlock { + fn parse(mut stream: TokenStream) -> Result { + stream.expect(Token::Impl)?; + let ty = stream.parse::()?; + stream.expect(Token::BraceOpen)?; + let mut functions = Vec::new(); + while let Some(Token::FnKeyword) = stream.peek() { + functions.push(stream.parse()?); + } + + stream.expect(Token::BraceClose)?; + Ok(AssociatedFunctionBlock(ty, functions)) + } +} diff --git a/reid/src/ast/process.rs b/reid/src/ast/process.rs index 9afbd76..b9c57b8 100644 --- a/reid/src/ast/process.rs +++ b/reid/src/ast/process.rs @@ -120,6 +120,7 @@ impl ast::Module { exported: false, }); } + AssociatedFunction(_, function_definition) => todo!(), } }