The Squirrel Parser: A Linear-Time PEG Packrat Parser Capable of Left Recursion and Optimal Error Recovery
Luke A. D. Hutchison
TL;DR
The paper presents the Squirrel parser, a PEG packrat parser that directly handles all forms of left recursion while delivering optimal error recovery with $O(n \cdot |G|)$ time and space. It derives a minimal algorithm from first principles using cycle detection, per-position state, iterative seed growth, and version-tagged memoization to compute the least fixed point of left recursive cycles. For error recovery, it establishes a two-phase design guided by foundational axioms and constraints, including phase isolation and bounded recovery, and proves completeness, correctness, and minimality. The results include a formal, implementable algorithm with a unified Match type system and phase tracking, a tight complexity bound, and extensive testing across 631 scenarios, demonstrating robust, scalable PEG parsing without grammar rewriting or annotation overhead.
Abstract
We present the squirrel parser, a PEG packrat parser that directly handles all forms of left recursion with optimal error recovery, while maintaining linear time complexity in the length of the input even in the presence of an arbitrary number of errors. Traditional approaches to handling left recursion in a recursive descent parser require grammar rewriting or complex algorithmic extensions. We derive a minimal algorithm from first principles: cycle detection via per-position state tracking and $O(1)$-per-LR-cycle communication from descendant to ancestor recursion frames, and fixed-point search via iterative expansion. For error recovery, we derived a set of four axioms and twelve constraints that must be imposed upon an optimal error recovery design to ensure completeness, correctness, optimality of performance, and intuitiveness of behavior. We utilized a constraint satisfaction mechanism to search the space of all possibilities, arriving at a provably optimal and robust error recovery strategy that maintains perfect performance linearity.
