Original file: pX/Common/iterator_engine.pl - fglock

TODO

- There are no tests yet for <before>, hashes, end_of_string

- It needs a 'direction' flag, in order to implement <after>.

- Quantified matches could use less stack space.

- Simplify arg list - the functions currently take 8 arguments.

- weaken self-referential things

A "rule" function gets as argument a list:

0 - the string to match 1 - an optional "continuation" 2 - the partially built match tree 3 - a leaf pointer in the match tree 4 - the grammar name 5 - pos #6 - the whole string to match 7 - argument list - <subrule($x,$y)>

it modifies argument #3 to a Match object:

bool  - an "assertion" (true/false)
from  - string pointer for start of this match
to    - string pointer for next match (end+1)
match - positional submatches
named - named submatches
capture - return'ed things

state - a "continuation" or undef
abort - the match was stopped by a { return } or a fail(),
       and it should not backtrack or whatever

A "ruleop" function gets some arguments and returns a "rule" funtion.

sub fail { return abort( sub { return { bool => \0 }; } ); };