From 5ef329d57065bd5043f7951c18b86ce3b810de3f Mon Sep 17 00:00:00 2001 From: sofia Date: Thu, 24 Jul 2025 12:29:39 +0300 Subject: [PATCH] Add custom binop parsing --- reid/src/ast/mod.rs | 1 + reid/src/ast/parse.rs | 36 ++++++++++++++++++++++++++++++++++++ 2 files changed, 37 insertions(+) diff --git a/reid/src/ast/mod.rs b/reid/src/ast/mod.rs index 937e773..1b15512 100644 --- a/reid/src/ast/mod.rs +++ b/reid/src/ast/mod.rs @@ -213,6 +213,7 @@ pub enum TopLevelStatement { #[derive(Debug)] pub struct BinopDefinition { lhs: (String, Type), + op: BinaryOperator, rhs: (String, Type), return_ty: Type, block: Block, diff --git a/reid/src/ast/parse.rs b/reid/src/ast/parse.rs index 757cabe..bfa0268 100644 --- a/reid/src/ast/parse.rs +++ b/reid/src/ast/parse.rs @@ -785,7 +785,43 @@ impl Parse for TopLevelStatement { range, }) } + Some(Token::Impl) => Stmt::BinopDefinition(stream.parse()?), _ => Err(stream.expecting_err("import or fn")?)?, }) } } + +impl Parse for BinopDefinition { + fn parse(mut stream: TokenStream) -> Result { + stream.expect(Token::Impl)?; + stream.expect(Token::Binop)?; + + stream.expect(Token::ParenOpen)?; + let Some(Token::Identifier(lhs_name)) = stream.next() else { + return Err(stream.expected_err("lhs name")?); + }; + stream.expect(Token::Colon)?; + let lhs_type = stream.parse()?; + stream.expect(Token::ParenClose)?; + + let operator = stream.parse()?; + + stream.expect(Token::ParenOpen)?; + let Some(Token::Identifier(rhs_name)) = stream.next() else { + return Err(stream.expected_err("rhs name")?); + }; + stream.expect(Token::Colon)?; + let rhs_type = stream.parse()?; + stream.expect(Token::ParenClose)?; + + stream.expect(Token::Arrow)?; + + Ok(BinopDefinition { + lhs: (lhs_name, lhs_type), + op: operator, + rhs: (rhs_name, rhs_type), + return_ty: stream.parse()?, + block: stream.parse()?, + }) + } +}