diff --git a/hercules_ir/src/ir.rs b/hercules_ir/src/ir.rs index ea239fdd4d91eb5754c1c58c29ad34618593cc0c..36638498f385fce73c5fd33f9926d3fbd40953f9 100644 --- a/hercules_ir/src/ir.rs +++ b/hercules_ir/src/ir.rs @@ -51,6 +51,7 @@ pub enum Constant { #[derive(Debug, Clone, PartialEq, Eq, Hash)] pub enum DynamicConstant { Constant(usize), + Parameter(usize), } #[derive(Debug, Clone)] diff --git a/hercules_ir/src/parse.rs b/hercules_ir/src/parse.rs index 1c2f67aa76c7763960c9d1da5cb62de14c51bdcc..acdd92ad1ea28da8f557a796cd83f8d7cf7b0f52 100644 --- a/hercules_ir/src/parse.rs +++ b/hercules_ir/src/parse.rs @@ -330,7 +330,31 @@ fn parse_dynamic_constant_id<'a>( ir_text: &'a str, context: &mut Context<'a>, ) -> nom::IResult<&'a str, DynamicConstantID> { - todo!() + let (ir_text, dynamic_constant) = parse_dynamic_constant(ir_text)?; + let id = context.get_dynamic_constant_id(dynamic_constant); + Ok((ir_text, id)) +} + +fn parse_dynamic_constant<'a>(ir_text: &'a str) -> nom::IResult<&'a str, DynamicConstant> { + let ir_text = nom::character::complete::multispace0(ir_text)?.0; + let parse_usize = |x: &'a str| -> nom::IResult<&'a str, usize> { + let (ir_text, num_text) = nom::bytes::complete::is_a("-1234567890")(x)?; + let num = num_text.parse::<usize>().map_err(|_| { + nom::Err::Error(nom::error::Error { + input: num_text, + code: nom::error::ErrorKind::IsNot, + }) + })?; + Ok((ir_text, num)) + }; + let (ir_text, dc) = nom::branch::alt(( + nom::combinator::map(parse_usize, |x| DynamicConstant::Constant(x)), + nom::combinator::map( + nom::sequence::tuple((nom::character::complete::char('#'), parse_usize)), + |(_, x)| DynamicConstant::Parameter(x), + ), + ))(ir_text)?; + Ok((ir_text, dc)) } fn parse_constant_id<'a>(