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()?, + }) + } +}