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   100487 use vars qw ( @ISA );
  5         18  
  5         235  
12 5     5   29 use strict;
  5         9  
  5         155  
13              
14             @ISA= qw ( Parse::Yapp::Driver );
15 5     5   2570 use Parse::Yapp::Driver;
  5         10975  
  5         1554  
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             'string' => 1,
47             "(" => 2,
48             'identifier' => 7,
49             'NOT' => 10,
50             'number' => 12
51             },
52             GOTOS => {
53             'constant' => 15,
54             'property_first_comparison' => 14,
55             'expression_phrase' => 13,
56             'openingbrace' => 11,
57             'expression_clause' => 9,
58             'constant_first_comparison' => 6,
59             'expression' => 8,
60             'filter' => 4,
61             'comparison' => 5,
62             'property' => 3
63             }
64             },
65             {#State 1
66             DEFAULT => -2
67             },
68             {#State 2
69             DEFAULT => -59
70             },
71             {#State 3
72             ACTIONS => {
73             ">" => 29,
74             'STARTS' => 16,
75             'HAS' => 32,
76             "=" => 17,
77             'LENGTH' => 18,
78             'CONTAINS' => 33,
79             'IS' => 20,
80             "." => 34,
81             'ENDS' => 23,
82             "<" => 38,
83             "!" => 26,
84             ":" => 25,
85             'LIKE' => 27
86             },
87             GOTOS => {
88             'length_op_rhs' => 24,
89             'property_zip_addon' => 35,
90             'dot' => 21,
91             'fuzzy_string_op_rhs' => 19,
92             'operator' => 36,
93             'value_op_rhs' => 37,
94             'set_zip_op_rhs' => 22,
95             'set_op_rhs' => 31,
96             'known_op_rhs' => 28,
97             'colon' => 30
98             }
99             },
100             {#State 4
101             ACTIONS => {
102             '' => 39
103             }
104             },
105             {#State 5
106             DEFAULT => -22
107             },
108             {#State 6
109             DEFAULT => -26
110             },
111             {#State 7
112             DEFAULT => -57
113             },
114             {#State 8
115             DEFAULT => -1
116             },
117             {#State 9
118             ACTIONS => {
119             'OR' => 40
120             },
121             DEFAULT => -18
122             },
123             {#State 10
124             ACTIONS => {
125             "(" => 2,
126             'string' => 1,
127             'identifier' => 7,
128             'number' => 12
129             },
130             GOTOS => {
131             'property_first_comparison' => 14,
132             'property' => 3,
133             'comparison' => 42,
134             'constant' => 15,
135             'constant_first_comparison' => 6,
136             'openingbrace' => 41
137             }
138             },
139             {#State 11
140             ACTIONS => {
141             'number' => 12,
142             'NOT' => 10,
143             'identifier' => 7,
144             "(" => 2,
145             'string' => 1
146             },
147             GOTOS => {
148             'property' => 3,
149             'comparison' => 5,
150             'constant_first_comparison' => 6,
151             'expression' => 43,
152             'expression_clause' => 9,
153             'openingbrace' => 11,
154             'expression_phrase' => 13,
155             'property_first_comparison' => 14,
156             'constant' => 15
157             }
158             },
159             {#State 12
160             DEFAULT => -3
161             },
162             {#State 13
163             ACTIONS => {
164             'AND' => 44
165             },
166             DEFAULT => -20
167             },
168             {#State 14
169             DEFAULT => -27
170             },
171             {#State 15
172             ACTIONS => {
173             "!" => 26,
174             "=" => 17,
175             "<" => 38,
176             ">" => 29
177             },
178             GOTOS => {
179             'operator' => 36,
180             'value_op_rhs' => 45
181             }
182             },
183             {#State 16
184             ACTIONS => {
185             'identifier' => 7,
186             'number' => 46,
187             'WITH' => 48,
188             'string' => 50
189             },
190             GOTOS => {
191             'value' => 49,
192             'property' => 47
193             }
194             },
195             {#State 17
196             DEFAULT => -68
197             },
198             {#State 18
199             ACTIONS => {
200             ">" => 29,
201             'number' => 46,
202             'identifier' => 7,
203             "!" => 26,
204             "=" => 17,
205             'string' => 50,
206             "<" => 38
207             },
208             GOTOS => {
209             'value' => 52,
210             'operator' => 51,
211             'property' => 47
212             }
213             },
214             {#State 19
215             DEFAULT => -31
216             },
217             {#State 20
218             ACTIONS => {
219             'UNKNOWN' => 54,
220             'KNOWN' => 53
221             }
222             },
223             {#State 21
224             ACTIONS => {
225             'identifier' => 55
226             }
227             },
228             {#State 22
229             DEFAULT => -33
230             },
231             {#State 23
232             ACTIONS => {
233             'identifier' => 7,
234             'number' => 46,
235             'WITH' => 56,
236             'string' => 50
237             },
238             GOTOS => {
239             'value' => 57,
240             'property' => 47
241             }
242             },
243             {#State 24
244             DEFAULT => -34
245             },
246             {#State 25
247             DEFAULT => -63
248             },
249             {#State 26
250             ACTIONS => {
251             "=" => 58
252             }
253             },
254             {#State 27
255             ACTIONS => {
256             'string' => 50,
257             'number' => 46,
258             'identifier' => 7
259             },
260             GOTOS => {
261             'value' => 59,
262             'property' => 47
263             }
264             },
265             {#State 28
266             DEFAULT => -30
267             },
268             {#State 29
269             ACTIONS => {
270             "=" => 60
271             },
272             DEFAULT => -66
273             },
274             {#State 30
275             ACTIONS => {
276             'identifier' => 7
277             },
278             GOTOS => {
279             'property' => 61
280             }
281             },
282             {#State 31
283             DEFAULT => -32
284             },
285             {#State 32
286             ACTIONS => {
287             "!" => 26,
288             "<" => 38,
289             'number' => 46,
290             'identifier' => 7,
291             'ANY' => 65,
292             'ALL' => 66,
293             "=" => 17,
294             'string' => 50,
295             ">" => 29,
296             'ONLY' => 62
297             },
298             GOTOS => {
299             'operator' => 63,
300             'value' => 64,
301             'property' => 47
302             }
303             },
304             {#State 33
305             ACTIONS => {
306             'string' => 50,
307             'number' => 46,
308             'identifier' => 7
309             },
310             GOTOS => {
311             'value' => 67,
312             'property' => 47
313             }
314             },
315             {#State 34
316             DEFAULT => -61
317             },
318             {#State 35
319             ACTIONS => {
320             'HAS' => 69,
321             ":" => 25
322             },
323             GOTOS => {
324             'colon' => 68
325             }
326             },
327             {#State 36
328             ACTIONS => {
329             'string' => 50,
330             'identifier' => 7,
331             'number' => 46
332             },
333             GOTOS => {
334             'value' => 70,
335             'property' => 47
336             }
337             },
338             {#State 37
339             DEFAULT => -29
340             },
341             {#State 38
342             ACTIONS => {
343             "=" => 71
344             },
345             DEFAULT => -64
346             },
347             {#State 39
348             DEFAULT => 0
349             },
350             {#State 40
351             ACTIONS => {
352             "(" => 2,
353             'string' => 1,
354             'number' => 12,
355             'NOT' => 10,
356             'identifier' => 7
357             },
358             GOTOS => {
359             'property_first_comparison' => 14,
360             'expression_phrase' => 13,
361             'constant' => 15,
362             'expression' => 72,
363             'constant_first_comparison' => 6,
364             'openingbrace' => 11,
365             'expression_clause' => 9,
366             'property' => 3,
367             'comparison' => 5
368             }
369             },
370             {#State 41
371             ACTIONS => {
372             "(" => 2,
373             'string' => 1,
374             'identifier' => 7,
375             'number' => 12,
376             'NOT' => 10
377             },
378             GOTOS => {
379             'openingbrace' => 11,
380             'expression_clause' => 9,
381             'expression' => 73,
382             'constant_first_comparison' => 6,
383             'constant' => 15,
384             'property_first_comparison' => 14,
385             'expression_phrase' => 13,
386             'comparison' => 5,
387             'property' => 3
388             }
389             },
390             {#State 42
391             DEFAULT => -24
392             },
393             {#State 43
394             ACTIONS => {
395             ")" => 75
396             },
397             GOTOS => {
398             'closingbrace' => 74
399             }
400             },
401             {#State 44
402             ACTIONS => {
403             'number' => 12,
404             'NOT' => 10,
405             'identifier' => 7,
406             "(" => 2,
407             'string' => 1
408             },
409             GOTOS => {
410             'property_first_comparison' => 14,
411             'expression_phrase' => 13,
412             'constant' => 15,
413             'constant_first_comparison' => 6,
414             'openingbrace' => 11,
415             'expression_clause' => 76,
416             'property' => 3,
417             'comparison' => 5
418             }
419             },
420             {#State 45
421             DEFAULT => -28
422             },
423             {#State 46
424             DEFAULT => -5
425             },
426             {#State 47
427             ACTIONS => {
428             "." => 34
429             },
430             DEFAULT => -6,
431             GOTOS => {
432             'dot' => 21
433             }
434             },
435             {#State 48
436             ACTIONS => {
437             'identifier' => 7,
438             'number' => 46,
439             'string' => 50
440             },
441             GOTOS => {
442             'value' => 77,
443             'property' => 47
444             }
445             },
446             {#State 49
447             DEFAULT => -39
448             },
449             {#State 50
450             DEFAULT => -4
451             },
452             {#State 51
453             ACTIONS => {
454             'number' => 46,
455             'identifier' => 7,
456             'string' => 50
457             },
458             GOTOS => {
459             'property' => 47,
460             'value' => 78
461             }
462             },
463             {#State 52
464             DEFAULT => -55
465             },
466             {#State 53
467             DEFAULT => -36
468             },
469             {#State 54
470             DEFAULT => -37
471             },
472             {#State 55
473             DEFAULT => -58
474             },
475             {#State 56
476             ACTIONS => {
477             'string' => 50,
478             'identifier' => 7,
479             'number' => 46
480             },
481             GOTOS => {
482             'property' => 47,
483             'value' => 79
484             }
485             },
486             {#State 57
487             DEFAULT => -41
488             },
489             {#State 58
490             DEFAULT => -69
491             },
492             {#State 59
493             DEFAULT => -43
494             },
495             {#State 60
496             DEFAULT => -67
497             },
498             {#State 61
499             ACTIONS => {
500             "." => 34
501             },
502             DEFAULT => -53,
503             GOTOS => {
504             'dot' => 21
505             }
506             },
507             {#State 62
508             ACTIONS => {
509             'identifier' => 7,
510             ">" => 29,
511             'number' => 46,
512             'string' => 50,
513             "<" => 38,
514             "!" => 26,
515             "=" => 17
516             },
517             GOTOS => {
518             'property' => 47,
519             'value_list' => 80,
520             'operator' => 81,
521             'value' => 82
522             }
523             },
524             {#State 63
525             ACTIONS => {
526             'identifier' => 7,
527             'number' => 46,
528             'string' => 50
529             },
530             GOTOS => {
531             'value' => 83,
532             'property' => 47
533             }
534             },
535             {#State 64
536             DEFAULT => -44
537             },
538             {#State 65
539             ACTIONS => {
540             "<" => 38,
541             'string' => 50,
542             "=" => 17,
543             "!" => 26,
544             'identifier' => 7,
545             'number' => 46,
546             ">" => 29
547             },
548             GOTOS => {
549             'property' => 47,
550             'value_list' => 84,
551             'operator' => 81,
552             'value' => 82
553             }
554             },
555             {#State 66
556             ACTIONS => {
557             ">" => 29,
558             'number' => 46,
559             'identifier' => 7,
560             "!" => 26,
561             "=" => 17,
562             'string' => 50,
563             "<" => 38
564             },
565             GOTOS => {
566             'operator' => 81,
567             'value' => 82,
568             'value_list' => 85,
569             'property' => 47
570             }
571             },
572             {#State 67
573             DEFAULT => -38
574             },
575             {#State 68
576             ACTIONS => {
577             'identifier' => 7
578             },
579             GOTOS => {
580             'property' => 86
581             }
582             },
583             {#State 69
584             ACTIONS => {
585             "!" => 26,
586             "<" => 38,
587             'number' => 46,
588             'ANY' => 88,
589             'identifier' => 7,
590             "=" => 17,
591             'ALL' => 87,
592             'string' => 50,
593             ">" => 29,
594             'ONLY' => 92
595             },
596             GOTOS => {
597             'value_zip' => 91,
598             'property' => 47,
599             'value' => 90,
600             'operator' => 89
601             }
602             },
603             {#State 70
604             DEFAULT => -35
605             },
606             {#State 71
607             DEFAULT => -65
608             },
609             {#State 72
610             DEFAULT => -19
611             },
612             {#State 73
613             ACTIONS => {
614             ")" => 75
615             },
616             GOTOS => {
617             'closingbrace' => 93
618             }
619             },
620             {#State 74
621             DEFAULT => -23
622             },
623             {#State 75
624             DEFAULT => -60
625             },
626             {#State 76
627             DEFAULT => -21
628             },
629             {#State 77
630             DEFAULT => -40
631             },
632             {#State 78
633             DEFAULT => -56
634             },
635             {#State 79
636             DEFAULT => -42
637             },
638             {#State 80
639             ACTIONS => {
640             "," => 95
641             },
642             DEFAULT => -48,
643             GOTOS => {
644             'comma' => 94
645             }
646             },
647             {#State 81
648             ACTIONS => {
649             'identifier' => 7,
650             'number' => 46,
651             'string' => 50
652             },
653             GOTOS => {
654             'property' => 47,
655             'value' => 96
656             }
657             },
658             {#State 82
659             DEFAULT => -7
660             },
661             {#State 83
662             DEFAULT => -45
663             },
664             {#State 84
665             ACTIONS => {
666             "," => 95
667             },
668             DEFAULT => -47,
669             GOTOS => {
670             'comma' => 94
671             }
672             },
673             {#State 85
674             ACTIONS => {
675             "," => 95
676             },
677             DEFAULT => -46,
678             GOTOS => {
679             'comma' => 94
680             }
681             },
682             {#State 86
683             ACTIONS => {
684             "." => 34
685             },
686             DEFAULT => -54,
687             GOTOS => {
688             'dot' => 21
689             }
690             },
691             {#State 87
692             ACTIONS => {
693             'string' => 50,
694             "<" => 38,
695             "!" => 26,
696             "=" => 17,
697             'identifier' => 7,
698             ">" => 29,
699             'number' => 46
700             },
701             GOTOS => {
702             'value_zip' => 98,
703             'property' => 47,
704             'value' => 90,
705             'operator' => 89,
706             'value_zip_list' => 97
707             }
708             },
709             {#State 88
710             ACTIONS => {
711             "!" => 26,
712             "=" => 17,
713             'string' => 50,
714             "<" => 38,
715             ">" => 29,
716             'number' => 46,
717             'identifier' => 7
718             },
719             GOTOS => {
720             'value_zip' => 98,
721             'property' => 47,
722             'operator' => 89,
723             'value' => 90,
724             'value_zip_list' => 99
725             }
726             },
727             {#State 89
728             ACTIONS => {
729             'string' => 50,
730             'identifier' => 7,
731             'number' => 46
732             },
733             GOTOS => {
734             'property' => 47,
735             'value' => 100
736             }
737             },
738             {#State 90
739             ACTIONS => {
740             ":" => 25
741             },
742             GOTOS => {
743             'colon' => 102,
744             'value_zip_part' => 101
745             }
746             },
747             {#State 91
748             ACTIONS => {
749             ":" => 25
750             },
751             DEFAULT => -49,
752             GOTOS => {
753             'value_zip_part' => 103,
754             'colon' => 102
755             }
756             },
757             {#State 92
758             ACTIONS => {
759             'number' => 46,
760             ">" => 29,
761             'identifier' => 7,
762             "=" => 17,
763             "!" => 26,
764             "<" => 38,
765             'string' => 50
766             },
767             GOTOS => {
768             'value' => 90,
769             'operator' => 89,
770             'value_zip_list' => 104,
771             'value_zip' => 98,
772             'property' => 47
773             }
774             },
775             {#State 93
776             DEFAULT => -25
777             },
778             {#State 94
779             ACTIONS => {
780             'number' => 46,
781             ">" => 29,
782             'identifier' => 7,
783             "=" => 17,
784             "!" => 26,
785             "<" => 38,
786             'string' => 50
787             },
788             GOTOS => {
789             'property' => 47,
790             'value' => 105,
791             'operator' => 106
792             }
793             },
794             {#State 95
795             DEFAULT => -62
796             },
797             {#State 96
798             DEFAULT => -8
799             },
800             {#State 97
801             ACTIONS => {
802             "," => 95
803             },
804             DEFAULT => -51,
805             GOTOS => {
806             'comma' => 107
807             }
808             },
809             {#State 98
810             ACTIONS => {
811             ":" => 25
812             },
813             DEFAULT => -16,
814             GOTOS => {
815             'value_zip_part' => 103,
816             'colon' => 102
817             }
818             },
819             {#State 99
820             ACTIONS => {
821             "," => 95
822             },
823             DEFAULT => -52,
824             GOTOS => {
825             'comma' => 107
826             }
827             },
828             {#State 100
829             ACTIONS => {
830             ":" => 25
831             },
832             GOTOS => {
833             'colon' => 102,
834             'value_zip_part' => 108
835             }
836             },
837             {#State 101
838             DEFAULT => -11
839             },
840             {#State 102
841             ACTIONS => {
842             "<" => 38,
843             'string' => 50,
844             "=" => 17,
845             "!" => 26,
846             'identifier' => 7,
847             'number' => 46,
848             ">" => 29
849             },
850             GOTOS => {
851             'operator' => 110,
852             'value' => 109,
853             'property' => 47
854             }
855             },
856             {#State 103
857             DEFAULT => -13
858             },
859             {#State 104
860             ACTIONS => {
861             "," => 95
862             },
863             DEFAULT => -50,
864             GOTOS => {
865             'comma' => 107
866             }
867             },
868             {#State 105
869             DEFAULT => -9
870             },
871             {#State 106
872             ACTIONS => {
873             'number' => 46,
874             'identifier' => 7,
875             'string' => 50
876             },
877             GOTOS => {
878             'value' => 111,
879             'property' => 47
880             }
881             },
882             {#State 107
883             ACTIONS => {
884             ">" => 29,
885             'number' => 46,
886             'identifier' => 7,
887             "!" => 26,
888             "=" => 17,
889             'string' => 50,
890             "<" => 38
891             },
892             GOTOS => {
893             'operator' => 89,
894             'value' => 90,
895             'value_zip' => 112,
896             'property' => 47
897             }
898             },
899             {#State 108
900             DEFAULT => -12
901             },
902             {#State 109
903             DEFAULT => -14
904             },
905             {#State 110
906             ACTIONS => {
907             'string' => 50,
908             'number' => 46,
909             'identifier' => 7
910             },
911             GOTOS => {
912             'property' => 47,
913             'value' => 113
914             }
915             },
916             {#State 111
917             DEFAULT => -10
918             },
919             {#State 112
920             ACTIONS => {
921             ":" => 25
922             },
923             DEFAULT => -17,
924             GOTOS => {
925             'value_zip_part' => 103,
926             'colon' => 102
927             }
928             },
929             {#State 113
930             DEFAULT => -15
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;