From 0e96b8551b5293ffeadfebc31b85a165b0a74b99 Mon Sep 17 00:00:00 2001
From: Bobby Bingham <koorogi@koorogi.info>
Date: Tue, 25 Jul 2017 21:08:44 -0500
Subject: create general regex simplification pass

Move the previous special-case logic for removing 1-1 repeats into this
pass.
---
 regex.c | 35 +++++++++++++++++++++++++++++++++++
 1 file changed, 35 insertions(+)
 create mode 100644 regex.c

(limited to 'regex.c')

diff --git a/regex.c b/regex.c
new file mode 100644
index 0000000..63bd748
--- /dev/null
+++ b/regex.c
@@ -0,0 +1,35 @@
+#include <stdlib.h>
+
+#include "ast.h"
+
+static void repeat(struct atom *a)
+{
+	struct atom *child = a->u.repeat.child;
+	simplify(child);
+
+	const struct repeat *r = &a->u.repeat.counts;
+	if (r->min == 1 && r->max == 1) {
+		*a = *child;
+		free(child);
+	}
+}
+
+static void children(struct atom *a)
+{
+	simplify(a->u.children[0]);
+	simplify(a->u.children[1]);
+}
+
+void simplify(struct atom *a)
+{
+	switch (a->type) {
+	case ATOM_REPETITION:
+		repeat(a);
+		break;
+
+	case ATOM_ALTERNATION:
+	case ATOM_SEQUENCE:
+		children(a);
+	}
+}
+
-- 
cgit v1.2.3