Cópia estática
Copiado de docs/adp/ADP-005-parser-recursion-bounds.md em https://github.com/poppy-team/aipo-lang (MIT). Fixado na revisão ce47c4e070404fc41722ccd8e2b7b808b99062a8, blob 9c2a400025e014aae3b2d2509bbee36a8bc0117c. O repositório de origem permanece canônico; esta cópia é atualizada por um pull request de sincronização, não em tempo real.
Status: aceito (implementado com este gauntlet; os limites são bounds de robustez) Relacionado: AIPO_PARSE_NESTING_TOO_DEEP (catálogo de diagnósticos), crates/aipo-syntax (guardas de profundidade + garantia de progresso), crates/aipo-cli/tests/resource.rs, docs/evidence/P01-G02-*.mdAutoridade: subordinada à Language Reference (que não define nenhum requisito de aninhamento) e à política de não invenção
SIGABRT, exit 134): ((((…)))) acima de ~500–800 níveis e if aninhado acima de ~300–600 níveis em uma main stack de 8 MiB. Um abort nunca é comportamento canônico: a estratégia de testes já exige que nenhum panic do Rust (e, por extensão, nenhum crash do host) escape como erro de usuário do Aipo.2 MiB / 27 KiB ≈ 74 níveis para valer também em threads de teste de 2 MiB.while !terminator { parse_stmt … }) assumem que toda falha de parse consome entrada, de modo que qualquer falha que não consuma trava esses loops para sempre. A primeira versão da guarda de profundidade disparou exatamente esse caminho.1 + 1 + … de 5000 termos, um f"…" com 500 placeholders), que abortam os walkers recursivos posteriores (HIR lowering e adiante). A correção é um post-pass iterativo de profundidade da AST em aipo_syntax::parse (depth.rs, exaustivo sobre toda forma recursiva da AST, de modo que uma nova forma seja um erro de compilação, não uma brecha).AIPO_PARSE_NESTING_TOO_DEEP (severidade error), apontando para o token ofensor. Reutilizar AIPO_PARSE_UNEXPECTED_TOKEN descreveria mal o problema e prejudicaria o rubric de acessibilidade dos diagnósticos; um código dedicado é o sinal honesto.parse_stmt que não consumiu nada avança um token. Comprovadamente, esse caminho nunca dispara em entradas que já terminavam (elas sempre faziam progresso, caso contrário já travariam), de modo que o comportamento de recuperação observável ali permanece inalterado por construção.if de 300 níveis passa pelo lowering sem problemas), mas não tem guarda separada; o limite do parser restringe tudo o que vem depois. Se uma construção futura recursar fora do parser, ela ganha sua própria entrada de ADP.