Fix combinatorial explosion on backtracking broken if chains

Signed-off-by: Marcel Müller <neikos@neikos.email>
This commit is contained in:
Marcel Müller 2026-03-09 16:21:23 +01:00
parent b0620a00d5
commit 3f549690c1
3 changed files with 9 additions and 3 deletions

View file

@ -346,7 +346,7 @@ fn parse_conditional_chain<'input>(
chain.push(if_block); chain.push(if_block);
let content = resume_after_cut( let content = resume_after_cut(
inner_conditional_chain, cut_err(inner_conditional_chain),
repeat_till(0.., any, parse_end).map(|((), _)| ()), repeat_till(0.., any, parse_end).map(|((), _)| ()),
) )
.parse_next(input)?; .parse_next(input)?;
@ -387,7 +387,7 @@ fn inner_conditional_chain<'input>(
}; };
if !is_end && needs_end { if !is_end && needs_end {
return Err(AstError::from_input(input).cut()); return Err(AstError::from_input(input));
} }
if let TemplateAstExpr::Block { expression, .. } = &end_block if let TemplateAstExpr::Block { expression, .. } = &end_block

BIN
tests/checks/long.nomo Normal file

Binary file not shown.

View file

@ -31,7 +31,13 @@ fn check_cases() {
insta::assert_debug_snapshot!("1-parsed", parsed); insta::assert_debug_snapshot!("1-parsed", parsed);
let ast = nomo::ast::parse(parsed.tokens()).unwrap(); let ast = match nomo::ast::parse(parsed.tokens()) {
Ok(ast) => ast,
Err(err) => {
eprintln!("{}", err.to_report(input));
panic!("Could not evaluate ast");
}
};
insta::assert_debug_snapshot!("2-ast", ast); insta::assert_debug_snapshot!("2-ast", ast);