Fix for left recursion error due to wrong context

This commit is contained in:
Bruce Hill 2021-10-02 12:38:42 -07:00
parent 304d5c35a8
commit 486fe98a9c
2 changed files with 8 additions and 6 deletions

11
match.c
View File

@ -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;

View File

@ -83,9 +83,10 @@ typedef struct pat_s {
} capture;
struct {
struct match_s *match;
unsigned int visits;
const char *at;
struct pat_s *fallback;
void *ctx;
bool visited;
} leftrec;
struct {
const char *start, *end, *msg;