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\" }