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