Limits

Fixed ceilings. Most of them are large enough that a grammar meets none of them; the small ones are small on purpose, and say so.

The grammar

limit

actions in one program

65,535

semvar sets

16

scopes

16

positions in one scope

4

arms in one binding-power table

64

items in one character class

65,535

programs linked into one run

64

Sixteen semvar sets is a ceiling, not an oversight: a set is a global thing a whole grammar shares, and a grammar that wants a seventeenth usually wants a scope instead.

Sixteen scopes for the same reason, and it follows from the sets. A scope is a depth counter, and what a depth counter is for is emptying the sets bound to it — a scope with nothing bound to it is refused. So a seventeenth scope could only ever govern a set one of the first sixteen already governs. Declaring one is an error, not a silent truncation.

The run

limit

variable stack

64 KiB, or 64 MiB if it is allowed to grow

binding-power nesting

128 levels

nesting of one ordered scope

its buffer, 64 bytes by default

Plugins

limit

shared libraries per run

8

foreign symbols bound

64

length of a foreign name

96 bytes

What is not limited

The input, the AST, a semvar set, and how deep a rule may call itself are all bounded by memory rather than by a constant. An action that recurses without consuming will exhaust the variable stack and be told so.