File Coverage

blib/lib/VCS/Rcs/YappRcsParser.pm
Criterion Covered Total %
statement 88 166 53.0
branch 34 72 47.2
condition 1 12 8.3
subroutine 11 24 45.8
pod n/a
total 134 274 48.9


line stmt bran cond sub pod time code
1             ####################################################################
2             #
3             # This file was generated using Parse::Yapp version 1.04.
4             #
5             # Don't edit this file, use source file instead.
6             #
7             # ANY CHANGE MADE HERE WILL BE LOST !
8             #
9             ####################################################################
10             package VCS::Rcs::YappRcsParser;
11 2     2   12 use vars qw ( @ISA );
  2         4  
  2         1264  
12 2     2   13 use strict;
  2         7  
  2         194  
13              
14             @ISA= qw ( Parse::Yapp::Driver );
15             #Included Parse/Yapp/Driver.pm file----------------------------------------
16             {
17             #
18             # Module Parse::Yapp::Driver
19             #
20             # This module is part of the Parse::Yapp package available on your
21             # nearest CPAN
22             #
23             # Any use of this module in a standalone parser make the included
24             # text under the same copyright as the Parse::Yapp module itself.
25             #
26             # This notice should remain unchanged.
27             #
28             # (c) Copyright 1998-2001 Francois Desarmenien, all rights reserved.
29             # (see the pod text in Parse::Yapp module for use and distribution rights)
30             #
31              
32             package Parse::Yapp::Driver;
33              
34             require 5.004;
35              
36 2     2   12 use strict;
  2         3  
  2         77  
37              
38 2     2   10 use vars qw ( $VERSION $COMPATIBLE $FILENAME );
  2         4  
  2         158  
39              
40             $VERSION = '1.04';
41             $COMPATIBLE = '0.07';
42             $FILENAME=__FILE__;
43              
44 2     2   10 use Carp;
  2         3  
  2         3646  
45              
46             #Known parameters, all starting with YY (leading YY will be discarded)
47             my(%params)=(YYLEX => 'CODE', 'YYERROR' => 'CODE', YYVERSION => '',
48             YYRULES => 'ARRAY', YYSTATES => 'ARRAY', YYDEBUG => '');
49             #Mandatory parameters
50             my(@params)=('LEX','RULES','STATES');
51              
52             sub new {
53 8     8   22 my($class)=shift;
54 8         13 my($errst,$nberr,$token,$value,$check,$dotpos);
55 8         98 my($self)={ ERROR => \&_Error,
56             ERRST => \$errst,
57             NBERR => \$nberr,
58             TOKEN => \$token,
59             VALUE => \$value,
60             DOTPOS => \$dotpos,
61             STACK => [],
62             DEBUG => 0,
63             CHECK => \$check };
64              
65 8         222 _CheckParams( [], \%params, \@_, $self );
66              
67 8 50 33     95 exists($$self{VERSION})
68             and $$self{VERSION} < $COMPATIBLE
69             and croak "Yapp driver version $VERSION ".
70             "incompatible with version $$self{VERSION}:\n".
71             "Please recompile parser module.";
72              
73 8 50       105 ref($class)
74             and $class=ref($class);
75              
76 8         44 bless($self,$class);
77             }
78              
79             sub YYParse {
80 8     8   19 my($self)=shift;
81 8         20 my($retval);
82              
83 8         35 _CheckParams( \@params, \%params, \@_, $self );
84              
85 8 50       39 if($$self{DEBUG}) {
86 0         0 _DBLoad();
87 0         0 $retval = eval '$self->_DBParse()';#Do not create stab entry on compile
88 0 0       0 $@ and die $@;
89             }
90             else {
91 8         37 $retval = $self->_Parse();
92             }
93 8         29 $retval
94             }
95              
96             sub YYData {
97 0     0   0 my($self)=shift;
98              
99 0 0       0 exists($$self{USER})
100             or $$self{USER}={};
101              
102 0         0 $$self{USER};
103            
104             }
105              
106             sub YYErrok {
107 0     0   0 my($self)=shift;
108              
109 0         0 ${$$self{ERRST}}=0;
  0         0  
110 0         0 undef;
111             }
112              
113             sub YYNberr {
114 0     0   0 my($self)=shift;
115              
116 0         0 ${$$self{NBERR}};
  0         0  
117             }
118              
119             sub YYRecovering {
120 0     0   0 my($self)=shift;
121              
122 0         0 ${$$self{ERRST}} != 0;
  0         0  
123             }
124              
125             sub YYAbort {
126 0     0   0 my($self)=shift;
127              
128 0         0 ${$$self{CHECK}}='ABORT';
  0         0  
129 0         0 undef;
130             }
131              
132             sub YYAccept {
133 8     8   16 my($self)=shift;
134              
135 8         13 ${$$self{CHECK}}='ACCEPT';
  8         34  
136 8         17 undef;
137             }
138              
139             sub YYError {
140 0     0   0 my($self)=shift;
141              
142 0         0 ${$$self{CHECK}}='ERROR';
  0         0  
143 0         0 undef;
144             }
145              
146             sub YYSemval {
147 0     0   0 my($self)=shift;
148 0         0 my($index)= $_[0] - ${$$self{DOTPOS}} - 1;
  0         0  
149              
150 0         0 $index < 0
151 0 0 0     0 and -$index <= @{$$self{STACK}}
152             and return $$self{STACK}[$index][1];
153              
154 0         0 undef; #Invalid index
155             }
156              
157             sub YYCurtok {
158 0     0   0 my($self)=shift;
159              
160             @_
161 0 0       0 and ${$$self{TOKEN}}=$_[0];
  0         0  
162 0         0 ${$$self{TOKEN}};
  0         0  
163             }
164              
165             sub YYCurval {
166 0     0   0 my($self)=shift;
167              
168             @_
169 0 0       0 and ${$$self{VALUE}}=$_[0];
  0         0  
170 0         0 ${$$self{VALUE}};
  0         0  
171             }
172              
173             sub YYExpect {
174 0     0   0 my($self)=shift;
175              
176 0         0 keys %{$self->{STATES}[$self->{STACK}[-1][0]]{ACTIONS}}
  0         0  
177             }
178              
179             sub YYLexer {
180 0     0   0 my($self)=shift;
181              
182 0         0 $$self{LEX};
183             }
184              
185              
186             #################
187             # Private stuff #
188             #################
189              
190              
191             sub _CheckParams {
192 16     16   31 my($mandatory,$checklist,$inarray,$outhash)=@_;
193 16         25 my($prm,$value);
194 16         37 my($prmlst)={};
195              
196 16         195 while(($prm,$value)=splice(@$inarray,0,2)) {
197 48         97 $prm=uc($prm);
198 48 50       133 exists($$checklist{$prm})
199             or croak("Unknow parameter '$prm'");
200 48 50       131 ref($value) eq $$checklist{$prm}
201             or croak("Invalid value for parameter '$prm'");
202 48         146 $prm=unpack('@2A*',$prm);
203 48         227 $$outhash{$prm}=$value;
204             }
205 16         58 for (@$mandatory) {
206 24 50       164 exists($$outhash{$_})
207             or croak("Missing mandatory parameter '".lc($_)."'");
208             }
209             }
210              
211             sub _Error {
212 0     0   0 print "Parse error.\n";
213             }
214              
215             sub _DBLoad {
216             {
217 2     2   14 no strict 'refs';
  2     0   5  
  2         5498  
  0         0  
218              
219 0 0       0 exists(${__PACKAGE__.'::'}{_DBParse})#Already loaded ?
  0         0  
220             and return;
221             }
222 0         0 my($fname)=__FILE__;
223 0         0 my(@drv);
224 0 0       0 open(DRV,"<$fname") or die "Report this as a BUG: Cannot open $fname";
225 0         0 while() {
226             /^\s*sub\s+_Parse\s*{\s*$/ .. /^\s*}\s*#\s*_Parse\s*$/
227 0 0       0 and do {
228 0         0 s/^#DBG>//;
229 0         0 push(@drv,$_);
230             }
231             }
232 0         0 close(DRV);
233              
234 0         0 $drv[0]=~s/_P/_DBP/;
235 0         0 eval join('',@drv);
236             }
237              
238             #Note that for loading debugging version of the driver,
239             #this file will be parsed from 'sub _Parse' up to '}#_Parse' inclusive.
240             #So, DO NOT remove comment at end of sub !!!
241             sub _Parse {
242 8     8   17 my($self)=shift;
243              
244 8         34 my($rules,$states,$lex,$error)
245             = @$self{ 'RULES', 'STATES', 'LEX', 'ERROR' };
246 8         42 my($errstatus,$nberror,$token,$value,$stack,$check,$dotpos)
247             = @$self{ 'ERRST', 'NBERR', 'TOKEN', 'VALUE', 'STACK', 'CHECK', 'DOTPOS' };
248              
249             #DBG> my($debug)=$$self{DEBUG};
250             #DBG> my($dbgerror)=0;
251              
252             #DBG> my($ShowCurToken) = sub {
253             #DBG> my($tok)='>';
254             #DBG> for (split('',$$token)) {
255             #DBG> $tok.= (ord($_) < 32 or ord($_) > 126)
256             #DBG> ? sprintf('<%02X>',ord($_))
257             #DBG> : $_;
258             #DBG> }
259             #DBG> $tok.='<';
260             #DBG> };
261              
262 8         216 $$errstatus=0;
263 8         16 $$nberror=0;
264 8         17 ($$token,$$value)=(undef,undef);
265 8         35 @$stack=( [ 0, undef ] );
266 8         16 $$check='';
267              
268 8         13 while(1) {
269 1992         2482 my($actions,$act,$stateno);
270              
271 1992         4483 $stateno=$$stack[-1][0];
272 1992         5745 $actions=$$states[$stateno];
273              
274             #DBG> print STDERR ('-' x 40),"\n";
275             #DBG> $debug & 0x2
276             #DBG> and print STDERR "In state $stateno:\n";
277             #DBG> $debug & 0x08
278             #DBG> and print STDERR "Stack:[".
279             #DBG> join(',',map { $$_[0] } @$stack).
280             #DBG> "]\n";
281              
282              
283 1992 100       4776 if (exists($$actions{ACTIONS})) {
284              
285             defined($$token)
286 1424 100       3199 or do {
287 1328         3811 ($$token,$$value)=&$lex($self);
288             #DBG> $debug & 0x01
289             #DBG> and print STDERR "Need token. Got ".&$ShowCurToken."\n";
290             };
291              
292 1424 50       14827 $act= exists($$actions{ACTIONS}{$$token})
    100          
293             ? $$actions{ACTIONS}{$$token}
294             : exists($$actions{DEFAULT})
295             ? $$actions{DEFAULT}
296             : undef;
297             }
298             else {
299 568         1038 $act=$$actions{DEFAULT};
300             #DBG> $debug & 0x01
301             #DBG> and print STDERR "Don't need token.\n";
302             }
303              
304             defined($act)
305 1992 50       5585 and do {
306              
307             $act > 0
308 1992 100       4380 and do { #shift
309              
310             #DBG> $debug & 0x04
311             #DBG> and print STDERR "Shift and go to state $act.\n";
312              
313             $$errstatus
314 1328 50       2919 and do {
315 0         0 --$$errstatus;
316              
317             #DBG> $debug & 0x10
318             #DBG> and $dbgerror
319             #DBG> and $$errstatus == 0
320             #DBG> and do {
321             #DBG> print STDERR "**End of Error recovery.\n";
322             #DBG> $dbgerror=0;
323             #DBG> };
324             };
325              
326              
327 1328         6284 push(@$stack,[ $act, $$value ]);
328              
329 1328 100       3767 $$token ne '' #Don't eat the eof
330             and $$token=$$value=undef;
331 1328         2191 next;
332             };
333              
334             #reduce
335 664         682 my($lhs,$len,$code,@sempar,$semval);
336 664         743 ($lhs,$len,$code)=@{$$rules[-$act]};
  664         1851  
337              
338             #DBG> $debug & 0x04
339             #DBG> and $act
340             #DBG> and print STDERR "Reduce using rule ".-$act." ($lhs,$len): ";
341              
342 664 100       3890 $act
343             or $self->YYAccept();
344              
345 664         845 $$dotpos=$len;
346              
347             unpack('A1',$lhs) eq '@' #In line rule
348 664 100       3052 and do {
349 320 50       1775 $lhs =~ /^\@[0-9]+\-([0-9]+)$/
350             or die "In line rule name '$lhs' ill formed: ".
351             "report it as a BUG.\n";
352 320         743 $$dotpos = $1;
353             };
354              
355 5008         10282 @sempar = $$dotpos
356 664 100       4497 ? map { $$_[1] } @$stack[ -$$dotpos .. -1 ]
357             : ();
358              
359 664 100       4231 $semval = $code ? &$code( $self, @sempar )
    100          
360             : @sempar ? $sempar[0] : undef;
361              
362 664         2721 splice(@$stack,-$len,$len);
363              
364             $$check eq 'ACCEPT'
365 664 100       1857 and do {
366              
367             #DBG> $debug & 0x04
368             #DBG> and print STDERR "Accept.\n";
369              
370 8         45 return($semval);
371             };
372              
373             $$check eq 'ABORT'
374 656 50       1453 and do {
375              
376             #DBG> $debug & 0x04
377             #DBG> and print STDERR "Abort.\n";
378              
379 0         0 return(undef);
380              
381             };
382              
383             #DBG> $debug & 0x04
384             #DBG> and print STDERR "Back to state $$stack[-1][0], then ";
385              
386             $$check eq 'ERROR'
387 656 50       2420 or do {
388             #DBG> $debug & 0x04
389             #DBG> and print STDERR
390             #DBG> "go to state $$states[$$stack[-1][0]]{GOTOS}{$lhs}.\n";
391              
392             #DBG> $debug & 0x10
393             #DBG> and $dbgerror
394             #DBG> and $$errstatus == 0
395             #DBG> and do {
396             #DBG> print STDERR "**End of Error recovery.\n";
397             #DBG> $dbgerror=0;
398             #DBG> };
399              
400 656         3262 push(@$stack,
401             [ $$states[$$stack[-1][0]]{GOTOS}{$lhs}, $semval ]);
402 656         1088 $$check='';
403 656         14768 next;
404             };
405              
406             #DBG> $debug & 0x04
407             #DBG> and print STDERR "Forced Error recovery.\n";
408              
409 0           $$check='';
410              
411             };
412              
413             #Error
414             $$errstatus
415 0 0         or do {
416              
417 0           $$errstatus = 1;
418 0           &$error($self);
419 0 0         $$errstatus # if 0, then YYErrok has been called
420             or next; # so continue parsing
421              
422             #DBG> $debug & 0x10
423             #DBG> and do {
424             #DBG> print STDERR "**Entering Error recovery.\n";
425             #DBG> ++$dbgerror;
426             #DBG> };
427              
428 0           ++$$nberror;
429              
430             };
431              
432             $$errstatus == 3 #The next token is not valid: discard it
433 0 0         and do {
434             $$token eq '' # End of input: no hope
435 0 0         and do {
436             #DBG> $debug & 0x10
437             #DBG> and print STDERR "**At eof: aborting.\n";
438 0           return(undef);
439             };
440              
441             #DBG> $debug & 0x10
442             #DBG> and print STDERR "**Dicard invalid token ".&$ShowCurToken.".\n";
443              
444 0           $$token=$$value=undef;
445             };
446              
447 0           $$errstatus=3;
448              
449 0   0       while( @$stack
      0        
450             and ( not exists($$states[$$stack[-1][0]]{ACTIONS})
451             or not exists($$states[$$stack[-1][0]]{ACTIONS}{error})
452             or $$states[$$stack[-1][0]]{ACTIONS}{error} <= 0)) {
453              
454             #DBG> $debug & 0x10
455             #DBG> and print STDERR "**Pop state $$stack[-1][0].\n";
456              
457 0           pop(@$stack);
458             }
459              
460             @$stack
461 0 0         or do {
462              
463             #DBG> $debug & 0x10
464             #DBG> and print STDERR "**No state left on stack: aborting.\n";
465              
466 0           return(undef);
467             };
468              
469             #shift the error token
470              
471             #DBG> $debug & 0x10
472             #DBG> and print STDERR "**Shift \$error token and go to state ".
473             #DBG> $$states[$$stack[-1][0]]{ACTIONS}{error}.
474             #DBG> ".\n";
475              
476 0           push(@$stack, [ $$states[$$stack[-1][0]]{ACTIONS}{error}, undef ]);
477              
478             }
479              
480             #never reached
481 0           croak("Error in driver logic. Please, report it as a BUG");
482              
483             }#_Parse
484             #DO NOT remove comment
485              
486             1;
487              
488             }
489             #End of include--------------------------------------------------
490              
491              
492             #line 1 "YappRcsParser.yp"
493              
494              
495             ##########################################################################
496             #
497             # This is the Parse::Yapp grammar file. To reproduce a modul out of it
498             # you should have CPAN module Parse::Yapp installed on your
499             # system and run
500             #
501             #yapp -s -m'VCS::Rcs::YappRcsParser' -o'lib/Rcs/YappRcsParser.pm' YappRcsParser.yp
502             #
503             # But you won't need Parse::Yapp unless you want to reproduce the module.
504             #
505             #
506             # Here is Parse::Yapp's COPYRIGHT
507             #
508             # The Parse::Yapp module and its related modules and shell
509             # scripts are copyright (c) 1998-2001 Francois Desarmenien,
510             # France. All rights reserved.
511             #
512             # You may use and distribute them under the terms of either
513             # the GNU General Public License or the Artistic License, as
514             # specified in the Perl README file.
515             #
516             # If you use the "standalone parser" option so people don't
517             # need to install Parse::Yapp on their systems in order to
518             # run you software, this copyright noticed should be
519             # included in your software copyright too, and the copyright
520             # notice in the embedded driver should be left untouched.
521             #
522             # End of Parse::Yapp's COPYRIGHT
523             #
524             #
525             # Copyright (c) 2001 by RIPE-NCC. All rights reserved.
526             #
527             # This program is free software; you can redistribute it and/or
528             # modify it under the same terms as Perl itself.
529             #
530             # You should have received a copy of the Perl license along with
531             # Perl; see the file README in Perl distribution.
532             #
533             # You should have received a copy of the GNU General Public License
534             # along with Perl; see the file Copying. If not, write to
535             # the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
536             #
537             # You should have received a copy of the Artistic License
538             # along with Perl; see the file Artistic.
539             #
540             # NO WARRANTY
541             #
542             # BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
543             # FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
544             # OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
545             # PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
546             # OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
547             # MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
548             # TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
549             # PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
550             # REPAIR OR CORRECTION.
551             #
552             # IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
553             # WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
554             # REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
555             # INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
556             # OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
557             # TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
558             # YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
559             # PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
560             # POSSIBILITY OF SUCH DAMAGES.
561             #
562             # END OF TERMS AND CONDITIONS
563             #
564             #
565             #
566             ##########################################################################
567              
568             require 5.6.0;
569              
570             use VCS::Rcs::Deltatext;
571              
572             use Data::Dumper;
573              
574             our ($VERSION) = (q$Revision: 1.10 $ =~ /([\d\.]+)/);
575              
576             my $dt;
577             my $input;
578             my $state;
579             my $ft;
580             # my $init_rev_no;
581             my $revs_to_co;
582             my $dates_to_co;
583              
584             our $debug = 0;
585              
586              
587              
588             sub new {
589             my($class)=shift;
590             ref($class)
591             and $class=ref($class);
592              
593             my($self)=$class->SUPER::new( yyversion => '1.04',
594             yystates =>
595             [
596             {#State 0
597             ACTIONS => {
598             'HEAD' => 4
599             },
600             GOTOS => {
601             'head' => 1,
602             'rcstext' => 2,
603             'admin' => 3
604             }
605             },
606             {#State 1
607             DEFAULT => -5,
608             GOTOS => {
609             '@4-1' => 5
610             }
611             },
612             {#State 2
613             ACTIONS => {
614             '' => 6
615             }
616             },
617             {#State 3
618             DEFAULT => -1,
619             GOTOS => {
620             '@1-1' => 7
621             }
622             },
623             {#State 4
624             ACTIONS => {
625             'num' => 8,
626             ";" => 9
627             }
628             },
629             {#State 5
630             ACTIONS => {
631             'BRANCH' => 11
632             },
633             DEFAULT => -15,
634             GOTOS => {
635             'branch' => 10
636             }
637             },
638             {#State 6
639             DEFAULT => -0
640             },
641             {#State 7
642             DEFAULT => -33,
643             GOTOS => {
644             'delta' => 12
645             }
646             },
647             {#State 8
648             ACTIONS => {
649             ";" => 13
650             }
651             },
652             {#State 9
653             DEFAULT => -13
654             },
655             {#State 10
656             DEFAULT => -6,
657             GOTOS => {
658             '@5-3' => 14
659             }
660             },
661             {#State 11
662             DEFAULT => -16,
663             GOTOS => {
664             '@11-1' => 15
665             }
666             },
667             {#State 12
668             ACTIONS => {
669             'num' => 17
670             },
671             DEFAULT => -2,
672             GOTOS => {
673             '@2-3' => 16
674             }
675             },
676             {#State 13
677             DEFAULT => -14
678             },
679             {#State 14
680             ACTIONS => {
681             'ACCESS' => 19
682             },
683             GOTOS => {
684             'access' => 18
685             }
686             },
687             {#State 15
688             ACTIONS => {
689             'nums' => 20
690             }
691             },
692             {#State 16
693             ACTIONS => {
694             'DESC' => 21
695             },
696             GOTOS => {
697             'desc' => 22
698             }
699             },
700             {#State 17
701             ACTIONS => {
702             'DATE' => 23
703             }
704             },
705             {#State 18
706             DEFAULT => -7,
707             GOTOS => {
708             '@6-5' => 24
709             }
710             },
711             {#State 19
712             ACTIONS => {
713             ";" => 26
714             },
715             DEFAULT => -19,
716             GOTOS => {
717             '@12-1' => 25
718             }
719             },
720             {#State 20
721             ACTIONS => {
722             ";" => 27
723             }
724             },
725             {#State 21
726             ACTIONS => {
727             'string' => 28
728             }
729             },
730             {#State 22
731             DEFAULT => -3,
732             GOTOS => {
733             '@3-5' => 29
734             }
735             },
736             {#State 23
737             ACTIONS => {
738             'num' => 30
739             }
740             },
741             {#State 24
742             ACTIONS => {
743             'SYMBOLS' => 32
744             },
745             GOTOS => {
746             'symbols' => 31
747             }
748             },
749             {#State 25
750             ACTIONS => {
751             'ids' => 33
752             }
753             },
754             {#State 26
755             DEFAULT => -18
756             },
757             {#State 27
758             DEFAULT => -17
759             },
760             {#State 28
761             DEFAULT => -38
762             },
763             {#State 29
764             DEFAULT => -39,
765             GOTOS => {
766             'deltatext' => 34
767             }
768             },
769             {#State 30
770             ACTIONS => {
771             ";" => 35
772             }
773             },
774             {#State 31
775             DEFAULT => -8,
776             GOTOS => {
777             '@7-7' => 36
778             }
779             },
780             {#State 32
781             DEFAULT => -21,
782             GOTOS => {
783             '@13-1' => 37
784             }
785             },
786             {#State 33
787             ACTIONS => {
788             ";" => 38
789             }
790             },
791             {#State 34
792             ACTIONS => {
793             'num' => 39
794             },
795             DEFAULT => -4
796             },
797             {#State 35
798             ACTIONS => {
799             'AUTHOR' => 40
800             }
801             },
802             {#State 36
803             ACTIONS => {
804             'LOCKS' => 42
805             },
806             GOTOS => {
807             'locks' => 41
808             }
809             },
810             {#State 37
811             ACTIONS => {
812             'symnums' => 43
813             }
814             },
815             {#State 38
816             DEFAULT => -20
817             },
818             {#State 39
819             ACTIONS => {
820             'LOG' => 44
821             }
822             },
823             {#State 40
824             ACTIONS => {
825             'id' => 45
826             }
827             },
828             {#State 41
829             ACTIONS => {
830             'STRICT' => 46
831             },
832             DEFAULT => -25,
833             GOTOS => {
834             'strict' => 47
835             }
836             },
837             {#State 42
838             DEFAULT => -23,
839             GOTOS => {
840             '@14-1' => 48
841             }
842             },
843             {#State 43
844             ACTIONS => {
845             ";" => 49
846             }
847             },
848             {#State 44
849             ACTIONS => {
850             'string' => 50
851             }
852             },
853             {#State 45
854             ACTIONS => {
855             ";" => 51
856             }
857             },
858             {#State 46
859             ACTIONS => {
860             ";" => 52
861             }
862             },
863             {#State 47
864             DEFAULT => -9,
865             GOTOS => {
866             '@8-10' => 53
867             }
868             },
869             {#State 48
870             ACTIONS => {
871             'idnums' => 54
872             }
873             },
874             {#State 49
875             DEFAULT => -22
876             },
877             {#State 50
878             DEFAULT => -42,
879             GOTOS => {
880             'newphrase' => 55
881             }
882             },
883             {#State 51
884             ACTIONS => {
885             'STATE' => 56
886             }
887             },
888             {#State 52
889             DEFAULT => -26
890             },
891             {#State 53
892             ACTIONS => {
893             'COMMENT' => 58
894             },
895             DEFAULT => -27,
896             GOTOS => {
897             'comment' => 57
898             }
899             },
900             {#State 54
901             ACTIONS => {
902             ";" => 59
903             }
904             },
905             {#State 55
906             ACTIONS => {
907             'id' => 60,
908             'TEXT' => 61
909             }
910             },
911             {#State 56
912             DEFAULT => -34,
913             GOTOS => {
914             '@15-9' => 62
915             }
916             },
917             {#State 57
918             DEFAULT => -10,
919             GOTOS => {
920             '@9-12' => 63
921             }
922             },
923             {#State 58
924             ACTIONS => {
925             'string' => 64,
926             ";" => 65
927             }
928             },
929             {#State 59
930             DEFAULT => -24
931             },
932             {#State 60
933             ACTIONS => {
934             'string' => 66,
935             'num' => 67,
936             'id' => 69,
937             ":" => 68
938             },
939             DEFAULT => -44,
940             GOTOS => {
941             'word' => 70
942             }
943             },
944             {#State 61
945             DEFAULT => -40,
946             GOTOS => {
947             '@18-6' => 71
948             }
949             },
950             {#State 62
951             ACTIONS => {
952             'ido' => 72
953             }
954             },
955             {#State 63
956             ACTIONS => {
957             'EXPAND' => 74
958             },
959             DEFAULT => -30,
960             GOTOS => {
961             'expand' => 73
962             }
963             },
964             {#State 64
965             ACTIONS => {
966             ";" => 75
967             }
968             },
969             {#State 65
970             DEFAULT => -28
971             },
972             {#State 66
973             DEFAULT => -47
974             },
975             {#State 67
976             DEFAULT => -46
977             },
978             {#State 68
979             DEFAULT => -48
980             },
981             {#State 69
982             DEFAULT => -45
983             },
984             {#State 70
985             ACTIONS => {
986             ";" => 76
987             }
988             },
989             {#State 71
990             ACTIONS => {
991             'string' => 77
992             }
993             },
994             {#State 72
995             ACTIONS => {
996             ";" => 78
997             }
998             },
999             {#State 73
1000             DEFAULT => -11,
1001             GOTOS => {
1002             '@10-14' => 79
1003             }
1004             },
1005             {#State 74
1006             ACTIONS => {
1007             'string' => 80,
1008             ";" => 81
1009             }
1010             },
1011             {#State 75
1012             DEFAULT => -29
1013             },
1014             {#State 76
1015             DEFAULT => -43
1016             },
1017             {#State 77
1018             DEFAULT => -41
1019             },
1020             {#State 78
1021             ACTIONS => {
1022             'BRANCHES' => 82
1023             }
1024             },
1025             {#State 79
1026             DEFAULT => -42,
1027             GOTOS => {
1028             'newphrase' => 83
1029             }
1030             },
1031             {#State 80
1032             ACTIONS => {
1033             ";" => 84
1034             }
1035             },
1036             {#State 81
1037             DEFAULT => -31
1038             },
1039             {#State 82
1040             DEFAULT => -35,
1041             GOTOS => {
1042             '@16-13' => 85
1043             }
1044             },
1045             {#State 83
1046             ACTIONS => {
1047             'id' => 60
1048             },
1049             DEFAULT => -12
1050             },
1051             {#State 84
1052             DEFAULT => -32
1053             },
1054             {#State 85
1055             ACTIONS => {
1056             'nums' => 86
1057             }
1058             },
1059             {#State 86
1060             ACTIONS => {
1061             ";" => 87
1062             }
1063             },
1064             {#State 87
1065             ACTIONS => {
1066             'NEXT' => 88
1067             }
1068             },
1069             {#State 88
1070             DEFAULT => -36,
1071             GOTOS => {
1072             '@17-17' => 89
1073             }
1074             },
1075             {#State 89
1076             ACTIONS => {
1077             'nums' => 90
1078             }
1079             },
1080             {#State 90
1081             ACTIONS => {
1082             ";" => 91
1083             }
1084             },
1085             {#State 91
1086             DEFAULT => -42,
1087             GOTOS => {
1088             'newphrase' => 92
1089             }
1090             },
1091             {#State 92
1092             ACTIONS => {
1093             'id' => 60
1094             },
1095             DEFAULT => -37
1096             }
1097             ],
1098             yyrules =>
1099             [
1100             [#Rule 0
1101             '$start', 2, undef
1102             ],
1103             [#Rule 1
1104             '@1-1', 0,
1105             sub
1106             #line 101 "YappRcsParser.yp"
1107             {warn "admin OK\n" if $debug}
1108             ],
1109             [#Rule 2
1110             '@2-3', 0,
1111             sub
1112             #line 102 "YappRcsParser.yp"
1113             {warn "delta OK\n" if $debug}
1114             ],
1115             [#Rule 3
1116             '@3-5', 0,
1117             sub
1118             #line 103 "YappRcsParser.yp"
1119             {warn "desc OK\n" if $debug}
1120             ],
1121             [#Rule 4
1122             'rcstext', 7,
1123             sub
1124             #line 105 "YappRcsParser.yp"
1125             {warn "Parsed OK!\n" if $debug;}
1126             ],
1127             [#Rule 5
1128             '@4-1', 0,
1129             sub
1130             #line 108 "YappRcsParser.yp"
1131             {warn "head OK\n" if $debug}
1132             ],
1133             [#Rule 6
1134             '@5-3', 0,
1135             sub
1136             #line 109 "YappRcsParser.yp"
1137             {warn "branc OK\n" if $debug}
1138             ],
1139             [#Rule 7
1140             '@6-5', 0,
1141             sub
1142             #line 110 "YappRcsParser.yp"
1143             {warn "acces OK\n" if $debug}
1144             ],
1145             [#Rule 8
1146             '@7-7', 0,
1147             sub
1148             #line 111 "YappRcsParser.yp"
1149             {warn "symbl OK\n" if $debug}
1150             ],
1151             [#Rule 9
1152             '@8-10', 0,
1153             sub
1154             #line 112 "YappRcsParser.yp"
1155             {warn "lock OK\n" if $debug}
1156             ],
1157             [#Rule 10
1158             '@9-12', 0,
1159             sub
1160             #line 113 "YappRcsParser.yp"
1161             {warn "commt OK\n" if $debug}
1162             ],
1163             [#Rule 11
1164             '@10-14', 0,
1165             sub
1166             #line 114 "YappRcsParser.yp"
1167             {warn "expan OK\n" if $debug}
1168             ],
1169             [#Rule 12
1170             'admin', 16, undef
1171             ],
1172             [#Rule 13
1173             'head', 2, undef
1174             ],
1175             [#Rule 14
1176             'head', 3, undef
1177             ],
1178             [#Rule 15
1179             'branch', 0,
1180             sub
1181             #line 122 "YappRcsParser.yp"
1182             {warn "branch OK(EMPTY)\n" if $debug}
1183             ],
1184             [#Rule 16
1185             '@11-1', 0,
1186             sub
1187             #line 123 "YappRcsParser.yp"
1188             {$state='nums'}
1189             ],
1190             [#Rule 17
1191             'branch', 4,
1192             sub
1193             #line 124 "YappRcsParser.yp"
1194             {warn "branch OK",$_[1]," ",$_[3][0],"\n" if $debug}
1195             ],
1196             [#Rule 18
1197             'access', 2,
1198             sub
1199             #line 128 "YappRcsParser.yp"
1200             {warn "access OK",$_[1],"\n" if $debug}
1201             ],
1202             [#Rule 19
1203             '@12-1', 0,
1204             sub
1205             #line 129 "YappRcsParser.yp"
1206             {$state='ids'}
1207             ],
1208             [#Rule 20
1209             'access', 4,
1210             sub
1211             #line 130 "YappRcsParser.yp"
1212             {warn "access OK",$_[1]," ",$_[3][0],"\n" if $debug}
1213             ],
1214             [#Rule 21
1215             '@13-1', 0,
1216             sub
1217             #line 133 "YappRcsParser.yp"
1218             {$state='symnums'}
1219             ],
1220             [#Rule 22
1221             'symbols', 4, undef
1222             ],
1223             [#Rule 23
1224             '@14-1', 0,
1225             sub
1226             #line 136 "YappRcsParser.yp"
1227             {$state='idnums'}
1228             ],
1229             [#Rule 24
1230             'locks', 4, undef
1231             ],
1232             [#Rule 25
1233             'strict', 0, undef
1234             ],
1235             [#Rule 26
1236             'strict', 2, undef
1237             ],
1238             [#Rule 27
1239             'comment', 0, undef
1240             ],
1241             [#Rule 28
1242             'comment', 2, undef
1243             ],
1244             [#Rule 29
1245             'comment', 3, undef
1246             ],
1247             [#Rule 30
1248             'expand', 0, undef
1249             ],
1250             [#Rule 31
1251             'expand', 2, undef
1252             ],
1253             [#Rule 32
1254             'expand', 3, undef
1255             ],
1256             [#Rule 33
1257             'delta', 0, undef
1258             ],
1259             [#Rule 34
1260             '@15-9', 0,
1261             sub
1262             #line 160 "YappRcsParser.yp"
1263             {$state='ido'}
1264             ],
1265             [#Rule 35
1266             '@16-13', 0,
1267             sub
1268             #line 161 "YappRcsParser.yp"
1269             {$state='nums'}
1270             ],
1271             [#Rule 36
1272             '@17-17', 0,
1273             sub
1274             #line 162 "YappRcsParser.yp"
1275             {$state='nums'}
1276             ],
1277             [#Rule 37
1278             'delta', 21,
1279             sub
1280             #line 164 "YappRcsParser.yp"
1281             {&as_other( $_[2][0], $_[4][0]);}
1282             ],
1283             [#Rule 38
1284             'desc', 2,
1285             sub
1286             #line 169 "YappRcsParser.yp"
1287             {&revs_to_co();}
1288             ],
1289             [#Rule 39
1290             'deltatext', 0, undef
1291             ],
1292             [#Rule 40
1293             '@18-6', 0,
1294             sub
1295             #line 178 "YappRcsParser.yp"
1296             {$state='longstring';}
1297             ],
1298             [#Rule 41
1299             'deltatext', 8,
1300             sub
1301             #line 179 "YappRcsParser.yp"
1302             {
1303             print STDERR $_[2][0]," \r" if($debug);
1304             &co_rev( $_[8][0], $_[2][0] );
1305             }
1306             ],
1307             [#Rule 42
1308             'newphrase', 0, undef
1309             ],
1310             [#Rule 43
1311             'newphrase', 4, undef
1312             ],
1313             [#Rule 44
1314             'word', 0, undef
1315             ],
1316             [#Rule 45
1317             'word', 1, undef
1318             ],
1319             [#Rule 46
1320             'word', 1, undef
1321             ],
1322             [#Rule 47
1323             'word', 1, undef
1324             ],
1325             [#Rule 48
1326             'word', 1, undef
1327             ]
1328             ],
1329             @_);
1330             bless($self,$class);
1331             }
1332              
1333             #line 192 "YappRcsParser.yp"
1334              
1335              
1336             sub revs_to_co {
1337             my $revs = $revs_to_co;
1338              
1339             unless ($dates_to_co) {
1340             $dt->revs2co($revs);
1341             return;
1342             }
1343              
1344             my $rev;
1345             my $rdate;
1346             my %date;
1347              
1348             for $rev ($dt->revs) {
1349             $rdate = $dt->date($rev);
1350             $rdate = '19'.$rdate if (length($rdate) == 17);
1351             $date{$rdate} = $rev;
1352             }
1353              
1354             my @alldates = sort keys %date;
1355             my @dates2add = @$dates_to_co;
1356              
1357             my $bi=0;
1358             my($a,$b,@dates2add_proper);
1359              
1360             for $b (@dates2add) {
1361             for $a (@alldates) {
1362             $dates2add_proper[$bi]=$a if ($a lt $b);
1363             }
1364             $bi++;
1365             }
1366              
1367             for (@dates2add_proper) {
1368             push @$revs, $date{$_} if (defined $date{$_});
1369             }
1370              
1371             if($debug){
1372             print STDERR "$_\n" for(@$revs);
1373             print STDERR "$_\n" for(@dates2add_proper);
1374             print STDERR "$_\n" for(@dates2add);
1375             }
1376              
1377             $dt->revs2co($revs);
1378             }
1379              
1380             sub as_other {
1381             my $rev = shift;
1382             my $date = shift;
1383              
1384             # $init_rev_no = $rev;
1385              
1386             $dt->date($rev, $date);
1387             }
1388              
1389             sub co_rev {
1390             my $ptext = shift;
1391             my $rev = shift;
1392            
1393             if ($ft) {
1394             $ft = 0;
1395             $dt->lastrev($ptext, $rev);
1396             return;
1397             }
1398              
1399             $dt->deltarev($ptext, $rev);
1400             }
1401              
1402             sub _Error {
1403              
1404             exists $_[0]->YYData->{ERRMSG}
1405             and do {
1406             print $_[0]->YYData->{ERRMSG};
1407             delete $_[0]->YYData->{ERRMSG};
1408             return;
1409             };
1410             warn "\nSyntax error.\n";
1411              
1412             }
1413              
1414              
1415             sub _Lexer {
1416             my($parser)=shift;
1417              
1418             #
1419             # EOF
1420             #
1421             pos($$input) >= length($$input) and return('',[ undef, -1 ]);
1422              
1423              
1424             #
1425             # longstring
1426             #
1427             $state eq 'longstring' and do {
1428              
1429             $state = 'norm';
1430              
1431             return('',[ undef, -1 ]) if ($$input !~ m/\G[\s\n]*@/sgc);
1432              
1433             my $text_tmp='';
1434             my $text;
1435             while ($$input =~ m/\G((?:[^@\n]|@@)*\n?)/gcs) {
1436             $text_tmp = $1;
1437             $text_tmp =~ s/@@/@/g;
1438             $text .= $text_tmp;
1439             }
1440             return('',[ undef, -1 ]) if ($$input !~ m/\G[\s\n]*@/sgc);
1441              
1442             return('string',[\$text]);
1443             };
1444              
1445              
1446             #
1447             # Ignore blanks
1448             #
1449             $$input=~m/\G\s+/scg;
1450            
1451              
1452             #
1453             # norm
1454             #
1455             $state eq 'norm' and do {
1456              
1457             # SIMPLE TOKENS
1458             $$input =~ m/\Ghead/gc and return('HEAD', 'head');
1459              
1460             $$input =~ m/\Gbranches/gc and return('BRANCHES','branches');
1461             $$input =~ m/\Gbranch/gc and return('BRANCH', 'access');
1462              
1463             $$input =~ m/\Gaccess/gc and return('ACCESS', 'access');
1464             $$input =~ m/\Gsymbols/gc and return('SYMBOLS', 'symbols');
1465             $$input =~ m/\Glocks/gc and return('LOCKS', 'locks');
1466             $$input =~ m/\Gstrict/gc and return('STRICT', 'strict');
1467             $$input =~ m/\Gcomment/gc and return('COMMENT', 'comment');
1468              
1469             $$input =~ m/\Gdate/gc and return('DATE', 'date');
1470             $$input =~ m/\Gauthor/gc and return('AUTHOR', 'author');
1471             $$input =~ m/\Gstate/gc and return('STATE', 'state');
1472              
1473             $$input =~ m/\Gnext/gc and return('NEXT', 'next');
1474            
1475             $$input =~ m/\Glog/gc and return('LOG', 'log');
1476             $$input =~ m/\Gtext/gc and return('TEXT', 'text');
1477              
1478             $$input =~ m/\Gdesc/gc and return('DESC', 'desc');
1479            
1480             $$input =~ m/\G;/gc and return(';', ';');
1481             $$input =~ m/\G:/gc and return(':', ';');
1482              
1483              
1484             # num
1485             $$input =~ m/\G([\d\.]+)/gc and return('num', [$1]);
1486              
1487              
1488             # id
1489             $$input =~ m/\G
1490             ((?:[\d\.]+)?) # {num}
1491             ([^\$,\.:;@\x00-\x1F]) # idchar
1492             ([^\$,\.:;@\x00-\x1F]|(?:[\d\.]+))* # {idchar | num}*
1493             /xgc
1494             and return('id', [$1,$2,$3] );
1495              
1496              
1497             # simple string
1498             $$input =~ m/\G
1499             @
1500             ((?:[^@]|@@)*)
1501             @
1502             /xgcs
1503             and return('string', [$1] );
1504              
1505             };
1506              
1507              
1508             #
1509             # ids
1510             #
1511             $state eq 'ids' and do {
1512            
1513             $state = 'norm';
1514              
1515             $$input =~ m{\G
1516             (?:
1517             (\d?)
1518             ([^\$,\.:;@\x00-\x1F])
1519             ([^\$,\.:;@\x00-\x1F]*)
1520             )*
1521             }xgc
1522             and return('ids', [$1,$2,$3]);
1523             };
1524              
1525              
1526             #
1527             # symnums
1528             #
1529             $state eq 'symnums' and do {
1530              
1531             $state = 'norm';
1532              
1533             $$input =~ m{\G
1534             (?:
1535             (\d*) # {digit}*
1536             ([^\$,\.:;@\x00-\x1F]) # idchar
1537             ([^\$,\.:;@\x00-\x1F]*) # {idchar | digit}*
1538             : # :
1539             ([\d\.]+)[\s\n\r]* # num
1540             )*
1541             }xgcs
1542             and return('symnums', [$1,$2,$3,$4]);
1543             };
1544              
1545              
1546             #
1547             # idnums
1548             #
1549             $state eq 'idnums' and do {
1550              
1551             $state = 'norm';
1552              
1553             $$input =~ m{\G
1554             (?:
1555              
1556             ((?:[\d\.]+)?) # {num}
1557             ([^\$,\.:;@\x00-\x1F]) # idchar
1558             ([^\$,\.:;@\x00-\x1F]|(?:[\d\.]+))* # {idchar | num}*
1559             : # :
1560             ([\d\.]+) # num
1561             )*
1562             }xgc
1563             and return('idnums', [$1,$2,$3,$4]);
1564             };
1565              
1566              
1567             #
1568             # ido
1569             #
1570             $state eq 'ido' and do {
1571              
1572             $state = 'norm';
1573              
1574             $$input =~ m{\G
1575             (?:
1576             ((?:[\d\.]+)?) # {num}
1577             ([^\$,\.:;@\x00-\x1F]) # idchar
1578             ([^\$,\.:;@\x00-\x1F]|(?:[\d\.]+))* # {idchar | num}*
1579             )?
1580             }xgc
1581             and return('ido', [$1,$2,$3]);
1582             };
1583              
1584              
1585             #
1586             # nums
1587             #
1588             $state eq 'nums' and do {
1589              
1590             $state = 'norm';
1591              
1592             $$input =~ m/\G([\d\.]*)/gc and return('nums', [$1]);
1593             };
1594              
1595              
1596             #
1597             # NO EXPECTED TOKEN! ERROR
1598             #
1599             return('',[ undef, -1 ]);
1600             }
1601              
1602              
1603              
1604             sub Run {
1605             my $self = shift;
1606             $input = shift;
1607             $revs_to_co = shift;
1608             $dates_to_co = shift;
1609              
1610             $dt = undef;
1611              
1612             $dt = new VCS::Rcs::Deltatext();
1613             $state = 'norm';
1614             $ft = 1;
1615             # $init_rev_no = undef;
1616              
1617             $self->YYParse( yylex => \&_Lexer, yyerror => \&_Error, yydebug => 0x00 );
1618              
1619             $dt
1620             }
1621              
1622             1;