File Coverage

YappRcsParser.yp
Criterion Covered Total %
statement 106 138 76.8
branch 76 118 64.4
condition n/a
subroutine 30 35 85.7
pod 0 5 0.0
total 212 296 71.6


line stmt bran cond sub pod time code
1             %{
2              
3             ##########################################################################
4             #
5             # This is the Parse::Yapp grammar file. To reproduce a modul out of it
6             # you should have CPAN module Parse::Yapp installed on your
7             # system and run
8             #
9             #yapp -s -m'VCS::Rcs::YappRcsParser' -o'lib/Rcs/YappRcsParser.pm' YappRcsParser.yp
10             #
11             # But you won't need Parse::Yapp unless you want to reproduce the module.
12             #
13             #
14             # Here is Parse::Yapp's COPYRIGHT
15             #
16             # The Parse::Yapp module and its related modules and shell
17             # scripts are copyright (c) 1998-2001 Francois Desarmenien,
18             # France. All rights reserved.
19             #
20             # You may use and distribute them under the terms of either
21             # the GNU General Public License or the Artistic License, as
22             # specified in the Perl README file.
23             #
24             # If you use the "standalone parser" option so people don't
25             # need to install Parse::Yapp on their systems in order to
26             # run you software, this copyright noticed should be
27             # included in your software copyright too, and the copyright
28             # notice in the embedded driver should be left untouched.
29             #
30             # End of Parse::Yapp's COPYRIGHT
31             #
32             #
33             # Copyright (c) 2001 by RIPE-NCC. All rights reserved.
34             #
35             # This program is free software; you can redistribute it and/or
36             # modify it under the same terms as Perl itself.
37             #
38             # You should have received a copy of the Perl license along with
39             # Perl; see the file README in Perl distribution.
40             #
41             # You should have received a copy of the GNU General Public License
42             # along with Perl; see the file Copying. If not, write to
43             # the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
44             #
45             # You should have received a copy of the Artistic License
46             # along with Perl; see the file Artistic.
47             #
48             # NO WARRANTY
49             #
50             # BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
51             # FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
52             # OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
53             # PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
54             # OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
55             # MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
56             # TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
57             # PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
58             # REPAIR OR CORRECTION.
59             #
60             # IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
61             # WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
62             # REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
63             # INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
64             # OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
65             # TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
66             # YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
67             # PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
68             # POSSIBILITY OF SUCH DAMAGES.
69             #
70             # END OF TERMS AND CONDITIONS
71             #
72             #
73             #
74             ##########################################################################
75              
76             require 5.8.0;
77              
78 2     2   2447 use VCS::Rcs::Deltatext;
  2         7  
  2         74  
79              
80 2     2   11 use Data::Dumper;
  2         3  
  2         13341  
81              
82             our ($VERSION) = (q$Revision: 1.11 $ =~ /([\d\.]+)/);
83              
84             my $dt;
85             my $input;
86             my $state;
87             my $ft;
88             # my $init_rev_no;
89             my $revs_to_co;
90             my $dates_to_co;
91              
92             our $debug = 0;
93              
94             %}
95              
96             %start rcstext
97 8     8 0 21  
98 8 50       27 %%
99              
100             rcstext:
101 8 50   8   37 admin {warn "admin OK\n" if $debug}
102 8 50   8   38 delta {warn "delta OK\n" if $debug}
103 8 50   8   35 desc {warn "desc OK\n" if $debug}
104 8 50   8   40 deltatext
105             {warn "Parsed OK!\n" if $debug;}
106 8 50   8   32 ;
107              
108             admin: head {warn "head OK\n" if $debug}
109 8 50   8   31 branch {warn "branc OK\n" if $debug}
110 8 50   8   43 access {warn "acces OK\n" if $debug}
111 8 50   8   37 symbols {warn "symbl OK\n" if $debug}
112 8 50   8   42 locks strict {warn "lock OK\n" if $debug}
113 8 50   8   41 comment {warn "commt OK\n" if $debug}
114 8 50   8   35 expand {warn "expan OK\n" if $debug}
115 8 50   8   30 newphrase
116             ;
117              
118             head: HEAD ';' | HEAD num ';' #{$ta->{LastRev} = $_[2][0];}
119             ;
120              
121             branch: /* empty */
122             {warn "branch OK(EMPTY)\n" if $debug}
123 0     0   0 | BRANCH {$state='nums'} nums ';'
124 0 0   0   0 {warn "branch OK",$_[1]," ",$_[3][0],"\n" if $debug}
125 8 50   8   33 ;
126              
127             access: ACCESS ';'
128             {warn "access OK",$_[1],"\n" if $debug}
129 0     0   0 | ACCESS {$state='ids'} ids ';'
130 0 0   0   0 {warn "access OK",$_[1]," ",$_[3][0],"\n" if $debug}
131 8     8   22 ;
132              
133             symbols: SYMBOLS {$state='symnums'} symnums ';'
134 8     8   26 ;
135              
136             locks: LOCKS {$state='idnums'} idnums ';'
137 56     56   173 ;
138              
139             strict: /* empty */ | STRICT ';'
140             ;
141              
142             comment: /* empty */
143             | COMMENT ';'
144             | COMMENT string ';'
145             #{$ta->{Comment} = $_[2][0];}
146             ;
147              
148             expand: /* empty */
149             | EXPAND ';'
150             | EXPAND string ';'
151             ;
152              
153              
154              
155             delta: /* empty */
156             | delta
157             num
158             DATE num ';'
159             AUTHOR id ';'
160             STATE {$state='ido'} ido ';'
161 56     56   178 BRANCHES {$state='nums'} nums ';'
162 56     56   12449 NEXT {$state='nums'} nums ';'
163 56     56   215 newphrase
164             {&as_other( $_[2][0], $_[4][0]);}
165 8     8   40 ;
166              
167              
168             desc: DESC string
169             {&revs_to_co();}
170 56     56   192 ;
171              
172              
173             deltatext: /* empty */
174             | deltatext
175             num
176             LOG string
177             newphrase
178             TEXT {$state='longstring';} string
179             {
180 56 50   56   156 print STDERR $_[2][0]," \r" if($debug);
181 56         252 &co_rev( $_[8][0], $_[2][0] );
182             }
183 8         2439 ;
184              
185              
186             newphrase: /* empty */ | newphrase id word ';'
187             ;
188              
189             word: /* empty */ | id | num | string | ':'
190             ;
191              
192             %%
193              
194             sub revs_to_co {
195 8     8 0 19 my $revs = $revs_to_co;
196              
197 8 50       19 unless ($dates_to_co) {
198 8         53 $dt->revs2co($revs);
199 8         21 return;
200             }
201              
202 0         0 my $rev;
203             my $rdate;
204 0         0 my %date;
205              
206 0         0 for $rev ($dt->revs) {
207 8         156 $rdate = $dt->date($rev);
  0         0  
208 0 0       0 $rdate = '19'.$rdate if (length($rdate) == 17);
209 0         0 $date{$rdate} = $rev;
210             }
211              
212 0         0 my @alldates = sort keys %date;
213 0         0 my @dates2add = @$dates_to_co;
214              
215 0         0 my $bi=0;
216 0         0 my($a,$b,@dates2add_proper);
217              
218 0         0 for $b (@dates2add) {
219 0         0 for $a (@alldates) {
220 0 0       0 $dates2add_proper[$bi]=$a if ($a lt $b);
221             }
222 0         0 $bi++;
223             }
224              
225 0         0 for (@dates2add_proper) {
226 0 0       0 push @$revs, $date{$_} if (defined $date{$_});
227             }
228              
229 0 0       0 if($debug){
230 0         0 print STDERR "$_\n" for(@$revs);
231 0         0 print STDERR "$_\n" for(@dates2add_proper);
232 0         0 print STDERR "$_\n" for(@dates2add);
233             }
234              
235 0         0 $dt->revs2co($revs);
236             }
237              
238             sub as_other {
239 56     56 0 90 my $rev = shift;
240 56         77 my $date = shift;
241              
242             # $init_rev_no = $rev;
243              
244 56         546 $dt->date($rev, $date);
245             }
246              
247             sub co_rev {
248 56     56 0 83 my $ptext = shift;
249 56         104 my $rev = shift;
250            
251 56 100       119 if ($ft) {
252 8         14 $ft = 0;
253 8         45 $dt->lastrev($ptext, $rev);
254 8         47 return;
255             }
256              
257 48         13412 $dt->deltarev($ptext, $rev);
258             }
259              
260             sub _Error {
261              
262             exists $_[0]->YYData->{ERRMSG}
263 0 0   0   0 and do {
264 0         0 print $_[0]->YYData->{ERRMSG};
265 0         0 delete $_[0]->YYData->{ERRMSG};
266 0         0 return;
267             };
268 0         0 warn "\nSyntax error.\n";
269              
270             }
271              
272              
273             sub _Lexer {
274 1328     1328   3067 my($parser)=shift;
275              
276             #
277             # EOF
278             #
279 1328 50       3698 pos($$input) >= length($$input) and return('',[ undef, -1 ]);
280              
281              
282             #
283             # longstring
284             #
285 1328 100       9233 $state eq 'longstring' and do {
286              
287 56         105 $state = 'norm';
288              
289 56 50       447 return('',[ undef, -1 ]) if ($$input !~ m/\G[\s\n]*@/sgc);
290              
291 56         132 my $text_tmp='';
292 56         67 my $text;
293 56         359 while ($$input =~ m/\G((?:[^@\n]|@@)*\n?)/gcs) {
294 3474         6829 $text_tmp = $1;
295 3474         8734 $text_tmp =~ s/@@/@/g;
296 3474         49592 $text .= $text_tmp;
297             }
298 56 50       289 return('',[ undef, -1 ]) if ($$input !~ m/\G[\s\n]*@/sgc);
299              
300 56         1493 return('string',[\$text]);
301             };
302              
303              
304             #
305             # Ignore blanks
306             #
307 1272         4370 $$input=~m/\G\s+/scg;
308            
309              
310             #
311             # norm
312             #
313 1272 100       3809 $state eq 'norm' and do {
314              
315             # SIMPLE TOKENS
316 1088 100       2590 $$input =~ m/\Ghead/gc and return('HEAD', 'head');
317              
318 1080 100       2178 $$input =~ m/\Gbranches/gc and return('BRANCHES','branches');
319 1024 50       2901 $$input =~ m/\Gbranch/gc and return('BRANCH', 'access');
320              
321 1024 100       2610 $$input =~ m/\Gaccess/gc and return('ACCESS', 'access');
322 1016 100       2460 $$input =~ m/\Gsymbols/gc and return('SYMBOLS', 'symbols');
323 1008 100       2055 $$input =~ m/\Glocks/gc and return('LOCKS', 'locks');
324 1000 100       2003 $$input =~ m/\Gstrict/gc and return('STRICT', 'strict');
325 992 100       2818 $$input =~ m/\Gcomment/gc and return('COMMENT', 'comment');
326              
327 984 100       6954 $$input =~ m/\Gdate/gc and return('DATE', 'date');
328 928 100       2642 $$input =~ m/\Gauthor/gc and return('AUTHOR', 'author');
329 872 100       1956 $$input =~ m/\Gstate/gc and return('STATE', 'state');
330              
331 816 100       1618 $$input =~ m/\Gnext/gc and return('NEXT', 'next');
332            
333 760 100       11309 $$input =~ m/\Glog/gc and return('LOG', 'log');
334 704 100       1696 $$input =~ m/\Gtext/gc and return('TEXT', 'text');
335              
336 648 100       1396 $$input =~ m/\Gdesc/gc and return('DESC', 'desc');
337            
338 640 100       2696 $$input =~ m/\G;/gc and return(';', ';');
339 312 50       626 $$input =~ m/\G:/gc and return(':', ';');
340              
341              
342             # num
343 312 100       2450 $$input =~ m/\G([\d\.]+)/gc and return('num', [$1]);
344              
345              
346             # id
347 136 100       1174 $$input =~ m/\G
348             ((?:[\d\.]+)?) # {num}
349             ([^\$,\.:;@\x00-\x1F]) # idchar
350             ([^\$,\.:;@\x00-\x1F]|(?:[\d\.]+))* # {idchar | num}*
351             /xgc
352             and return('id', [$1,$2,$3] );
353              
354              
355             # simple string
356 80 100       1561 $$input =~ m/\G
357             @
358             ((?:[^@]|@@)*)
359             @
360             /xgcs
361             and return('string', [$1] );
362              
363             };
364              
365              
366             #
367             # ids
368             #
369 192 50       523 $state eq 'ids' and do {
370            
371 0         0 $state = 'norm';
372              
373 0 0       0 $$input =~ m{\G
374             (?:
375             (\d?)
376             ([^\$,\.:;@\x00-\x1F])
377             ([^\$,\.:;@\x00-\x1F]*)
378             )*
379             }xgc
380             and return('ids', [$1,$2,$3]);
381             };
382              
383              
384             #
385             # symnums
386             #
387 192 100       431 $state eq 'symnums' and do {
388              
389 8         13 $state = 'norm';
390              
391 8 50       153 $$input =~ m{\G
392             (?:
393             (\d*) # {digit}*
394             ([^\$,\.:;@\x00-\x1F]) # idchar
395             ([^\$,\.:;@\x00-\x1F]*) # {idchar | digit}*
396             : # :
397             ([\d\.]+)[\s\n\r]* # num
398             )*
399             }xgcs
400             and return('symnums', [$1,$2,$3,$4]);
401             };
402              
403              
404             #
405             # idnums
406             #
407 184 100       357 $state eq 'idnums' and do {
408              
409 8         17 $state = 'norm';
410              
411 8 50       92 $$input =~ m{\G
412             (?:
413              
414             ((?:[\d\.]+)?) # {num}
415             ([^\$,\.:;@\x00-\x1F]) # idchar
416             ([^\$,\.:;@\x00-\x1F]|(?:[\d\.]+))* # {idchar | num}*
417             : # :
418             ([\d\.]+) # num
419             )*
420             }xgc
421             and return('idnums', [$1,$2,$3,$4]);
422             };
423              
424              
425             #
426             # ido
427             #
428 176 100       358 $state eq 'ido' and do {
429              
430 56         81 $state = 'norm';
431              
432 56 50       699 $$input =~ m{\G
433             (?:
434             ((?:[\d\.]+)?) # {num}
435             ([^\$,\.:;@\x00-\x1F]) # idchar
436             ([^\$,\.:;@\x00-\x1F]|(?:[\d\.]+))* # {idchar | num}*
437             )?
438             }xgc
439             and return('ido', [$1,$2,$3]);
440             };
441              
442              
443             #
444             # nums
445             #
446 120 100       264 $state eq 'nums' and do {
447              
448 112         715 $state = 'norm';
449              
450 112 50       13151 $$input =~ m/\G([\d\.]*)/gc and return('nums', [$1]);
451             };
452              
453              
454             #
455             # NO EXPECTED TOKEN! ERROR
456             #
457 8         48 return('',[ undef, -1 ]);
458             }
459              
460              
461              
462             sub Run {
463 8     8 0 16 my $self = shift;
464 8         16 $input = shift;
465 8         28 $revs_to_co = shift;
466 8         10 $dates_to_co = shift;
467              
468 8         13 $dt = undef;
469              
470 8         62 $dt = new VCS::Rcs::Deltatext();
471 8         32 $state = 'norm';
472 8         13 $ft = 1;
473             # $init_rev_no = undef;
474              
475 8         67 $self->YYParse( yylex => \&_Lexer, yyerror => \&_Error, yydebug => 0x00 );
476              
477 8         76 $dt
478             }