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>(