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