File Coverage

blib/lib/OPTiMaDe/Filter/Parser.pm
Criterion Covered Total %
statement 9 9 100.0
branch n/a
condition n/a
subroutine 3 3 100.0
pod n/a
total 12 12 100.0


line stmt bran cond sub pod time code
1             ####################################################################
2             #
3             # This file was generated using Parse::Yapp version 1.21.
4             #
5             # Don't edit this file, use source file instead.
6             #
7             # ANY CHANGE MADE HERE WILL BE LOST !
8             #
9             ####################################################################
10             package OPTiMaDe::Filter::Parser;
11 5     5   101981 use vars qw ( @ISA );
  5         16  
  5         295  
12 5     5   29 use strict;
  5         7  
  5         144  
13              
14             @ISA= qw ( Parse::Yapp::Driver );
15 5     5   2367 use Parse::Yapp::Driver;
  5         10033  
  5         1422  
16              
17             #line 3 "lib/OPTiMaDe/Filter/Parser.yp"
18              
19              
20             use warnings;
21              
22             use Scalar::Util qw(blessed);
23              
24             use OPTiMaDe::Filter::AndOr;
25             use OPTiMaDe::Filter::Comparison;
26             use OPTiMaDe::Filter::Known;
27             use OPTiMaDe::Filter::ListComparison;
28             use OPTiMaDe::Filter::Negation;
29             use OPTiMaDe::Filter::Property;
30             use OPTiMaDe::Filter::Zip;
31              
32             our $allow_LIKE_operator = 0;
33              
34              
35              
36             sub new {
37             my($class)=shift;
38             ref($class)
39             and $class=ref($class);
40              
41             my($self)=$class->SUPER::new( yyversion => '1.21',
42             yystates =>
43             [
44             {#State 0
45             ACTIONS => {
46             'number' => 3,
47             "(" => 4,
48             'string' => 7,
49             'NOT' => 10,
50             'identifier' => 11
51             },
52             GOTOS => {
53             'constant_first_comparison' => 2,
54             'property' => 1,
55             'openingbrace' => 6,
56             'filter' => 5,
57             'property_first_comparison' => 8,
58             'comparison' => 15,
59             'expression_clause' => 14,
60             'constant' => 13,
61             'expression_phrase' => 12,
62             'expression' => 9
63             }
64             },
65             {#State 1
66             ACTIONS => {
67             'HAS' => 27,
68             'LENGTH' => 38,
69             "!" => 36,
70             "<" => 35,
71             'CONTAINS' => 25,
72             ">" => 21,
73             "." => 20,
74             'LIKE' => 32,
75             "=" => 18,
76             'IS' => 17,
77             'ENDS' => 16,
78             ":" => 29,
79             'STARTS' => 28
80             },
81             GOTOS => {
82             'value_op_rhs' => 33,
83             'fuzzy_string_op_rhs' => 19,
84             'dot' => 30,
85             'set_op_rhs' => 31,
86             'colon' => 26,
87             'operator' => 37,
88             'known_op_rhs' => 22,
89             'set_zip_op_rhs' => 34,
90             'property_zip_addon' => 24,
91             'length_op_rhs' => 23
92             }
93             },
94             {#State 2
95             DEFAULT => -26
96             },
97             {#State 3
98             DEFAULT => -3
99             },
100             {#State 4
101             DEFAULT => -59
102             },
103             {#State 5
104             ACTIONS => {
105             '' => 39
106             }
107             },
108             {#State 6
109             ACTIONS => {
110             'identifier' => 11,
111             'NOT' => 10,
112             'string' => 7,
113             "(" => 4,
114             'number' => 3
115             },
116             GOTOS => {
117             'expression' => 40,
118             'expression_phrase' => 12,
119             'constant' => 13,
120             'comparison' => 15,
121             'expression_clause' => 14,
122             'property_first_comparison' => 8,
123             'openingbrace' => 6,
124             'constant_first_comparison' => 2,
125             'property' => 1
126             }
127             },
128             {#State 7
129             DEFAULT => -2
130             },
131             {#State 8
132             DEFAULT => -27
133             },
134             {#State 9
135             DEFAULT => -1
136             },
137             {#State 10
138             ACTIONS => {
139             "(" => 4,
140             'number' => 3,
141             'string' => 7,
142             'identifier' => 11
143             },
144             GOTOS => {
145             'property' => 1,
146             'constant_first_comparison' => 2,
147             'property_first_comparison' => 8,
148             'openingbrace' => 41,
149             'constant' => 13,
150             'comparison' => 42
151             }
152             },
153             {#State 11
154             DEFAULT => -57
155             },
156             {#State 12
157             ACTIONS => {
158             'AND' => 43
159             },
160             DEFAULT => -20
161             },
162             {#State 13
163             ACTIONS => {
164             "=" => 18,
165             ">" => 21,
166             "<" => 35,
167             "!" => 36
168             },
169             GOTOS => {
170             'operator' => 37,
171             'value_op_rhs' => 44
172             }
173             },
174             {#State 14
175             ACTIONS => {
176             'OR' => 45
177             },
178             DEFAULT => -18
179             },
180             {#State 15
181             DEFAULT => -22
182             },
183             {#State 16
184             ACTIONS => {
185             'identifier' => 11,
186             'string' => 46,
187             'WITH' => 49,
188             'number' => 48
189             },
190             GOTOS => {
191             'property' => 47,
192             'value' => 50
193             }
194             },
195             {#State 17
196             ACTIONS => {
197             'KNOWN' => 52,
198             'UNKNOWN' => 51
199             }
200             },
201             {#State 18
202             DEFAULT => -68
203             },
204             {#State 19
205             DEFAULT => -31
206             },
207             {#State 20
208             DEFAULT => -61
209             },
210             {#State 21
211             ACTIONS => {
212             "=" => 53
213             },
214             DEFAULT => -66
215             },
216             {#State 22
217             DEFAULT => -30
218             },
219             {#State 23
220             DEFAULT => -34
221             },
222             {#State 24
223             ACTIONS => {
224             ":" => 29,
225             'HAS' => 55
226             },
227             GOTOS => {
228             'colon' => 54
229             }
230             },
231             {#State 25
232             ACTIONS => {
233             'number' => 48,
234             'identifier' => 11,
235             'string' => 46
236             },
237             GOTOS => {
238             'value' => 56,
239             'property' => 47
240             }
241             },
242             {#State 26
243             ACTIONS => {
244             'identifier' => 11
245             },
246             GOTOS => {
247             'property' => 57
248             }
249             },
250             {#State 27
251             ACTIONS => {
252             'identifier' => 11,
253             'ANY' => 60,
254             ">" => 21,
255             "!" => 36,
256             "<" => 35,
257             "=" => 18,
258             'string' => 46,
259             'ALL' => 62,
260             'ONLY' => 59,
261             'number' => 48
262             },
263             GOTOS => {
264             'property' => 47,
265             'operator' => 61,
266             'value' => 58
267             }
268             },
269             {#State 28
270             ACTIONS => {
271             'identifier' => 11,
272             'string' => 46,
273             'number' => 48,
274             'WITH' => 63
275             },
276             GOTOS => {
277             'property' => 47,
278             'value' => 64
279             }
280             },
281             {#State 29
282             DEFAULT => -63
283             },
284             {#State 30
285             ACTIONS => {
286             'identifier' => 65
287             }
288             },
289             {#State 31
290             DEFAULT => -32
291             },
292             {#State 32
293             ACTIONS => {
294             'identifier' => 11,
295             'string' => 46,
296             'number' => 48
297             },
298             GOTOS => {
299             'property' => 47,
300             'value' => 66
301             }
302             },
303             {#State 33
304             DEFAULT => -29
305             },
306             {#State 34
307             DEFAULT => -33
308             },
309             {#State 35
310             ACTIONS => {
311             "=" => 67
312             },
313             DEFAULT => -64
314             },
315             {#State 36
316             ACTIONS => {
317             "=" => 68
318             }
319             },
320             {#State 37
321             ACTIONS => {
322             'number' => 48,
323             'identifier' => 11,
324             'string' => 46
325             },
326             GOTOS => {
327             'value' => 69,
328             'property' => 47
329             }
330             },
331             {#State 38
332             ACTIONS => {
333             ">" => 21,
334             'string' => 46,
335             "=" => 18,
336             'identifier' => 11,
337             "<" => 35,
338             "!" => 36,
339             'number' => 48
340             },
341             GOTOS => {
342             'value' => 71,
343             'property' => 47,
344             'operator' => 70
345             }
346             },
347             {#State 39
348             DEFAULT => 0
349             },
350             {#State 40
351             ACTIONS => {
352             ")" => 72
353             },
354             GOTOS => {
355             'closingbrace' => 73
356             }
357             },
358             {#State 41
359             ACTIONS => {
360             'number' => 3,
361             "(" => 4,
362             'NOT' => 10,
363             'identifier' => 11,
364             'string' => 7
365             },
366             GOTOS => {
367             'expression' => 74,
368             'constant' => 13,
369             'expression_phrase' => 12,
370             'expression_clause' => 14,
371             'comparison' => 15,
372             'property_first_comparison' => 8,
373             'openingbrace' => 6,
374             'property' => 1,
375             'constant_first_comparison' => 2
376             }
377             },
378             {#State 42
379             DEFAULT => -24
380             },
381             {#State 43
382             ACTIONS => {
383             'string' => 7,
384             'identifier' => 11,
385             'NOT' => 10,
386             "(" => 4,
387             'number' => 3
388             },
389             GOTOS => {
390             'constant_first_comparison' => 2,
391             'property' => 1,
392             'openingbrace' => 6,
393             'property_first_comparison' => 8,
394             'comparison' => 15,
395             'expression_clause' => 75,
396             'constant' => 13,
397             'expression_phrase' => 12
398             }
399             },
400             {#State 44
401             DEFAULT => -28
402             },
403             {#State 45
404             ACTIONS => {
405             'string' => 7,
406             'identifier' => 11,
407             'NOT' => 10,
408             "(" => 4,
409             'number' => 3
410             },
411             GOTOS => {
412             'comparison' => 15,
413             'expression_clause' => 14,
414             'constant' => 13,
415             'expression_phrase' => 12,
416             'expression' => 76,
417             'property_first_comparison' => 8,
418             'openingbrace' => 6,
419             'constant_first_comparison' => 2,
420             'property' => 1
421             }
422             },
423             {#State 46
424             DEFAULT => -4
425             },
426             {#State 47
427             ACTIONS => {
428             "." => 20
429             },
430             DEFAULT => -6,
431             GOTOS => {
432             'dot' => 30
433             }
434             },
435             {#State 48
436             DEFAULT => -5
437             },
438             {#State 49
439             ACTIONS => {
440             'number' => 48,
441             'string' => 46,
442             'identifier' => 11
443             },
444             GOTOS => {
445             'value' => 77,
446             'property' => 47
447             }
448             },
449             {#State 50
450             DEFAULT => -41
451             },
452             {#State 51
453             DEFAULT => -37
454             },
455             {#State 52
456             DEFAULT => -36
457             },
458             {#State 53
459             DEFAULT => -67
460             },
461             {#State 54
462             ACTIONS => {
463             'identifier' => 11
464             },
465             GOTOS => {
466             'property' => 78
467             }
468             },
469             {#State 55
470             ACTIONS => {
471             "=" => 18,
472             'string' => 46,
473             'ALL' => 79,
474             'ONLY' => 83,
475             'number' => 48,
476             'identifier' => 11,
477             'ANY' => 82,
478             ">" => 21,
479             "!" => 36,
480             "<" => 35
481             },
482             GOTOS => {
483             'operator' => 81,
484             'property' => 47,
485             'value' => 84,
486             'value_zip' => 80
487             }
488             },
489             {#State 56
490             DEFAULT => -38
491             },
492             {#State 57
493             ACTIONS => {
494             "." => 20
495             },
496             DEFAULT => -53,
497             GOTOS => {
498             'dot' => 30
499             }
500             },
501             {#State 58
502             DEFAULT => -44
503             },
504             {#State 59
505             ACTIONS => {
506             "<" => 35,
507             'number' => 48,
508             "!" => 36,
509             'identifier' => 11,
510             "=" => 18,
511             ">" => 21,
512             'string' => 46
513             },
514             GOTOS => {
515             'property' => 47,
516             'operator' => 85,
517             'value_list' => 86,
518             'value' => 87
519             }
520             },
521             {#State 60
522             ACTIONS => {
523             'string' => 46,
524             ">" => 21,
525             'identifier' => 11,
526             "=" => 18,
527             'number' => 48,
528             "!" => 36,
529             "<" => 35
530             },
531             GOTOS => {
532             'property' => 47,
533             'operator' => 85,
534             'value_list' => 88,
535             'value' => 87
536             }
537             },
538             {#State 61
539             ACTIONS => {
540             'number' => 48,
541             'string' => 46,
542             'identifier' => 11
543             },
544             GOTOS => {
545             'property' => 47,
546             'value' => 89
547             }
548             },
549             {#State 62
550             ACTIONS => {
551             ">" => 21,
552             'string' => 46,
553             'identifier' => 11,
554             "=" => 18,
555             "<" => 35,
556             'number' => 48,
557             "!" => 36
558             },
559             GOTOS => {
560             'operator' => 85,
561             'property' => 47,
562             'value_list' => 90,
563             'value' => 87
564             }
565             },
566             {#State 63
567             ACTIONS => {
568             'string' => 46,
569             'identifier' => 11,
570             'number' => 48
571             },
572             GOTOS => {
573             'property' => 47,
574             'value' => 91
575             }
576             },
577             {#State 64
578             DEFAULT => -39
579             },
580             {#State 65
581             DEFAULT => -58
582             },
583             {#State 66
584             DEFAULT => -43
585             },
586             {#State 67
587             DEFAULT => -65
588             },
589             {#State 68
590             DEFAULT => -69
591             },
592             {#State 69
593             DEFAULT => -35
594             },
595             {#State 70
596             ACTIONS => {
597             'identifier' => 11,
598             'string' => 46,
599             'number' => 48
600             },
601             GOTOS => {
602             'property' => 47,
603             'value' => 92
604             }
605             },
606             {#State 71
607             DEFAULT => -55
608             },
609             {#State 72
610             DEFAULT => -60
611             },
612             {#State 73
613             DEFAULT => -23
614             },
615             {#State 74
616             ACTIONS => {
617             ")" => 72
618             },
619             GOTOS => {
620             'closingbrace' => 93
621             }
622             },
623             {#State 75
624             DEFAULT => -21
625             },
626             {#State 76
627             DEFAULT => -19
628             },
629             {#State 77
630             DEFAULT => -42
631             },
632             {#State 78
633             ACTIONS => {
634             "." => 20
635             },
636             DEFAULT => -54,
637             GOTOS => {
638             'dot' => 30
639             }
640             },
641             {#State 79
642             ACTIONS => {
643             'identifier' => 11,
644             "=" => 18,
645             'string' => 46,
646             ">" => 21,
647             "<" => 35,
648             'number' => 48,
649             "!" => 36
650             },
651             GOTOS => {
652             'property' => 47,
653             'operator' => 81,
654             'value' => 84,
655             'value_zip_list' => 95,
656             'value_zip' => 94
657             }
658             },
659             {#State 80
660             ACTIONS => {
661             ":" => 29
662             },
663             DEFAULT => -49,
664             GOTOS => {
665             'colon' => 97,
666             'value_zip_part' => 96
667             }
668             },
669             {#State 81
670             ACTIONS => {
671             'string' => 46,
672             'identifier' => 11,
673             'number' => 48
674             },
675             GOTOS => {
676             'value' => 98,
677             'property' => 47
678             }
679             },
680             {#State 82
681             ACTIONS => {
682             "<" => 35,
683             'number' => 48,
684             "!" => 36,
685             'identifier' => 11,
686             "=" => 18,
687             ">" => 21,
688             'string' => 46
689             },
690             GOTOS => {
691             'value_zip_list' => 99,
692             'value' => 84,
693             'value_zip' => 94,
694             'operator' => 81,
695             'property' => 47
696             }
697             },
698             {#State 83
699             ACTIONS => {
700             "=" => 18,
701             'identifier' => 11,
702             ">" => 21,
703             'string' => 46,
704             'number' => 48,
705             "!" => 36,
706             "<" => 35
707             },
708             GOTOS => {
709             'value' => 84,
710             'value_zip_list' => 100,
711             'value_zip' => 94,
712             'property' => 47,
713             'operator' => 81
714             }
715             },
716             {#State 84
717             ACTIONS => {
718             ":" => 29
719             },
720             GOTOS => {
721             'value_zip_part' => 101,
722             'colon' => 97
723             }
724             },
725             {#State 85
726             ACTIONS => {
727             'number' => 48,
728             'string' => 46,
729             'identifier' => 11
730             },
731             GOTOS => {
732             'property' => 47,
733             'value' => 102
734             }
735             },
736             {#State 86
737             ACTIONS => {
738             "," => 103
739             },
740             DEFAULT => -48,
741             GOTOS => {
742             'comma' => 104
743             }
744             },
745             {#State 87
746             DEFAULT => -7
747             },
748             {#State 88
749             ACTIONS => {
750             "," => 103
751             },
752             DEFAULT => -47,
753             GOTOS => {
754             'comma' => 104
755             }
756             },
757             {#State 89
758             DEFAULT => -45
759             },
760             {#State 90
761             ACTIONS => {
762             "," => 103
763             },
764             DEFAULT => -46,
765             GOTOS => {
766             'comma' => 104
767             }
768             },
769             {#State 91
770             DEFAULT => -40
771             },
772             {#State 92
773             DEFAULT => -56
774             },
775             {#State 93
776             DEFAULT => -25
777             },
778             {#State 94
779             ACTIONS => {
780             ":" => 29
781             },
782             DEFAULT => -16,
783             GOTOS => {
784             'value_zip_part' => 96,
785             'colon' => 97
786             }
787             },
788             {#State 95
789             ACTIONS => {
790             "," => 103
791             },
792             DEFAULT => -51,
793             GOTOS => {
794             'comma' => 105
795             }
796             },
797             {#State 96
798             DEFAULT => -13
799             },
800             {#State 97
801             ACTIONS => {
802             "!" => 36,
803             'number' => 48,
804             "<" => 35,
805             'identifier' => 11,
806             "=" => 18,
807             'string' => 46,
808             ">" => 21
809             },
810             GOTOS => {
811             'value' => 106,
812             'operator' => 107,
813             'property' => 47
814             }
815             },
816             {#State 98
817             ACTIONS => {
818             ":" => 29
819             },
820             GOTOS => {
821             'value_zip_part' => 108,
822             'colon' => 97
823             }
824             },
825             {#State 99
826             ACTIONS => {
827             "," => 103
828             },
829             DEFAULT => -52,
830             GOTOS => {
831             'comma' => 105
832             }
833             },
834             {#State 100
835             ACTIONS => {
836             "," => 103
837             },
838             DEFAULT => -50,
839             GOTOS => {
840             'comma' => 105
841             }
842             },
843             {#State 101
844             DEFAULT => -11
845             },
846             {#State 102
847             DEFAULT => -8
848             },
849             {#State 103
850             DEFAULT => -62
851             },
852             {#State 104
853             ACTIONS => {
854             "=" => 18,
855             'identifier' => 11,
856             ">" => 21,
857             'string' => 46,
858             'number' => 48,
859             "!" => 36,
860             "<" => 35
861             },
862             GOTOS => {
863             'value' => 109,
864             'operator' => 110,
865             'property' => 47
866             }
867             },
868             {#State 105
869             ACTIONS => {
870             "=" => 18,
871             'identifier' => 11,
872             ">" => 21,
873             'string' => 46,
874             'number' => 48,
875             "!" => 36,
876             "<" => 35
877             },
878             GOTOS => {
879             'operator' => 81,
880             'property' => 47,
881             'value' => 84,
882             'value_zip' => 111
883             }
884             },
885             {#State 106
886             DEFAULT => -14
887             },
888             {#State 107
889             ACTIONS => {
890             'number' => 48,
891             'string' => 46,
892             'identifier' => 11
893             },
894             GOTOS => {
895             'value' => 112,
896             'property' => 47
897             }
898             },
899             {#State 108
900             DEFAULT => -12
901             },
902             {#State 109
903             DEFAULT => -9
904             },
905             {#State 110
906             ACTIONS => {
907             'string' => 46,
908             'identifier' => 11,
909             'number' => 48
910             },
911             GOTOS => {
912             'value' => 113,
913             'property' => 47
914             }
915             },
916             {#State 111
917             ACTIONS => {
918             ":" => 29
919             },
920             DEFAULT => -17,
921             GOTOS => {
922             'colon' => 97,
923             'value_zip_part' => 96
924             }
925             },
926             {#State 112
927             DEFAULT => -15
928             },
929             {#State 113
930             DEFAULT => -10
931             }
932             ],
933             yyrules =>
934             [
935             [#Rule 0
936             '$start', 2, undef
937             ],
938             [#Rule 1
939             'filter', 1, undef
940             ],
941             [#Rule 2
942             'constant', 1, undef
943             ],
944             [#Rule 3
945             'constant', 1, undef
946             ],
947             [#Rule 4
948             'value', 1, undef
949             ],
950             [#Rule 5
951             'value', 1, undef
952             ],
953             [#Rule 6
954             'value', 1, undef
955             ],
956             [#Rule 7
957             'value_list', 1,
958             sub
959             #line 36 "lib/OPTiMaDe/Filter/Parser.yp"
960             {
961             return [ [ '=', $_[1] ] ];
962             }
963             ],
964             [#Rule 8
965             'value_list', 2,
966             sub
967             #line 40 "lib/OPTiMaDe/Filter/Parser.yp"
968             {
969             return [ [ @_[1..$#_] ] ];
970             }
971             ],
972             [#Rule 9
973             'value_list', 3,
974             sub
975             #line 44 "lib/OPTiMaDe/Filter/Parser.yp"
976             {
977             push @{$_[1]}, [ '=', $_[3] ];
978             return $_[1];
979             }
980             ],
981             [#Rule 10
982             'value_list', 4,
983             sub
984             #line 49 "lib/OPTiMaDe/Filter/Parser.yp"
985             {
986             push @{$_[1]}, [ $_[3], $_[4] ];
987             return $_[1];
988             }
989             ],
990             [#Rule 11
991             'value_zip', 2,
992             sub
993             #line 56 "lib/OPTiMaDe/Filter/Parser.yp"
994             {
995             return [ [ '=', $_[1] ], $_[2] ];
996             }
997             ],
998             [#Rule 12
999             'value_zip', 3,
1000             sub
1001             #line 60 "lib/OPTiMaDe/Filter/Parser.yp"
1002             {
1003             return [ [ $_[1], $_[2] ], $_[3] ];
1004             }
1005             ],
1006             [#Rule 13
1007             'value_zip', 2,
1008             sub
1009             #line 64 "lib/OPTiMaDe/Filter/Parser.yp"
1010             {
1011             push @{$_[1]}, $_[2];
1012             return $_[1];
1013             }
1014             ],
1015             [#Rule 14
1016             'value_zip_part', 2,
1017             sub
1018             #line 71 "lib/OPTiMaDe/Filter/Parser.yp"
1019             {
1020             return [ '=', $_[2] ];
1021             }
1022             ],
1023             [#Rule 15
1024             'value_zip_part', 3,
1025             sub
1026             #line 75 "lib/OPTiMaDe/Filter/Parser.yp"
1027             {
1028             return [ $_[2], $_[3] ];
1029             }
1030             ],
1031             [#Rule 16
1032             'value_zip_list', 1,
1033             sub
1034             #line 81 "lib/OPTiMaDe/Filter/Parser.yp"
1035             {
1036             return [ $_[1] ];
1037             }
1038             ],
1039             [#Rule 17
1040             'value_zip_list', 3,
1041             sub
1042             #line 85 "lib/OPTiMaDe/Filter/Parser.yp"
1043             {
1044             push @{$_[1]}, $_[3];
1045             return $_[1];
1046             }
1047             ],
1048             [#Rule 18
1049             'expression', 1, undef
1050             ],
1051             [#Rule 19
1052             'expression', 3,
1053             sub
1054             #line 95 "lib/OPTiMaDe/Filter/Parser.yp"
1055             {
1056             return OPTiMaDe::Filter::AndOr->new( @_[1..$#_] );
1057             }
1058             ],
1059             [#Rule 20
1060             'expression_clause', 1, undef
1061             ],
1062             [#Rule 21
1063             'expression_clause', 3,
1064             sub
1065             #line 102 "lib/OPTiMaDe/Filter/Parser.yp"
1066             {
1067             return OPTiMaDe::Filter::AndOr->new( @_[1..$#_] );
1068             }
1069             ],
1070             [#Rule 22
1071             'expression_phrase', 1, undef
1072             ],
1073             [#Rule 23
1074             'expression_phrase', 3,
1075             sub
1076             #line 109 "lib/OPTiMaDe/Filter/Parser.yp"
1077             {
1078             return $_[2];
1079             }
1080             ],
1081             [#Rule 24
1082             'expression_phrase', 2,
1083             sub
1084             #line 113 "lib/OPTiMaDe/Filter/Parser.yp"
1085             {
1086             return OPTiMaDe::Filter::Negation->new( $_[2] );
1087             }
1088             ],
1089             [#Rule 25
1090             'expression_phrase', 4,
1091             sub
1092             #line 117 "lib/OPTiMaDe/Filter/Parser.yp"
1093             {
1094             return OPTiMaDe::Filter::Negation->new( $_[3] );
1095             }
1096             ],
1097             [#Rule 26
1098             'comparison', 1, undef
1099             ],
1100             [#Rule 27
1101             'comparison', 1, undef
1102             ],
1103             [#Rule 28
1104             'constant_first_comparison', 2,
1105             sub
1106             #line 125 "lib/OPTiMaDe/Filter/Parser.yp"
1107             {
1108             $_[2]->unshift_operand( $_[1] );
1109             return $_[2];
1110             }
1111             ],
1112             [#Rule 29
1113             'property_first_comparison', 2,
1114             sub
1115             #line 132 "lib/OPTiMaDe/Filter/Parser.yp"
1116             {
1117             $_[2]->unshift_operand( $_[1] );
1118             return $_[2];
1119             }
1120             ],
1121             [#Rule 30
1122             'property_first_comparison', 2,
1123             sub
1124             #line 137 "lib/OPTiMaDe/Filter/Parser.yp"
1125             {
1126             $_[2]->property( $_[1] );
1127             return $_[2];
1128             }
1129             ],
1130             [#Rule 31
1131             'property_first_comparison', 2,
1132             sub
1133             #line 142 "lib/OPTiMaDe/Filter/Parser.yp"
1134             {
1135             $_[2]->unshift_operand( $_[1] );
1136             return $_[2];
1137             }
1138             ],
1139             [#Rule 32
1140             'property_first_comparison', 2,
1141             sub
1142             #line 147 "lib/OPTiMaDe/Filter/Parser.yp"
1143             {
1144             $_[2]->property( $_[1] );
1145             return $_[2];
1146             }
1147             ],
1148             [#Rule 33
1149             'property_first_comparison', 2,
1150             sub
1151             #line 152 "lib/OPTiMaDe/Filter/Parser.yp"
1152             {
1153             $_[2]->unshift_property( $_[1] );
1154             return $_[2];
1155             }
1156             ],
1157             [#Rule 34
1158             'property_first_comparison', 2,
1159             sub
1160             #line 157 "lib/OPTiMaDe/Filter/Parser.yp"
1161             {
1162             $_[2]->property( $_[1] );
1163             return $_[2];
1164             }
1165             ],
1166             [#Rule 35
1167             'value_op_rhs', 2,
1168             sub
1169             #line 164 "lib/OPTiMaDe/Filter/Parser.yp"
1170             {
1171             my $cmp = OPTiMaDe::Filter::Comparison->new( $_[1] );
1172             $cmp->push_operand( $_[2] );
1173             return $cmp;
1174             }
1175             ],
1176             [#Rule 36
1177             'known_op_rhs', 2,
1178             sub
1179             #line 172 "lib/OPTiMaDe/Filter/Parser.yp"
1180             {
1181             return OPTiMaDe::Filter::Known->new( 1 );
1182             }
1183             ],
1184             [#Rule 37
1185             'known_op_rhs', 2,
1186             sub
1187             #line 176 "lib/OPTiMaDe/Filter/Parser.yp"
1188             {
1189             return OPTiMaDe::Filter::Known->new( 0 );
1190             }
1191             ],
1192             [#Rule 38
1193             'fuzzy_string_op_rhs', 2,
1194             sub
1195             #line 182 "lib/OPTiMaDe/Filter/Parser.yp"
1196             {
1197             my $cmp = OPTiMaDe::Filter::Comparison->new( $_[1] );
1198             $cmp->push_operand( $_[2] );
1199             return $cmp;
1200             }
1201             ],
1202             [#Rule 39
1203             'fuzzy_string_op_rhs', 2,
1204             sub
1205             #line 188 "lib/OPTiMaDe/Filter/Parser.yp"
1206             {
1207             my $cmp = OPTiMaDe::Filter::Comparison->new( $_[1] );
1208             $cmp->push_operand( $_[2] );
1209             return $cmp;
1210             }
1211             ],
1212             [#Rule 40
1213             'fuzzy_string_op_rhs', 3,
1214             sub
1215             #line 194 "lib/OPTiMaDe/Filter/Parser.yp"
1216             {
1217             my $cmp = OPTiMaDe::Filter::Comparison->new( "$_[1] $_[2]" );
1218             $cmp->push_operand( $_[3] );
1219             return $cmp;
1220             }
1221             ],
1222             [#Rule 41
1223             'fuzzy_string_op_rhs', 2,
1224             sub
1225             #line 200 "lib/OPTiMaDe/Filter/Parser.yp"
1226             {
1227             my $cmp = OPTiMaDe::Filter::Comparison->new( $_[1] );
1228             $cmp->push_operand( $_[2] );
1229             return $cmp;
1230             }
1231             ],
1232             [#Rule 42
1233             'fuzzy_string_op_rhs', 3,
1234             sub
1235             #line 206 "lib/OPTiMaDe/Filter/Parser.yp"
1236             {
1237             my $cmp = OPTiMaDe::Filter::Comparison->new( "$_[1] $_[2]" );
1238             $cmp->push_operand( $_[3] );
1239             return $cmp;
1240             }
1241             ],
1242             [#Rule 43
1243             'fuzzy_string_op_rhs', 2,
1244             sub
1245             #line 212 "lib/OPTiMaDe/Filter/Parser.yp"
1246             {
1247             my $cmp = OPTiMaDe::Filter::Comparison->new( $_[1] );
1248             $cmp->push_operand( $_[2] );
1249             return $cmp;
1250             }
1251             ],
1252             [#Rule 44
1253             'set_op_rhs', 2,
1254             sub
1255             #line 220 "lib/OPTiMaDe/Filter/Parser.yp"
1256             {
1257             my $lc = OPTiMaDe::Filter::ListComparison->new( $_[1] );
1258             $lc->values( [ [ '=', $_[2] ] ] );
1259             return $lc;
1260             }
1261             ],
1262             [#Rule 45
1263             'set_op_rhs', 3,
1264             sub
1265             #line 226 "lib/OPTiMaDe/Filter/Parser.yp"
1266             {
1267             my $lc = OPTiMaDe::Filter::ListComparison->new( $_[1] );
1268             $lc->values( [ [ $_[2], $_[3] ] ] );
1269             return $lc;
1270             }
1271             ],
1272             [#Rule 46
1273             'set_op_rhs', 3,
1274             sub
1275             #line 232 "lib/OPTiMaDe/Filter/Parser.yp"
1276             {
1277             my $lc = OPTiMaDe::Filter::ListComparison->new( "$_[1] $_[2]" );
1278             $lc->values( $_[3] );
1279             return $lc;
1280             }
1281             ],
1282             [#Rule 47
1283             'set_op_rhs', 3,
1284             sub
1285             #line 238 "lib/OPTiMaDe/Filter/Parser.yp"
1286             {
1287             my $lc = OPTiMaDe::Filter::ListComparison->new( "$_[1] $_[2]" );
1288             $lc->values( $_[3] );
1289             return $lc;
1290             }
1291             ],
1292             [#Rule 48
1293             'set_op_rhs', 3,
1294             sub
1295             #line 244 "lib/OPTiMaDe/Filter/Parser.yp"
1296             {
1297             my $lc = OPTiMaDe::Filter::ListComparison->new( "$_[1] $_[2]" );
1298             $lc->values( $_[3] );
1299             return $lc;
1300             }
1301             ],
1302             [#Rule 49
1303             'set_zip_op_rhs', 3,
1304             sub
1305             #line 252 "lib/OPTiMaDe/Filter/Parser.yp"
1306             {
1307             $_[1]->operator( $_[2] );
1308             $_[1]->values( [ $_[3] ] );
1309             return $_[1];
1310             }
1311             ],
1312             [#Rule 50
1313             'set_zip_op_rhs', 4,
1314             sub
1315             #line 258 "lib/OPTiMaDe/Filter/Parser.yp"
1316             {
1317             $_[1]->operator( "$_[2] $_[3]" );
1318             $_[1]->values( $_[4] );
1319             return $_[1];
1320             }
1321             ],
1322             [#Rule 51
1323             'set_zip_op_rhs', 4,
1324             sub
1325             #line 264 "lib/OPTiMaDe/Filter/Parser.yp"
1326             {
1327             $_[1]->operator( "$_[2] $_[3]" );
1328             $_[1]->values( $_[4] );
1329             return $_[1];
1330             }
1331             ],
1332             [#Rule 52
1333             'set_zip_op_rhs', 4,
1334             sub
1335             #line 270 "lib/OPTiMaDe/Filter/Parser.yp"
1336             {
1337             $_[1]->operator( "$_[2] $_[3]" );
1338             $_[1]->values( $_[4] );
1339             return $_[1];
1340             }
1341             ],
1342             [#Rule 53
1343             'property_zip_addon', 2,
1344             sub
1345             #line 278 "lib/OPTiMaDe/Filter/Parser.yp"
1346             {
1347             my $zip = OPTiMaDe::Filter::Zip->new;
1348             $zip->push_property( $_[2] );
1349             return $zip;
1350             }
1351             ],
1352             [#Rule 54
1353             'property_zip_addon', 3,
1354             sub
1355             #line 284 "lib/OPTiMaDe/Filter/Parser.yp"
1356             {
1357             $_[1]->push_property( $_[3] );
1358             return $_[1];
1359             }
1360             ],
1361             [#Rule 55
1362             'length_op_rhs', 2,
1363             sub
1364             #line 291 "lib/OPTiMaDe/Filter/Parser.yp"
1365             {
1366             my $cmp = OPTiMaDe::Filter::ListComparison->new( $_[1] );
1367             $cmp->values( [ [ '=', $_[2] ] ] );
1368             return $cmp;
1369             }
1370             ],
1371             [#Rule 56
1372             'length_op_rhs', 3,
1373             sub
1374             #line 297 "lib/OPTiMaDe/Filter/Parser.yp"
1375             {
1376             my $cmp = OPTiMaDe::Filter::ListComparison->new( $_[1] );
1377             $cmp->values( [ [ $_[2], $_[3] ] ] );
1378             return $cmp;
1379             }
1380             ],
1381             [#Rule 57
1382             'property', 1,
1383             sub
1384             #line 307 "lib/OPTiMaDe/Filter/Parser.yp"
1385             {
1386             return OPTiMaDe::Filter::Property->new( $_[1] );
1387             }
1388             ],
1389             [#Rule 58
1390             'property', 3,
1391             sub
1392             #line 311 "lib/OPTiMaDe/Filter/Parser.yp"
1393             {
1394             push @{$_[1]}, $_[3];
1395             return $_[1];
1396             }
1397             ],
1398             [#Rule 59
1399             'openingbrace', 1, undef
1400             ],
1401             [#Rule 60
1402             'closingbrace', 1, undef
1403             ],
1404             [#Rule 61
1405             'dot', 1, undef
1406             ],
1407             [#Rule 62
1408             'comma', 1, undef
1409             ],
1410             [#Rule 63
1411             'colon', 1, undef
1412             ],
1413             [#Rule 64
1414             'operator', 1, undef
1415             ],
1416             [#Rule 65
1417             'operator', 2,
1418             sub
1419             #line 333 "lib/OPTiMaDe/Filter/Parser.yp"
1420             {
1421             return join( '', @_[1..$#_] );
1422             }
1423             ],
1424             [#Rule 66
1425             'operator', 1, undef
1426             ],
1427             [#Rule 67
1428             'operator', 2,
1429             sub
1430             #line 338 "lib/OPTiMaDe/Filter/Parser.yp"
1431             {
1432             return join( '', @_[1..$#_] );
1433             }
1434             ],
1435             [#Rule 68
1436             'operator', 1, undef
1437             ],
1438             [#Rule 69
1439             'operator', 2,
1440             sub
1441             #line 343 "lib/OPTiMaDe/Filter/Parser.yp"
1442             {
1443             return join( '', @_[1..$#_] );
1444             }
1445             ]
1446             ],
1447             @_);
1448             bless($self,$class);
1449             }
1450              
1451             #line 348 "lib/OPTiMaDe/Filter/Parser.yp"
1452              
1453              
1454             # Footer section
1455              
1456             sub _Error
1457             {
1458             my( $self ) = @_;
1459             close $self->{USER}{FILEIN} if $self->{USER}{FILEIN};
1460             my $msg = "$0: syntax error at line $self->{USER}{LINENO}, " .
1461             "position $self->{USER}{CHARNO}";
1462             if( $self->YYData->{INPUT} ) {
1463             $self->YYData->{INPUT} =~ s/\n$//;
1464             die "$msg: '" . $self->YYData->{INPUT} . "'.\n";
1465             } else {
1466             die "$msg.\n";
1467             }
1468             }
1469              
1470             sub _Lexer
1471             {
1472             my( $self ) = @_;
1473              
1474             # If the line is empty and the input is originating from the file,
1475             # another line is read.
1476             if( !$self->YYData->{INPUT} && $self->{USER}{FILEIN} ) {
1477             my $filein = $self->{USER}{FILEIN};
1478             $self->YYData->{INPUT} = <$filein>;
1479             $self->{USER}{LINENO} = -1 unless exists $self->{USER}{LINENO};
1480             $self->{USER}{LINENO}++;
1481             $self->{USER}{CHARNO} = 0;
1482             }
1483              
1484             $self->YYData->{INPUT} =~ s/^(\s+)//;
1485             $self->{USER}{CHARNO} += length( $1 ) if defined $1;
1486              
1487             # Escaped double quote or backslash are detected here and returned
1488             # as is to the caller in order to be detected as syntax errors.
1489             if( $self->YYData->{INPUT} =~ s/^(\\"|\\\\)// ) {
1490             $self->{USER}{CHARNO} += length( $1 );
1491             return( $1, $1 );
1492             }
1493              
1494             # Handling strings
1495             if( $self->YYData->{INPUT} =~ s/^"// ) {
1496             $self->{USER}{CHARNO} ++;
1497             my $string = '';
1498             while( 1 ) {
1499             if( $self->YYData->{INPUT} =~
1500             s/^([A-Za-z_0-9 \t!#\$\%&\'\(\)\*\+,\-\.\/\:;<=>\?@\[\]\^`\{\|\}\~\P{ASCII}]+)// ) {
1501             $self->{USER}{CHARNO} += length( $1 );
1502             $string .= $1;
1503             } elsif( $self->YYData->{INPUT} =~ s/^\\([\\"])// ) {
1504             $self->{USER}{CHARNO} ++;
1505             $string .= $1;
1506             next;
1507             } elsif( $self->YYData->{INPUT} =~ s/^"// ) {
1508             $self->{USER}{CHARNO} ++;
1509             return( 'string', $string );
1510             } else {
1511             return( undef, undef );
1512             }
1513             }
1514             }
1515              
1516             # Handling identifiers
1517             if( $self->YYData->{INPUT} =~ s/^([a-z_][a-z0-9_]*)// ) {
1518             $self->{USER}{CHARNO} += length( $1 );
1519             return( 'identifier', $1 );
1520             }
1521              
1522             # Handling boolean relations
1523             if( $self->YYData->{INPUT} =~ s/^(AND|NOT|OR|
1524             IS|UNKNOWN|KNOWN|
1525             CONTAINS|STARTS|ENDS|WITH|
1526             LENGTH|HAS|ALL|ONLY|ANY)//x ) {
1527             $self->{USER}{CHARNO} += length( $1 );
1528             return( $1, $1 );
1529             }
1530              
1531             # Handling LIKE operator if allowed
1532             if( $allow_LIKE_operator && $self->YYData->{INPUT} =~ s/^(LIKE)// ) {
1533             $self->{USER}{CHARNO} += length( $1 );
1534             return( $1, $1 );
1535             }
1536              
1537             # Handling numbers
1538             if( $self->YYData->{INPUT} =~ s/^([+-]?
1539             (\d+\.?\d*|\.\d+)
1540             ([eE][+-]?\d+)?)//x ) {
1541             $self->{USER}{CHARNO} += length( $1 );
1542             return( 'number', $1 );
1543             }
1544              
1545             my $char = substr( $self->YYData->{INPUT}, 0, 1 );
1546             if( $char ne '' ) {
1547             $self->YYData->{INPUT} = substr( $self->YYData->{INPUT}, 1 );
1548             }
1549             $self->{USER}{CHARNO}++;
1550             return( $char, $char );
1551             }
1552              
1553             sub Run
1554             {
1555             my( $self, $filename ) = @_;
1556             open $self->{USER}{FILEIN}, $filename;
1557             my $result = $self->YYParse( yylex => \&_Lexer, yyerror => \&_Error );
1558             close $self->{USER}{FILEIN};
1559             return $result;
1560             }
1561              
1562             sub parse_string
1563             {
1564             my( $self, $string ) = @_;
1565             $self->YYData->{INPUT} = $string;
1566             $self->{USER}{LINENO} = 0;
1567             $self->{USER}{CHARNO} = 0;
1568             return $self->YYParse( yylex => \&_Lexer, yyerror => \&_Error );
1569             }
1570              
1571             sub modify
1572             {
1573             my $node = shift;
1574             my $code = shift;
1575              
1576             if( blessed $node && $node->can( 'modify' ) ) {
1577             return $node->modify( $code, @_ );
1578             } elsif( ref $node eq 'ARRAY' ) {
1579             return [ map { modify( $_, $code, @_ ) } @$node ];
1580             } else {
1581             return $code->( $node, @_ );
1582             }
1583             }
1584              
1585             1;
1586              
1587             1;