Particularly I had no idea I can add a closure to the grammar and use it as part of a virtual main package
It's not really a closure. The block is inlined at the start of the generated parser code. You should check out Grammar.pm after executing:
use Parse::RecDescent my $grammar = ...; Parse::RecDescent->Precompile($grammar, "Grammar");
That block is documented as Start-up Actions.
I particularly do not understand the '' construct. it will always match right?
Yes, but remember that P::RD removes /$skip/ from the input before every terminal in the grammar. The current value of skip is '\\s*', so '' removes all leading whitespace.
That whole thing allows blank lines between key_value, but not within key_value.
In reply to Re^3: Parse::RecDescent trouble
by ikegami
in thread Parse::RecDescent trouble
by ribasushi
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |