Perl parses Perl by running Perl. That’s the trick nobody else can pull off, and it’s why Perl tooling either leans on a runtime (with the install friction and latency that implies) or gives up on the hard cases.
It started by trying to build a tree-sitter-compatible AST for Perl in Rust after tree-sitter-perl kept breaking our internal AST context-packing tooling. Pest looked like the obvious way to get there. That lasted one week before it hit a backtracking wall. A year and 600,000 lines of Rust later, we had most of a Perl compiler front-end: lexer, parser, AST, scope resolution, symbol tables, method resolution order. Everything Perl does at parse time. Nothing it does at runtime.
This talk walks through what broke, what worked, and where honest static analysis stops on a language that can rewrite itself at runtime.