Add custom binop parsing
This commit is contained in:
		
							parent
							
								
									eda78fc924
								
							
						
					
					
						commit
						5ef329d570
					
				| @ -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, | ||||
|  | ||||
| @ -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<Self, Error> { | ||||
|         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()?, | ||||
|         }) | ||||
|     } | ||||
| } | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user