From b58654e89a45d624d15841c595553620d09f8755 Mon Sep 17 00:00:00 2001 From: Russel Arbore <russel.jma@gmail.com> Date: Sun, 10 Sep 2023 15:53:33 -0500 Subject: [PATCH] Parse dynamic constant --- hercules_ir/src/ir.rs | 1 + hercules_ir/src/parse.rs | 26 +++++++++++++++++++++++++- 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/hercules_ir/src/ir.rs b/hercules_ir/src/ir.rs index ea239fdd..36638498 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 1c2f67aa..acdd92ad 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>( -- GitLab