diff --git a/hercules_ir/src/parse.rs b/hercules_ir/src/parse.rs index 3cd73720d1df4ee0854e57b1d29e32febc009b88..2e625f701ea9a8911aca24e6f7eb54f1b9572a1f 100644 --- a/hercules_ir/src/parse.rs +++ b/hercules_ir/src/parse.rs @@ -496,6 +496,12 @@ fn parse_constant<'a>( tys, context, )?, + Type::Summation(tys) => parse_summation_constant( + ir_text, + context.borrow_mut().get_type_id(ty.clone()), + tys, + context, + )?, _ => todo!(), }; context.borrow_mut().get_type_id(ty); @@ -602,6 +608,36 @@ fn parse_product_constant<'a>( )) } +fn parse_summation_constant<'a>( + ir_text: &'a str, + sum_ty: TypeID, + tys: Box<[TypeID]>, + context: &RefCell<Context<'a>>, +) -> nom::IResult<&'a str, Constant> { + let ir_text = nom::character::complete::multispace0(ir_text)?.0; + let ir_text = nom::bytes::complete::tag("sum")(ir_text)?.0; + let ir_text = nom::character::complete::multispace0(ir_text)?.0; + let ir_text = nom::character::complete::char('(')(ir_text)?.0; + let ir_text = nom::character::complete::multispace0(ir_text)?.0; + let (ir_text, variant) = parse_prim::<u32>(ir_text, "1234567890")?; + let ir_text = nom::character::complete::multispace0(ir_text)?.0; + let ir_text = nom::character::complete::char(',')(ir_text)?.0; + let ir_text = nom::character::complete::multispace0(ir_text)?.0; + let (ir_text, id) = parse_constant_id( + ir_text, + context + .borrow() + .reverse_type_map + .get(&tys[variant as usize]) + .unwrap() + .clone(), + context, + )?; + let ir_text = nom::character::complete::multispace0(ir_text)?.0; + let ir_text = nom::character::complete::char(')')(ir_text)?.0; + Ok((ir_text, Constant::Summation(sum_ty, variant, id))) +} + mod tests { #[allow(unused_imports)] use super::*;