Add custom binop parsing
This commit is contained in:
parent
eda78fc924
commit
5ef329d570
@ -213,6 +213,7 @@ pub enum TopLevelStatement {
|
|||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
pub struct BinopDefinition {
|
pub struct BinopDefinition {
|
||||||
lhs: (String, Type),
|
lhs: (String, Type),
|
||||||
|
op: BinaryOperator,
|
||||||
rhs: (String, Type),
|
rhs: (String, Type),
|
||||||
return_ty: Type,
|
return_ty: Type,
|
||||||
block: Block,
|
block: Block,
|
||||||
|
@ -785,7 +785,43 @@ impl Parse for TopLevelStatement {
|
|||||||
range,
|
range,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
Some(Token::Impl) => Stmt::BinopDefinition(stream.parse()?),
|
||||||
_ => Err(stream.expecting_err("import or fn")?)?,
|
_ => 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