Please see my test case below. When I try the skip value
<skip: '(?:[ \t]|\\\n)+'> then the text parses, but the
backslashes are consumed as "value"s instead of being ignored:

$top = {
         'AIF' => [
                    'Videorecorder.aif',
                    '..\\aif',
                    'Videorecorderaif.rss',
                    '\\',
                    'c8',
                    'qgn_menu_videocam_cxt.bmp',
                    'qgn_menu_videocam_cxt_mask.bmp',
                    '\\',
                    'qgn_menu_videocam_lst.bmp',
                    '"qgn_menu_videocam_lst_mask.bmp"'
                  ]
       };

I don't want to use negative look-ahead here, because the
backslashes are legal "value"s when not at the end of line.

And the <skip: '(?:[ \t]|\\[ \t]*\n)+'> doesn't parse here.

How could I skip the \ \n properly? Thank you

Regards
Alex


#!/usr/bin/perl

use strict;
use vars qw($parser $text %top);
use Data::Dumper;
use Parse::RecDescent;
#$RD_WARN  = 1;
#$RD_HINT  = 1;
#$RD_TRACE = 120;
use constant GRAMMAR => q(

mmpfile: chunk(s) /^\Z/
chunk: assignment | <error>
assignment: keyword <skip: '(?:[ \t]|\\[ \t]*\n)+'> value(s) {
        my $href = \%::top;
        push @{$href->{uc $item{keyword}}}, @{$item[3]};
}
value:  /"[^"]*"/ | ...!keyword /\S+/
keyword: 
        /AIF\b/i

);

$parser = Parse::RecDescent->new(GRAMMAR) or die 'Bad grammar';
$text .= $_ while (<DATA>);
defined $parser->mmpfile($text) or die 'Bad text';
print Data::Dumper->Dump([\%top], [qw(top)]);

__DATA__
AIF Videorecorder.aif ..\aif Videorecorderaif.rss \
    c8  qgn_menu_videocam_cxt.bmp qgn_menu_videocam_cxt_mask.bmp \ 
qgn_menu_videocam_lst.bmp "qgn_menu_videocam_lst_mask.bmp" 

Reply via email to