Skip Menu |

This queue is for tickets about the Parse-RecDescent CPAN distribution.

Report information
The Basics
Id: 74258
Status: resolved
Priority: 0/
Queue: Parse-RecDescent

People
Owner: Nobody in particular
Requestors: jtbraun [...] CPAN.org
Cc:
AdminCc:

Bug Information
Severity: (no value)
Broken in: 1.966_002
Fixed in: (no value)



Subject: RD_AUTOSTUB does not work with precompiled parsers
So, this works to set RD_TRACE: perl -MParse::RecDescent -s - -RD_TRACE grammar NewMakepp::Grammar Unfortunately, it looks like the path taken by the precompilation fails to actually check for undefined rules. This may be a bug, or may have been intentional, I'll have to follow up with Damian. Even if this were fixed, I'm not sure how useful the '-s' command line option is, as -RD_AUTOSTUB will set $::RD_AUTOSTUB to '1'. An undocumented feature of $::RD_AUTOSTUB is that if it has a boolean-true value, an undefined rule named 'foo' will not get the production foo: 'foo' but instead get the production: foo: $::RD_AUTOSTUB Which, for -s -RD_AUTOSTUB, will generate: foo: '1' 1: '1' Which probably isn't what you wanted in the first place. Long story short, RD_AUTOSTUB doesn't currently work with precompilation of parsers. You'll have to either not precompile, or define your own stub productions. Note that this isn't unique to the command line, but appears to be a problem with the Precompile method. The callstack is something like: script: Parse::RecDescent->Precompile($grammar, $class, $sourcefile) Precompile: $self = Parse::RecDescent->new($grammar,1,$class) new: $self->Replace($grammar, 1, $class) Replace: _generate($self, $grammar, 1(fromsplice), 1, $class); _generate: my ($self, $grammar, $replace, $isimplicit, $isleftop) = (@_, 0); So, the '1' added to @_ from Precompile in the call to new() ends up becoming $isimplicit. $isimplicit prevents $self->_check_grammar() from being called, which is the function that does the RD_AUTOSTUB checking/generation. I'll have to look into why _check_grammar is skipped for $isimplicit cases. There also appears to be another bug here, where the $class parameter gets incorrectly propagated from Precompile into $isleftop inside of _generate, which is probably not correct. Unless I've misread the code somewhere.
Version 1.967001 addresses this. $::RD_AUTOSTUB eq '1' is handled specially, so that "-s -RD_AUTOSTUB" can be provided on the command line. Parse::RecDescent->new() has been updated so that Precompile doesn't cause $isimplicit to be set.