From 486fe98a9c7f751998aeb6837dabfea7ac33938d Mon Sep 17 00:00:00 2001 From: Bruce Hill Date: Sat, 2 Oct 2021 12:38:42 -0700 Subject: Fix for left recursion error due to wrong context --- match.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) (limited to 'match.c') diff --git a/match.c b/match.c index 17f88bb..461148d 100644 --- a/match.c +++ b/match.c @@ -335,10 +335,10 @@ static match_t *match(match_ctx_t *ctx, const char *str, pat_t *pat) // point, it can be handled with normal recursion. // See: left-recursion.md for more details. if (str == pat->args.leftrec.at) { - ++pat->args.leftrec.visits; + pat->args.leftrec.visited = true; return clone_match(pat->args.leftrec.match); } else { - return match(ctx, str, pat->args.leftrec.fallback); + return match(pat->args.leftrec.ctx, str, pat->args.leftrec.fallback); } } case BP_ANYCHAR: { @@ -631,9 +631,10 @@ static match_t *match(match_ctx_t *ctx, const char *str, pat_t *pat) .min_matchlen = 0, .max_matchlen = -1, .args.leftrec = { .match = NULL, - .visits = 0, + .visited = false, .at = str, - .fallback = ref, + .fallback = pat, + .ctx = (void*)ctx, }, }; match_ctx_t ctx2 = *ctx; @@ -652,7 +653,7 @@ static match_t *match(match_ctx_t *ctx, const char *str, pat_t *pat) match_t *m = match(&ctx2, str, ref); // If left recursion was involved, keep retrying while forward progress can be made: - if (m && rec_op.args.leftrec.visits > 0) { + if (m && rec_op.args.leftrec.visited) { while (1) { const char *prev = m->end; rec_op.args.leftrec.match = m; -- cgit v1.2.3