From e37be3f101ac846c50982119683b2b6b0692dc48 Mon Sep 17 00:00:00 2001 From: Russel Arbore <russel.jma@gmail.com> Date: Mon, 11 Sep 2023 08:54:14 -0500 Subject: [PATCH] Parse summation constant --- hercules_ir/src/parse.rs | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/hercules_ir/src/parse.rs b/hercules_ir/src/parse.rs index 3cd73720..2e625f70 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::*; -- GitLab