Skip to content

Commit

Permalink
Band-Aid: fix one of the left recursion bugs (fixes #1047) (#1048)
Browse files Browse the repository at this point in the history
  • Loading branch information
Tartasprint authored Oct 18, 2024
1 parent 105e45e commit e457389
Showing 1 changed file with 23 additions and 1 deletion.
24 changes: 23 additions & 1 deletion meta/src/validator.rs
Original file line number Diff line number Diff line change
Expand Up @@ -667,7 +667,13 @@ fn left_recursion<'a, 'i: 'a>(rules: HashMap<String, &'a ParserNode<'i>>) -> 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)
Expand Down Expand Up @@ -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\" }
Expand Down

0 comments on commit e457389

Please sign in to comment.