Fix for left recursion error due to wrong context
This commit is contained in:
parent
304d5c35a8
commit
486fe98a9c
11
match.c
11
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;
|
||||
|
Loading…
Reference in New Issue
Block a user