File Coverage

blib/lib/Parse/Highlife/Rule/Repetition.pm
Criterion Covered Total %
statement 9 35 25.7
branch 0 4 0.0
condition 0 6 0.0
subroutine 3 6 50.0
pod 0 2 0.0
total 12 53 22.6


line stmt bran cond sub pod time code
1             package Parse::Highlife::Rule::Repetition;
2              
3 1     1   6 use strict;
  1         2  
  1         49  
4 1     1   5 use base qw(Parse::Highlife::Rule);
  1         2  
  1         77  
5 1     1   6 use Parse::Highlife::Utils qw(params);
  1         8  
  1         373  
6              
7             sub new
8             {
9 0     0 0   my( $class, @args ) = @_;
10 0           my $self = bless Parse::Highlife::Rule->new( @args ), $class;
11 0           return $self -> _init( @args );
12             }
13              
14             sub _init
15             {
16 0     0     my( $self, $repetition, $min, $max )
17             = params( \@_,
18             -repetition => '',
19             -min => 0,
20             -max => 0, # 0 = unlimited
21             );
22 0           $self->{'repetition'} = $repetition;
23 0           $self->{'min'} = $min;
24 0           $self->{'max'} = $max;
25 0           return $self;
26             }
27              
28             sub parse_from_token
29             {
30 0     0 0   my( $self, $parser, $tokens, $t ) = @_;
31             # - turn list of subrules into a single SEQ() rule
32             # - try to parse SEQ() rule until failure
33             # - if no success at all: return failure, else return result
34            
35 0           my $subrule = $parser->get_rule( $self->{'repetition'} );
36              
37 0           my $_t = $t;
38 0           my ($_status, $_result);
39 0           my @results;
40 0           my $n = 0;
41 0           while (1) {
42 0           my $prev_t = $_t;
43 0           ($_t) = $self->_parse_ignored_tokens( $tokens, $_t );
44 0           ($_status, $_t, $_result) = $subrule->wrap_parse_from_token( $parser, $tokens, $_t );
45 0 0         unless ($_status) {
46 0           $_t = $prev_t;
47 0           last;
48             }
49 0           push @results, $_result;
50 0           $n++;
51             }
52            
53 0 0 0       if( scalar @results >= $self->{'min'} &&
      0        
54             ( scalar @results <= $self->{'max'} || $self->{'max'} == 0 ) ) {
55             return (
56 0           1,
57             $_t,
58             $parser->make_ast_element('group', $self->{'name'}, \@results)
59             );
60             }
61             else {
62 0           return(0,0,0);
63             }
64             }
65              
66             1;