TStanley has asked for the wisdom of the Perl Monks concerning the following question:

I am working on a new grammar for my Config::Yacp module so that it can handle comments inside the configuration file. My test script is below:
#!/opt/perl5/bin/perl -w use strict; use Parse::RecDescent; use vars qw ($grammar); $::RD_AUTOACTION=q{print"$item[0]: @item[1..$#item]\n"; 1}; $grammar = q( file: section(s) section: header assign(s?) header: '[' /\w+/ ']' assign: /\w+/ '=' /\w+/ | /\w+/ '=' /\w+/ '' /\s+[\;#]/ /\w+$/ ); my $parser= Parse::RecDescent->new($grammar); my $text; { $/=undef; $text=<DATA>; } my $tree=$parser->file($text); __DATA__ [Section1] key1 = value1 #Comment key2 = value2 ;Comment key3 = value3 [Section2] key4 = value4 key5 = value5
The output from this is:
header: [ Section1 ] assign: key1 = value1 section: 1 ARRAY(0x401da6cc) file: ARRAY(0x401da708)
By printing out $#item in the $::RD_AUTOACTION, I was able to see that it was totally ignoring anything past the value.
Can someone give me a pointer in the right direction?

TStanley
--------

Replies are listed 'Best First'.
Re: Problem with P::RD grammar
by artist (Parson) on May 23, 2003 at 19:00 UTC
    If you set $::RD_TRACE, it would tell you where it stopped working for the first time, by not matching the terminals or rule or subrules.

    The following code works as per what you want.

    $grammar = q( file: section(s) section: header assign(s?) header: '[' /\w+/ ']' assign: pair comment(?) pair: /\w+/ '=' /\w+/ comment: /[\;\#]/ /\w+/ };
    It gives you the output like:
    header: [ Section1 ] pair: key1 = value1 comment: # Comment assign: 1 ARRAY(0x1d5e758) pair: key2 = value2 comment: ; Comment assign: 1 ARRAY(0x2014078) pair: key3 = value3 assign: 1 ARRAY(0x1d5e818) section: 1 ARRAY(0x1d5e74c) header: [ Section2 ] pair: key4 = value4 assign: 1 ARRAY(0x20140cc) pair: key5 = value5 assign: 1 ARRAY(0x1d5e830) section: 1 ARRAY(0x2014090) file: ARRAY(0x2014084)
    The removal of the '$' sign at the end of the 'assign' terms does the trick. I also seperated the comments from the key value pair.

    artist