Recursion

Recursion allows you to recursively match the entire expression.

Syntax

let Recursion = 'recursion';

Example

One can parse mathematical terms with the following:

let op = ['+-/*'];
let num = [digit]+;

'-'? (num | '(' recursion ')') atomic(op recursion)*

Care is needed to avoid ambiguity when possible, to prevent infinite recursion or excessive backtracking.

Support

Recursion is only supported in PCRE and Ruby.

Support for recursion is gated by the recursion feature. Specify features with the --allowed-features option.

Behavior

When a recursion expression is encountered, the regex engine saves the state of the match and starts over matching the whole regular expression at the current position. When the match succeeds, it restores the previous state and continues. Repeated recursions form a stack, similar to how recursion works in programming languages. It is possible to backtrack from/into recursion; this can be limited with atomic groups.

Compilation

Recursion compiles to \g<0>, which is equivalent to calling the 0’th capturing group as subroutine, since regex engines implicitly create a capturing group with index 0 containing the whole match.

Issues

Pomsky does not detect infinite recursion. Recursion can also cause excessive backtracking.

History

  • Added recursion in Pomsky 0.11