Re: PRD parser expontentially slower with larger files

[email protected] ("Sean O'Rourke") Thu, 30 Nov 2006 09:21:03 -0800
Newsgroups perl.recdescent
Message-ID <[email protected]>
Inlining some rules into their parents and tossing in a (probably
unnecessary) <commit> yields something about 1/3 faster:

    $parser2 = new Parse::RecDescent(<<'EOS');
    dictionary : '{' key_value(s /\|/) '}'
    	{ $return = { map { $_->[0] => $_->[1] } @{$item[2]} } }
    dictionary2 : key_value(s /\|/) '}'
    	{ $return = { map { $_->[0] => $_->[1] } @{$item[1]} } }
    key_value : /[A-Za-z0-9_ ]+/ '=' value
    	{ $return = [ @item[1,3] ] }
    value : '{' <commit> dictionary2 { $return = $item[3] }
          | /[^|\}]*/
    EOS

Calling new rules is slow, as is backtracking, but P::RD can't be
speedy.  You might try Perl6::Rules, which compiles to a regex.
If you're lucky, it won't tickle any of the bugs in /(??{ ... })/
for your particular grammar, and should be faster.

/s