develooper Front page | perl.recdescent | Postings from January 2012

Re: How to build parser with autostubbing

Thread Previous
From:
jtbraun@cpan.org
Date:
January 28, 2012 21:19
Subject:
Re: How to build parser with autostubbing
Message ID:
4F24D6D6.7020201@cpan.org
Yuri,

Thank you for the bug report.  I've release version 1.967001 on CPAN, 
which should address these issues for you.

Thanks again!
Jeremy


On 1/12/2012 1:42 PM, jtbraun@cpan.org wrote:
> 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.
>
> Please file a ticket for this issue.  I'm out of town for the next 
> week, but will try to get this into a bugfix release next week.  I've 
> included details on the issue below, feel free to include them in the 
> bug.  You can find the ticket tracker for Parse::RecDescent here:
> https://rt.cpan.org/Public/Dist/Display.html?Name=Parse-RecDescent
>
>
>
> 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.
>
>
> On 1/12/2012 10:01 AM, Yuri Shtil wrote:
>> Well, I found as much myself, tried all I could and it did not work.
>>
>> -----Original Message-----
>> From: jtbraun@cpan.org [mailto:jtbraun@cpan.org]
>> Sent: Thursday, January 12, 2012 9:53 AM
>> To: recdescent@perl.org
>> Subject: Re: How to build parser with autostubbing
>>
>> Consult the section on '-s' at http://perldoc.perl.org/perlrun.html:
>>
>>      -s
>>
>>      enables rudimentary switch parsing for switches on the command line
>>      after the program name but before any filename arguments (or before
>>      an argument of --). Any switch found there is removed from @ARGV 
>> and
>>      sets the corresponding variable in the Perl program. The following
>>      program prints "1" if the program is invoked with a -xyz switch, 
>> and
>>      "abc" if it is invoked with -xyz=abc.
>>           #!/usr/bin/perl -s
>>           if ($xyz) { print "$xyz\n" }
>>
>>      Do note that a switch like --help creates the variable ${-help} ,
>>      which is not compliant with use strict "refs" . Also, when using
>>      this option on a script with warnings enabled you may get a lot of
>>      spurious "used only once" warnings.
>>
>>
>> So this is probably what you want:
>>
>>     perl -MParse::RecDescent -s -RD_AUTOSTUB - grammar 
>> NewMakepp::Grammar
>>
>> Untested, you may need to move -s, '-RD_AUTOSTUB  and the '- grammar 
>> ...' arguments around to make it work.
>>
>> On 1/12/2012 9:39 AM, Yuri Shtil wrote:
>>> The documentation is a little unclear
>>>
>>> I use perl -MParse::RecDescent - grammar NewMakepp::Grammar to 
>>> create a parser module.
>>>
>>> What do I do in order to generate stubs for undefined rules?
>>> How do I pass RD_AUTOSTUB?
>>>
>>> ----------------------------------------------------------------------
>>> ------------- This email message is for the sole use of the intended
>>> recipient(s) and may contain confidential information.  Any
>>> unauthorized review, use, disclosure or distribution is prohibited.
>>> If you are not the intended recipient, please contact the sender by
>>> reply email and destroy all copies of the original message.
>>> ----------------------------------------------------------------------
>>> -------------
>>>
>


Thread Previous


nntp.perl.org: Perl Programming lists via nntp and http.
Comments to Ask Bjørn Hansen at ask@perl.org | Group listing | About