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