From e457389b0b858b97cf4ae2fe83f0040abcf50dd6 Mon Sep 17 00:00:00 2001 From: Tartasprint <37597624+Tartasprint@users.noreply.github.com> Date: Fri, 18 Oct 2024 11:47:52 +0200 Subject: [PATCH] Band-Aid: fix one of the left recursion bugs (fixes #1047) (#1048) --- meta/src/validator.rs | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/meta/src/validator.rs b/meta/src/validator.rs index eff89969..26ce300f 100644 --- a/meta/src/validator.rs +++ b/meta/src/validator.rs @@ -667,7 +667,13 @@ fn left_recursion<'a, 'i: 'a>(rules: HashMap>) -> Vec None } ParserExpr::Seq(ref lhs, ref rhs) => { - if is_non_failing(&lhs.expr, rules, &mut vec![trace.last().unwrap().clone()]) { + if is_non_failing(&lhs.expr, rules, &mut vec![trace.last().unwrap().clone()]) + || is_non_progressing( + &lhs.expr, + rules, + &mut vec![trace.last().unwrap().clone()], + ) + { check_expr(rhs, rules, trace) } else { check_expr(lhs, rules, trace) @@ -1811,6 +1817,22 @@ mod tests { #[test] #[should_panic(expected = "grammar error + --> 1:14 + | +1 | a = { !\"a\" ~ a } + | ^ + | + = rule a is left-recursive (a -> a); pest::pratt_parser might be useful in this case")] + fn non_progressing_left_recursion() { + let input = "a = { !\"a\" ~ a }"; + unwrap_or_report(consume_rules( + PestParser::parse(Rule::grammar_rules, input).unwrap(), + )); + } + + #[test] + #[should_panic(expected = "grammar error + --> 1:7 | 1 | a = { \"a\"* | \"a\" | \"b\" }