aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBruce Hill <bruce@bruce-hill.com>2022-05-02 17:23:02 -0400
committerBruce Hill <bruce@bruce-hill.com>2022-05-02 17:23:02 -0400
commite071ac7b12260b4dcbc80f4c864706de29a6d3c9 (patch)
tree3ba3cdf2b8420a8a3d786efdb92071969f61a249
parent892708a651bd6194e3fad242bcf35f0ad868c86e (diff)
Bugfix for left recursion
-rw-r--r--match.c2
-rw-r--r--tests/29-left-recursion3.in1
-rw-r--r--tests/29-left-recursion3.out1
-rw-r--r--tests/29-left-recursion3.sh2
4 files changed, 6 insertions, 0 deletions
diff --git a/match.c b/match.c
index 2252fc3..8231fc0 100644
--- a/match.c
+++ b/match.c
@@ -667,7 +667,9 @@ static match_t *match(match_ctx_t *ctx, const char *str, pat_t *pat)
while (1) {
const char *prev = m->end;
rec_op.args.leftrec.match = m;
+ ctx2.cache = &(cache_t){0};
match_t *m2 = match(&ctx2, str, ref);
+ cache_destroy(&ctx2);
if (!m2) break;
if (m2->end <= prev) {
recycle_match(&m2);
diff --git a/tests/29-left-recursion3.in b/tests/29-left-recursion3.in
new file mode 100644
index 0000000..0830ff2
--- /dev/null
+++ b/tests/29-left-recursion3.in
@@ -0,0 +1 @@
+f!!!
diff --git a/tests/29-left-recursion3.out b/tests/29-left-recursion3.out
new file mode 100644
index 0000000..8ca1cbc
--- /dev/null
+++ b/tests/29-left-recursion3.out
@@ -0,0 +1 @@
+{f!!!}
diff --git a/tests/29-left-recursion3.sh b/tests/29-left-recursion3.sh
new file mode 100644
index 0000000..7de7379
--- /dev/null
+++ b/tests/29-left-recursion3.sh
@@ -0,0 +1,2 @@
+# Left recursion has some tricky edge cases like this:
+bp -p 'shout: phrase `!; phrase: shout / id; phrase => "{@0}"'