IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Changeset 3395


Ignore:
Timestamp:
Mar 9, 2005, 1:44:18 PM (21 years ago)
Author:
jhoblitt
Message:

change grammar such that all statements are terminated by \n
add metadata support
misc grammar changes

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/PS-IPP-Metadata-Config/lib/PS/IPP/Metadata/Config.pm

    r3358 r3395  
    11# Copyright (c) 2005  Joshua Hoblitt
    22#
    3 # $Id: Config.pm,v 1.2 2005-03-01 23:45:21 jhoblitt Exp $
     3# $Id: Config.pm,v 1.3 2005-03-09 23:44:18 jhoblitt Exp $
    44
    55package PS::IPP::Metadata::Config;
     
    1818#$::RD_TRACE = 1;
    1919#$::RD_HINT = 1;
     20#use Data::Dumper;
    2021
    2122my $grammar = do{ local $/; <DATA> };
     
    4041    my $tree = $self->{_parser}->startrule( $metadata );
    4142
     43    return undef unless defined $tree;
     44
     45    #print Dumper($tree);
     46   
    4247    # remove comment only lines
    4348    $self->_strip_comments( $tree ) or return undef;
     
    6166        my $elem = $tree->[$i];
    6267
    63         if ( $elem->{class} eq "comment_line" ) {
     68        # recurse through nested metadata
     69        if ( $elem->{class} eq "metadata" ) {
     70            $self->_strip_comments( $elem->{value} );
     71        }
     72
     73        # stop if the prevous pass removed the last element and called redo
     74        last unless defined $elem;
     75
     76        if ( $elem->{class} =~ /comment_line|blank_line/ ) {
    6477            # delete element from array
    6578            splice @$tree, $i, 1;
     
    8598    for (my $i = 0; $i < @{$tree}; $i++) {
    8699        my $elem = $tree->[$i];
     100
     101        # recurse through nested metadata
     102        if ( $elem->{class} eq "metadata" ) {
     103            $self->_merge_multi_symbols( $elem->{value} );
     104        }
     105
     106        # stop if the prevous pass removed the last element and called redo
     107        last unless defined $elem;
    87108
    88109        if ( $elem->{class} eq "multi_symbol" ) {
     
    141162        my $elem = $tree->[$i];
    142163
     164        # recurse through nested metadata
     165        if ( $elem->{class} eq "metadata" ) {
     166            $self->_merge_duplicates( $elem->{value} );
     167        }
     168
    143169        if ( exists $names{ $elem->{name} } ) {
    144170            carp "duplicate element name, ", $elem->{name}, "\n";
     
    164190__DATA__
    165191
    166 startrule:
    167     statement(s) /\z/
     192startrule: grammar
     193
     194grammar:
     195    statement(s)
    168196        { $item[1 .. -1] }
    169197
     
    173201    | multi_symbol
    174202    | comment_line
    175 
    176 comment_line:
    177     comment
    178         {{
    179             class   => 'comment_line',
    180             comment => $item{comment}
    181         }}
    182 
    183 comment:
    184     '#' end_of_line
    185         { $item{end_of_line} }
     203    | metadata
     204    | blank_line
     205#    | {
     206#        use Carp qw( croak );
     207#        $text =~ /([^\n]*)/;
     208#        croak "Invalid statement at line $thisline near \"$1\"";
     209#    }
    186210
    187211scalar:
    188     name type value comment
     212    <skip:'[ \t\r]*'> name type value comment "\n"
    189213        {{
    190214            class   => 'scalar',
     
    194218            comment => $item{comment}
    195219         }}
    196     | name type value
     220    | <skip:'[ \t\r]*'> name type value "\n"
    197221        {{
    198222            class   => 'scalar',
     
    203227
    204228vector:
    205     vname vtype vvalue comment
    206         {{
     229     <skip:'[ \t\r]*'> vname vtype vvalue comment "\n"
     230        {{
     231
    207232            class   => 'vector',
    208233            name    => $item{vname},
     
    211236            comment => $item{comment}
    212237         }}
    213     | vname vtype vvalue
     238    | <skip:'[ \t\r]*'> vname vtype vvalue "\n"
    214239        {{
    215240            class   => 'vector',
     
    220245
    221246multi_symbol:
    222     name '*' end_of_line
     247    <skip:'[ \t\r]*'> name '*' to_end_of_line "\n"
    223248        {{
    224249            class   => 'multi_symbol',
    225250            name    => $item{name},
    226             comment => $item{end_of_line},
     251            comment => $item{to_end_of_line},
    227252        }}
     253
     254comment_line:
     255    <skip:'[ \t\r]*'> comment "\n"
     256        {{
     257            class   => 'comment_line',
     258            comment => $item{comment},
     259        }}
     260
     261metadata:
     262    metadata_name grammar metadata_end
     263        {{
     264            class   => 'metadata',
     265            name    => $item{metadata_name},
     266            value   => $item{grammar},
     267         }}
     268
     269blank_line:
     270    <skip:'[ \t\r]*'> "\n"
     271        {{
     272            class   => 'blank_line',
     273            comment => $item{comment},
     274        }}
     275
     276metadata_name:
     277    <skip:'[ \t\r]*'> name /METADATA/i "\n"
     278        { $item{name} }
     279   
     280metadata_end:
     281     <skip:'[ \t\r]*'> /END/i "\n"
     282
     283comment:
     284    '#' to_end_of_line
     285        { $item{to_end_of_line} }
    228286
    229287name:
     
    256314
    257315vvalue:
    258     vvalue_(s)
     316    _vvalue(s)
    259317        { [ map { @$_ } @{$item[1]} ] }
    260318
    261319# backtracking optimization
    262 vvalue_:
     320_vvalue:
    263321    primitive vector_sep(?)
    264322        { [ $item[1] ] }
     
    285343    /\S[^#\n]*/
    286344
    287 end_of_line:
     345to_end_of_line:
    288346    /[^\n]*/
Note: See TracChangeset for help on using the changeset viewer.