From dfac060de856819260c05fd6f09e67d839deb6e2 Mon Sep 17 00:00:00 2001
From: Russel Arbore <russel.jma@gmail.com>
Date: Mon, 11 Sep 2023 10:46:54 -0500
Subject: [PATCH] Parse region and if nodes

---
 hercules_ir/src/parse.rs | 33 +++++++++++++++++++++++++++++++++
 1 file changed, 33 insertions(+)

diff --git a/hercules_ir/src/parse.rs b/hercules_ir/src/parse.rs
index 5f6b3187..5e61e353 100644
--- a/hercules_ir/src/parse.rs
+++ b/hercules_ir/src/parse.rs
@@ -203,6 +203,8 @@ fn parse_node<'a>(
     let ir_text = nom::character::complete::multispace0(ir_text)?.0;
     let (ir_text, node_kind) = parse_identifier(ir_text)?;
     let (ir_text, node) = match node_kind {
+        "region" => parse_region(ir_text, context)?,
+        "if" => parse_if(ir_text, context)?,
         "return" => parse_return(ir_text, context)?,
         "constant" => parse_constant_node(ir_text, context)?,
         "add" => parse_add(ir_text, context)?,
@@ -213,6 +215,37 @@ fn parse_node<'a>(
     Ok((ir_text, (node_name, node)))
 }
 
+fn parse_region<'a>(
+    ir_text: &'a str,
+    context: &RefCell<Context<'a>>,
+) -> nom::IResult<&'a str, Node> {
+    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, preds) = nom::multi::separated_list1(
+        nom::sequence::tuple((
+            nom::character::complete::multispace0,
+            nom::character::complete::char(','),
+            nom::character::complete::multispace0,
+        )),
+        parse_identifier,
+    )(ir_text)?;
+    let ir_text = nom::character::complete::multispace0(ir_text)?.0;
+    let ir_text = nom::character::complete::char(')')(ir_text)?.0;
+    let preds = preds
+        .into_iter()
+        .map(|x| context.borrow_mut().get_node_id(x))
+        .collect();
+    Ok((ir_text, Node::Region { preds }))
+}
+
+fn parse_if<'a>(ir_text: &'a str, context: &RefCell<Context<'a>>) -> nom::IResult<&'a str, Node> {
+    let (ir_text, (control, cond)) = parse_tuple2(parse_identifier, parse_identifier)(ir_text)?;
+    let control = context.borrow_mut().get_node_id(control);
+    let cond = context.borrow_mut().get_node_id(cond);
+    Ok((ir_text, Node::If { control, cond }))
+}
+
 fn parse_return<'a>(
     ir_text: &'a str,
     context: &RefCell<Context<'a>>,
-- 
GitLab