File Coverage

blib/lib/GraphQL/Language/Grammar.pm
Criterion Covered Total %
statement 15 15 100.0
branch n/a
condition n/a
subroutine 6 6 100.0
pod 1 1 100.0
total 22 22 100.0


line stmt bran cond sub pod time code
1              
2             use 5.014;
3 21     21   487 use strict;
  21         75  
4 21     21   110 use warnings;
  21         46  
  21         412  
5 21     21   98 use base 'Pegex::Grammar';
  21         62  
  21         585  
6 21     21   105 use constant file => './graphql.pgx';
  21         54  
  21         8214  
7 21     21   49164  
  21         68  
  21         97072  
8             our $VERSION = '0.02';
9              
10             =head1 NAME
11              
12             GraphQL::Language::Grammar - GraphQL grammar
13              
14             =head1 SYNOPSIS
15              
16             use Pegex::Parser;
17             use GraphQL::Language::Grammar;
18             use Pegex::Tree::Wrap;
19             use Pegex::Input;
20              
21             my $parser = Pegex::Parser->new(
22             grammar => GraphQL::Language::Grammar->new,
23             receiver => Pegex::Tree::Wrap->new,
24             );
25             my $text = 'query q { foo(name: "hi") { id } }';
26             my $input = Pegex::Input->new(string => $text);
27             my $got = $parser->parse($input);
28              
29             =head1 DESCRIPTION
30              
31             This is a subclass of L<Pegex::Grammar>, with the GraphQL grammar.
32              
33             =head1 METHODS
34              
35             =head2 make_tree
36              
37             Override method from L<Pegex::Grammar>.
38              
39             =cut
40              
41             {
42             '+grammar' => 'graphql',
43             '+include' => 'pegex-atoms',
44 19     19 1 11215 '+toprule' => 'graphql',
45             '+version' => '0.01',
46             'LSQUARE' => {
47             '.rgx' => qr/\G\[/
48             },
49             'RSQUARE' => {
50             '.rgx' => qr/\G\]/
51             },
52             '_' => {
53             '.rgx' => qr/\G(?:\s|\x{FEFF}|,|[\ \t]*\#[\ \t]*[^\r\n]*(?:\r?\n|\r!NL|\z))*/
54             },
55             'alias' => {
56             '.all' => [
57             {
58             '.ref' => 'name'
59             },
60             {
61             '-skip' => 1,
62             '.rgx' => qr/\G(?:\s|\x{FEFF}|,|[\ \t]*\#[\ \t]*[^\r\n]*(?:\r?\n|\r!NL|\z))*:(?:\s|\x{FEFF}|,|[\ \t]*\#[\ \t]*[^\r\n]*(?:\r?\n|\r!NL|\z))*/
63             }
64             ]
65             },
66             'argument' => {
67             '.all' => [
68             {
69             '.ref' => 'name'
70             },
71             {
72             '-skip' => 1,
73             '.rgx' => qr/\G(?:\s|\x{FEFF}|,|[\ \t]*\#[\ \t]*[^\r\n]*(?:\r?\n|\r!NL|\z))*:(?:\s|\x{FEFF}|,|[\ \t]*\#[\ \t]*[^\r\n]*(?:\r?\n|\r!NL|\z))*/
74             },
75             {
76             '.ref' => 'value'
77             }
78             ]
79             },
80             'arguments' => {
81             '.all' => [
82             {
83             '-skip' => 1,
84             '.rgx' => qr/\G(?:\s|\x{FEFF}|,|[\ \t]*\#[\ \t]*[^\r\n]*(?:\r?\n|\r!NL|\z))*\((?:\s|\x{FEFF}|,|[\ \t]*\#[\ \t]*[^\r\n]*(?:\r?\n|\r!NL|\z))*/
85             },
86             {
87             '+min' => 1,
88             '.ref' => 'argument'
89             },
90             {
91             '-skip' => 1,
92             '.rgx' => qr/\G(?:\s|\x{FEFF}|,|[\ \t]*\#[\ \t]*[^\r\n]*(?:\r?\n|\r!NL|\z))*\)(?:\s|\x{FEFF}|,|[\ \t]*\#[\ \t]*[^\r\n]*(?:\r?\n|\r!NL|\z))*/
93             }
94             ]
95             },
96             'argumentsDefinition' => {
97             '.all' => [
98             {
99             '-skip' => 1,
100             '.rgx' => qr/\G(?:\s|\x{FEFF}|,|[\ \t]*\#[\ \t]*[^\r\n]*(?:\r?\n|\r!NL|\z))*\(/
101             },
102             {
103             '+min' => 1,
104             '.ref' => 'inputValueDefinition'
105             },
106             {
107             '-skip' => 1,
108             '.rgx' => qr/\G(?:\s|\x{FEFF}|,|[\ \t]*\#[\ \t]*[^\r\n]*(?:\r?\n|\r!NL|\z))*\)/
109             }
110             ]
111             },
112             'blockStringValue' => {
113             '.rgx' => qr/\G"""((?:(?:\\""")|[^\x00-\x1f"]|[\t\n\r]|(?:"(?!"")))*)"""/
114             },
115             'boolean' => {
116             '.rgx' => qr/\G(true|false)/
117             },
118             'defaultValue' => {
119             '.all' => [
120             {
121             '-skip' => 1,
122             '.rgx' => qr/\G(?:\s|\x{FEFF}|,|[\ \t]*\#[\ \t]*[^\r\n]*(?:\r?\n|\r!NL|\z))*=(?:\s|\x{FEFF}|,|[\ \t]*\#[\ \t]*[^\r\n]*(?:\r?\n|\r!NL|\z))*/
123             },
124             {
125             '.ref' => 'value_const'
126             }
127             ]
128             },
129             'definition' => {
130             '.any' => [
131             {
132             '.ref' => 'operationDefinition'
133             },
134             {
135             '.ref' => 'fragment'
136             },
137             {
138             '.ref' => 'typeSystemDefinition'
139             },
140             {
141             '-skip' => 1,
142             '.ref' => 'ws2'
143             }
144             ]
145             },
146             'description' => {
147             '.any' => [
148             {
149             '.all' => [
150             {
151             '-skip' => 1,
152             '.rgx' => qr/\G[\s\n]*/
153             },
154             {
155             '.ref' => 'string'
156             },
157             {
158             '-skip' => 1,
159             '.rgx' => qr/\G[\s\n]*/
160             }
161             ]
162             },
163             {
164             '-skip' => 1,
165             '.ref' => '_'
166             }
167             ]
168             },
169             'directive' => {
170             '.all' => [
171             {
172             '-skip' => 1,
173             '.rgx' => qr/\Gdirective(?:\s|\x{FEFF}|,|[\ \t]*\#[\ \t]*[^\r\n]*(?:\r?\n|\r!NL|\z))*\@(?:\s|\x{FEFF}|,|[\ \t]*\#[\ \t]*[^\r\n]*(?:\r?\n|\r!NL|\z))*/
174             },
175             {
176             '.ref' => 'name'
177             },
178             {
179             '-skip' => 1,
180             '.ref' => '_'
181             },
182             {
183             '+max' => 1,
184             '.ref' => 'argumentsDefinition'
185             },
186             {
187             '-skip' => 1,
188             '.rgx' => qr/\G(?:\s|\x{FEFF}|,|[\ \t]*\#[\ \t]*[^\r\n]*(?:\r?\n|\r!NL|\z))*on(?:\s|\x{FEFF}|,|[\ \t]*\#[\ \t]*[^\r\n]*(?:\r?\n|\r!NL|\z))*/
189             },
190             {
191             '.ref' => 'directiveLocations'
192             }
193             ]
194             },
195             'directiveLocations' => {
196             '.all' => [
197             {
198             '+max' => 1,
199             '-skip' => 1,
200             '.rgx' => qr/\G(?:\s|\x{FEFF}|,|[\ \t]*\#[\ \t]*[^\r\n]*(?:\r?\n|\r!NL|\z))*\|(?:\s|\x{FEFF}|,|[\ \t]*\#[\ \t]*[^\r\n]*(?:\r?\n|\r!NL|\z))*/
201             },
202             {
203             '.all' => [
204             {
205             '.ref' => 'name'
206             },
207             {
208             '+min' => 0,
209             '-flat' => 1,
210             '.all' => [
211             {
212             '-skip' => 1,
213             '.rgx' => qr/\G(?:\s|\x{FEFF}|,|[\ \t]*\#[\ \t]*[^\r\n]*(?:\r?\n|\r!NL|\z))*\|(?:\s|\x{FEFF}|,|[\ \t]*\#[\ \t]*[^\r\n]*(?:\r?\n|\r!NL|\z))*/
214             },
215             {
216             '.ref' => 'name'
217             }
218             ]
219             }
220             ]
221             }
222             ]
223             },
224             'directiveactual' => {
225             '.all' => [
226             {
227             '-skip' => 1,
228             '.rgx' => qr/\G(?:\s|\x{FEFF}|,|[\ \t]*\#[\ \t]*[^\r\n]*(?:\r?\n|\r!NL|\z))*\@/
229             },
230             {
231             '.ref' => 'name'
232             },
233             {
234             '+max' => 1,
235             '.ref' => 'arguments'
236             }
237             ]
238             },
239             'directives' => {
240             '+min' => 1,
241             '.ref' => 'directiveactual'
242             },
243             'enumTypeDefinition' => {
244             '.all' => [
245             {
246             '-skip' => 1,
247             '.rgx' => qr/\Genum(?:\s|\x{FEFF}|,|[\ \t]*\#[\ \t]*[^\r\n]*(?:\r?\n|\r!NL|\z))*/
248             },
249             {
250             '.ref' => 'name'
251             },
252             {
253             '-skip' => 1,
254             '.ref' => '_'
255             },
256             {
257             '+max' => 1,
258             '.ref' => 'directives'
259             },
260             {
261             '+max' => 1,
262             '.all' => [
263             {
264             '-skip' => 1,
265             '.rgx' => qr/\G(?:\s|\x{FEFF}|,|[\ \t]*\#[\ \t]*[^\r\n]*(?:\r?\n|\r!NL|\z))*\{/
266             },
267             {
268             '+min' => 1,
269             '.ref' => 'enumValueDefinition'
270             },
271             {
272             '-skip' => 1,
273             '.rgx' => qr/\G(?:\s|\x{FEFF}|,|[\ \t]*\#[\ \t]*[^\r\n]*(?:\r?\n|\r!NL|\z))*\}/
274             }
275             ]
276             }
277             ]
278             },
279             'enumValue' => {
280             '.any' => [
281             {
282             '.all' => [
283             {
284             '.rgx' => qr/\G(true|false|null)/
285             },
286             {
287             '.err' => 'Invalid enum value'
288             }
289             ]
290             },
291             {
292             '.ref' => 'name'
293             }
294             ]
295             },
296             'enumValueDefinition' => {
297             '.all' => [
298             {
299             '+max' => 1,
300             '.ref' => 'description'
301             },
302             {
303             '.ref' => 'enumValue'
304             },
305             {
306             '+max' => 1,
307             '.all' => [
308             {
309             '-skip' => 1,
310             '.ref' => '_'
311             },
312             {
313             '.ref' => 'directives'
314             }
315             ]
316             }
317             ]
318             },
319             'field' => {
320             '.all' => [
321             {
322             '+max' => 1,
323             '.ref' => 'alias'
324             },
325             {
326             '.ref' => 'name'
327             },
328             {
329             '-skip' => 1,
330             '.ref' => '_'
331             },
332             {
333             '+max' => 1,
334             '.ref' => 'arguments'
335             },
336             {
337             '-skip' => 1,
338             '.ref' => '_'
339             },
340             {
341             '+max' => 1,
342             '.ref' => 'directives'
343             },
344             {
345             '+max' => 1,
346             '.ref' => 'selectionSet'
347             }
348             ]
349             },
350             'fieldDefinition' => {
351             '.all' => [
352             {
353             '+max' => 1,
354             '.ref' => 'description'
355             },
356             {
357             '.ref' => 'name'
358             },
359             {
360             '-skip' => 1,
361             '.ref' => '_'
362             },
363             {
364             '+max' => 1,
365             '.ref' => 'argumentsDefinition'
366             },
367             {
368             '-skip' => 1,
369             '.rgx' => qr/\G(?:\s|\x{FEFF}|,|[\ \t]*\#[\ \t]*[^\r\n]*(?:\r?\n|\r!NL|\z))*:(?:\s|\x{FEFF}|,|[\ \t]*\#[\ \t]*[^\r\n]*(?:\r?\n|\r!NL|\z))*/
370             },
371             {
372             '.ref' => 'typedef'
373             },
374             {
375             '-skip' => 1,
376             '.ref' => '_'
377             },
378             {
379             '+max' => 1,
380             '.ref' => 'directives'
381             }
382             ]
383             },
384             'float' => {
385             '.rgx' => qr/\G(\-?(?:0|[1-9][0-9]*)(?:(?:\.[0-9]+)(?:[eE][\-\+]?[0-9]+)|(?:\.[0-9]+)|(?:[eE][\-\+]?[0-9]+)))/
386             },
387             'fragment' => {
388             '.all' => [
389             {
390             '-skip' => 1,
391             '.rgx' => qr/\G(?:\s|\x{FEFF}|,|[\ \t]*\#[\ \t]*[^\r\n]*(?:\r?\n|\r!NL|\z))*fragment(?:\s|\x{FEFF}|,|[\ \t]*\#[\ \t]*[^\r\n]*(?:\r?\n|\r!NL|\z))*/
392             },
393             {
394             '.ref' => 'fragmentName'
395             },
396             {
397             '-skip' => 1,
398             '.ref' => '_'
399             },
400             {
401             '.any' => [
402             {
403             '.ref' => 'typeCondition'
404             },
405             {
406             '.err' => 'Expected "on"'
407             }
408             ]
409             },
410             {
411             '-skip' => 1,
412             '.ref' => '_'
413             },
414             {
415             '+max' => 1,
416             '.ref' => 'directives'
417             },
418             {
419             '.ref' => 'selectionSet'
420             }
421             ]
422             },
423             'fragmentName' => {
424             '.any' => [
425             {
426             '.all' => [
427             {
428             '.rgx' => qr/\Gon/
429             },
430             {
431             '.err' => 'Unexpected Name "on"'
432             }
433             ]
434             },
435             {
436             '.ref' => 'name'
437             }
438             ]
439             },
440             'fragment_spread' => {
441             '.all' => [
442             {
443             '-skip' => 1,
444             '.ref' => 'spread'
445             },
446             {
447             '.ref' => 'fragmentName'
448             },
449             {
450             '-skip' => 1,
451             '.ref' => '_'
452             },
453             {
454             '+max' => 1,
455             '.ref' => 'directives'
456             }
457             ]
458             },
459             'graphql' => {
460             '+min' => 1,
461             '.ref' => 'definition'
462             },
463             'implementsInterfaces' => {
464             '.all' => [
465             {
466             '-skip' => 1,
467             '.rgx' => qr/\Gimplements(?:\s|\x{FEFF}|,|[\ \t]*\#[\ \t]*[^\r\n]*(?:\r?\n|\r!NL|\z))*/
468             },
469             {
470             '+max' => 1,
471             '-skip' => 1,
472             '.rgx' => qr/\G(?:\s|\x{FEFF}|,|[\ \t]*\#[\ \t]*[^\r\n]*(?:\r?\n|\r!NL|\z))*&(?:\s|\x{FEFF}|,|[\ \t]*\#[\ \t]*[^\r\n]*(?:\r?\n|\r!NL|\z))*/
473             },
474             {
475             '.all' => [
476             {
477             '.ref' => 'namedType'
478             },
479             {
480             '+min' => 0,
481             '-flat' => 1,
482             '.all' => [
483             {
484             '-skip' => 1,
485             '.rgx' => qr/\G(?:\s|\x{FEFF}|,|[\ \t]*\#[\ \t]*[^\r\n]*(?:\r?\n|\r!NL|\z))*&(?:\s|\x{FEFF}|,|[\ \t]*\#[\ \t]*[^\r\n]*(?:\r?\n|\r!NL|\z))*/
486             },
487             {
488             '.ref' => 'namedType'
489             }
490             ]
491             }
492             ]
493             }
494             ]
495             },
496             'inline_fragment' => {
497             '.all' => [
498             {
499             '-skip' => 1,
500             '.ref' => 'spread'
501             },
502             {
503             '+max' => 1,
504             '.ref' => 'typeCondition'
505             },
506             {
507             '-skip' => 1,
508             '.ref' => '_'
509             },
510             {
511             '+max' => 1,
512             '.ref' => 'directives'
513             },
514             {
515             '.ref' => 'selectionSet'
516             }
517             ]
518             },
519             'input' => {
520             '.all' => [
521             {
522             '-skip' => 1,
523             '.rgx' => qr/\Ginput(?:\s|\x{FEFF}|,|[\ \t]*\#[\ \t]*[^\r\n]*(?:\r?\n|\r!NL|\z))*/
524             },
525             {
526             '.ref' => 'name'
527             },
528             {
529             '-skip' => 1,
530             '.ref' => '_'
531             },
532             {
533             '+max' => 1,
534             '.ref' => 'directives'
535             },
536             {
537             '+max' => 1,
538             '.all' => [
539             {
540             '-skip' => 1,
541             '.rgx' => qr/\G(?:\s|\x{FEFF}|,|[\ \t]*\#[\ \t]*[^\r\n]*(?:\r?\n|\r!NL|\z))*\{/
542             },
543             {
544             '+min' => 1,
545             '.ref' => 'inputValueDefinition'
546             },
547             {
548             '-skip' => 1,
549             '.rgx' => qr/\G(?:\s|\x{FEFF}|,|[\ \t]*\#[\ \t]*[^\r\n]*(?:\r?\n|\r!NL|\z))*\}/
550             }
551             ]
552             }
553             ]
554             },
555             'inputValueDefinition' => {
556             '.all' => [
557             {
558             '+max' => 1,
559             '.ref' => 'description'
560             },
561             {
562             '.ref' => 'name'
563             },
564             {
565             '-skip' => 1,
566             '.rgx' => qr/\G(?:\s|\x{FEFF}|,|[\ \t]*\#[\ \t]*[^\r\n]*(?:\r?\n|\r!NL|\z))*:(?:\s|\x{FEFF}|,|[\ \t]*\#[\ \t]*[^\r\n]*(?:\r?\n|\r!NL|\z))*/
567             },
568             {
569             '.ref' => 'typedef'
570             },
571             {
572             '-skip' => 1,
573             '.ref' => '_'
574             },
575             {
576             '+max' => 1,
577             '.ref' => 'defaultValue'
578             },
579             {
580             '-skip' => 1,
581             '.ref' => '_'
582             },
583             {
584             '+max' => 1,
585             '.ref' => 'directives'
586             },
587             {
588             '-skip' => 1,
589             '.ref' => '_'
590             }
591             ]
592             },
593             'int' => {
594             '.rgx' => qr/\G(\-?(?:0|[1-9][0-9]*))/
595             },
596             'interface' => {
597             '.all' => [
598             {
599             '-skip' => 1,
600             '.rgx' => qr/\Ginterface(?:\s|\x{FEFF}|,|[\ \t]*\#[\ \t]*[^\r\n]*(?:\r?\n|\r!NL|\z))*/
601             },
602             {
603             '.ref' => 'name'
604             },
605             {
606             '-skip' => 1,
607             '.ref' => '_'
608             },
609             {
610             '+max' => 1,
611             '.ref' => 'directives'
612             },
613             {
614             '+max' => 1,
615             '.all' => [
616             {
617             '-skip' => 1,
618             '.rgx' => qr/\G(?:\s|\x{FEFF}|,|[\ \t]*\#[\ \t]*[^\r\n]*(?:\r?\n|\r!NL|\z))*\{/
619             },
620             {
621             '+min' => 1,
622             '.ref' => 'fieldDefinition'
623             },
624             {
625             '-skip' => 1,
626             '.rgx' => qr/\G(?:\s|\x{FEFF}|,|[\ \t]*\#[\ \t]*[^\r\n]*(?:\r?\n|\r!NL|\z))*\}/
627             }
628             ]
629             }
630             ]
631             },
632             'listType' => {
633             '.all' => [
634             {
635             '.ref' => 'LSQUARE'
636             },
637             {
638             '.ref' => 'typedef'
639             },
640             {
641             '.ref' => 'RSQUARE'
642             }
643             ]
644             },
645             'listValue' => {
646             '.all' => [
647             {
648             '-skip' => 1,
649             '.rgx' => qr/\G(?:\s|\x{FEFF}|,|[\ \t]*\#[\ \t]*[^\r\n]*(?:\r?\n|\r!NL|\z))*\[(?:\s|\x{FEFF}|,|[\ \t]*\#[\ \t]*[^\r\n]*(?:\r?\n|\r!NL|\z))*/
650             },
651             {
652             '+min' => 0,
653             '.ref' => 'value'
654             },
655             {
656             '-skip' => 1,
657             '.rgx' => qr/\G(?:\s|\x{FEFF}|,|[\ \t]*\#[\ \t]*[^\r\n]*(?:\r?\n|\r!NL|\z))*\](?:\s|\x{FEFF}|,|[\ \t]*\#[\ \t]*[^\r\n]*(?:\r?\n|\r!NL|\z))*/
658             }
659             ]
660             },
661             'listValue_const' => {
662             '.all' => [
663             {
664             '-skip' => 1,
665             '.rgx' => qr/\G(?:\s|\x{FEFF}|,|[\ \t]*\#[\ \t]*[^\r\n]*(?:\r?\n|\r!NL|\z))*\[(?:\s|\x{FEFF}|,|[\ \t]*\#[\ \t]*[^\r\n]*(?:\r?\n|\r!NL|\z))*/
666             },
667             {
668             '+min' => 0,
669             '.ref' => 'value_const'
670             },
671             {
672             '-skip' => 1,
673             '.rgx' => qr/\G(?:\s|\x{FEFF}|,|[\ \t]*\#[\ \t]*[^\r\n]*(?:\r?\n|\r!NL|\z))*\](?:\s|\x{FEFF}|,|[\ \t]*\#[\ \t]*[^\r\n]*(?:\r?\n|\r!NL|\z))*/
674             }
675             ]
676             },
677             'name' => {
678             '.rgx' => qr/\G([_a-zA-Z][0-9A-Za-z_]*)/
679             },
680             'namedType' => {
681             '.all' => [
682             {
683             '.ref' => 'name'
684             },
685             {
686             '-skip' => 1,
687             '.ref' => '_'
688             }
689             ]
690             },
691             'nonNullType' => {
692             '.any' => [
693             {
694             '.all' => [
695             {
696             '.ref' => 'namedType'
697             },
698             {
699             '.rgx' => qr/\G(?:\s|\x{FEFF}|,|[\ \t]*\#[\ \t]*[^\r\n]*(?:\r?\n|\r!NL|\z))*!/
700             }
701             ]
702             },
703             {
704             '.all' => [
705             {
706             '.ref' => 'listType'
707             },
708             {
709             '.rgx' => qr/\G(?:\s|\x{FEFF}|,|[\ \t]*\#[\ \t]*[^\r\n]*(?:\r?\n|\r!NL|\z))*!/
710             }
711             ]
712             }
713             ]
714             },
715             'null' => {
716             '.rgx' => qr/\G(null)/
717             },
718             'objectField' => {
719             '.all' => [
720             {
721             '.ref' => 'name'
722             },
723             {
724             '-skip' => 1,
725             '.rgx' => qr/\G(?:\s|\x{FEFF}|,|[\ \t]*\#[\ \t]*[^\r\n]*(?:\r?\n|\r!NL|\z))*:(?:\s|\x{FEFF}|,|[\ \t]*\#[\ \t]*[^\r\n]*(?:\r?\n|\r!NL|\z))*/
726             },
727             {
728             '.ref' => 'value'
729             },
730             {
731             '-skip' => 1,
732             '.ref' => '_'
733             }
734             ]
735             },
736             'objectField_const' => {
737             '.all' => [
738             {
739             '.ref' => 'name'
740             },
741             {
742             '-skip' => 1,
743             '.rgx' => qr/\G(?:\s|\x{FEFF}|,|[\ \t]*\#[\ \t]*[^\r\n]*(?:\r?\n|\r!NL|\z))*:(?:\s|\x{FEFF}|,|[\ \t]*\#[\ \t]*[^\r\n]*(?:\r?\n|\r!NL|\z))*/
744             },
745             {
746             '.ref' => 'value_const'
747             }
748             ]
749             },
750             'objectValue' => {
751             '.all' => [
752             {
753             '-skip' => 1,
754             '.rgx' => qr/\G(?:\s|\x{FEFF}|,|[\ \t]*\#[\ \t]*[^\r\n]*(?:\r?\n|\r!NL|\z))*\{(?:\s|\x{FEFF}|,|[\ \t]*\#[\ \t]*[^\r\n]*(?:\r?\n|\r!NL|\z))*/
755             },
756             {
757             '.any' => [
758             {
759             '+min' => 1,
760             '.ref' => 'objectField'
761             },
762             {
763             '.err' => 'Expected name'
764             }
765             ]
766             },
767             {
768             '-skip' => 1,
769             '.rgx' => qr/\G(?:\s|\x{FEFF}|,|[\ \t]*\#[\ \t]*[^\r\n]*(?:\r?\n|\r!NL|\z))*\}(?:\s|\x{FEFF}|,|[\ \t]*\#[\ \t]*[^\r\n]*(?:\r?\n|\r!NL|\z))*/
770             }
771             ]
772             },
773             'objectValue_const' => {
774             '.all' => [
775             {
776             '-skip' => 1,
777             '.rgx' => qr/\G(?:\s|\x{FEFF}|,|[\ \t]*\#[\ \t]*[^\r\n]*(?:\r?\n|\r!NL|\z))*\{(?:\s|\x{FEFF}|,|[\ \t]*\#[\ \t]*[^\r\n]*(?:\r?\n|\r!NL|\z))*/
778             },
779             {
780             '.any' => [
781             {
782             '+min' => 1,
783             '.ref' => 'objectField_const'
784             },
785             {
786             '.err' => 'Expected name or constant'
787             }
788             ]
789             },
790             {
791             '-skip' => 1,
792             '.rgx' => qr/\G(?:\s|\x{FEFF}|,|[\ \t]*\#[\ \t]*[^\r\n]*(?:\r?\n|\r!NL|\z))*\}(?:\s|\x{FEFF}|,|[\ \t]*\#[\ \t]*[^\r\n]*(?:\r?\n|\r!NL|\z))*/
793             }
794             ]
795             },
796             'operationDefinition' => {
797             '.any' => [
798             {
799             '.ref' => 'selectionSet'
800             },
801             {
802             '.all' => [
803             {
804             '.ref' => 'operationType'
805             },
806             {
807             '-skip' => 1,
808             '.ref' => '_'
809             },
810             {
811             '+max' => 1,
812             '.ref' => 'name'
813             },
814             {
815             '-skip' => 1,
816             '.ref' => '_'
817             },
818             {
819             '+max' => 1,
820             '.ref' => 'variableDefinitions'
821             },
822             {
823             '-skip' => 1,
824             '.ref' => '_'
825             },
826             {
827             '+max' => 1,
828             '.ref' => 'directives'
829             },
830             {
831             '.ref' => 'selectionSet'
832             }
833             ]
834             }
835             ]
836             },
837             'operationType' => {
838             '.rgx' => qr/\G(query|mutation|subscription)/
839             },
840             'operationTypeDefinition' => {
841             '.all' => [
842             {
843             '.ref' => 'operationType'
844             },
845             {
846             '-skip' => 1,
847             '.rgx' => qr/\G(?:\s|\x{FEFF}|,|[\ \t]*\#[\ \t]*[^\r\n]*(?:\r?\n|\r!NL|\z))*:(?:\s|\x{FEFF}|,|[\ \t]*\#[\ \t]*[^\r\n]*(?:\r?\n|\r!NL|\z))*/
848             },
849             {
850             '.ref' => 'namedType'
851             },
852             {
853             '-skip' => 1,
854             '.ref' => '_'
855             }
856             ]
857             },
858             'scalar' => {
859             '.all' => [
860             {
861             '-skip' => 1,
862             '.rgx' => qr/\Gscalar(?:\s|\x{FEFF}|,|[\ \t]*\#[\ \t]*[^\r\n]*(?:\r?\n|\r!NL|\z))*/
863             },
864             {
865             '.ref' => 'name'
866             },
867             {
868             '-skip' => 1,
869             '.ref' => '_'
870             },
871             {
872             '+max' => 1,
873             '.ref' => 'directives'
874             }
875             ]
876             },
877             'schema' => {
878             '.all' => [
879             {
880             '-skip' => 1,
881             '.rgx' => qr/\Gschema(?:\s|\x{FEFF}|,|[\ \t]*\#[\ \t]*[^\r\n]*(?:\r?\n|\r!NL|\z))*/
882             },
883             {
884             '+max' => 1,
885             '.ref' => 'directives'
886             },
887             {
888             '+max' => 1,
889             '.all' => [
890             {
891             '-skip' => 1,
892             '.rgx' => qr/\G(?:\s|\x{FEFF}|,|[\ \t]*\#[\ \t]*[^\r\n]*(?:\r?\n|\r!NL|\z))*\{(?:\s|\x{FEFF}|,|[\ \t]*\#[\ \t]*[^\r\n]*(?:\r?\n|\r!NL|\z))*/
893             },
894             {
895             '+min' => 1,
896             '.ref' => 'operationTypeDefinition'
897             },
898             {
899             '-skip' => 1,
900             '.rgx' => qr/\G(?:\s|\x{FEFF}|,|[\ \t]*\#[\ \t]*[^\r\n]*(?:\r?\n|\r!NL|\z))*\}/
901             }
902             ]
903             }
904             ]
905             },
906             'selection' => {
907             '.all' => [
908             {
909             '.any' => [
910             {
911             '.ref' => 'field'
912             },
913             {
914             '.ref' => 'inline_fragment'
915             },
916             {
917             '.ref' => 'fragment_spread'
918             }
919             ]
920             },
921             {
922             '-skip' => 1,
923             '.ref' => '_'
924             }
925             ]
926             },
927             'selectionSet' => {
928             '.all' => [
929             {
930             '-skip' => 1,
931             '.rgx' => qr/\G(?:\s|\x{FEFF}|,|[\ \t]*\#[\ \t]*[^\r\n]*(?:\r?\n|\r!NL|\z))*\{(?:\s|\x{FEFF}|,|[\ \t]*\#[\ \t]*[^\r\n]*(?:\r?\n|\r!NL|\z))*/
932             },
933             {
934             '.any' => [
935             {
936             '+min' => 1,
937             '.ref' => 'selection'
938             },
939             {
940             '.err' => 'Expected name'
941             }
942             ]
943             },
944             {
945             '-skip' => 1,
946             '.rgx' => qr/\G(?:\s|\x{FEFF}|,|[\ \t]*\#[\ \t]*[^\r\n]*(?:\r?\n|\r!NL|\z))*\}(?:\s|\x{FEFF}|,|[\ \t]*\#[\ \t]*[^\r\n]*(?:\r?\n|\r!NL|\z))*/
947             }
948             ]
949             },
950             'spread' => {
951             '.all' => [
952             {
953             '.rgx' => qr/\G\.{3}/
954             },
955             {
956             '-skip' => 1,
957             '.ref' => '_'
958             }
959             ]
960             },
961             'string' => {
962             '.any' => [
963             {
964             '.ref' => 'blockStringValue'
965             },
966             {
967             '.ref' => 'stringValue'
968             }
969             ]
970             },
971             'stringValue' => {
972             '.rgx' => qr/\G"((?:\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})|[^"\x00-\x1f\\])*)"/
973             },
974             'type' => {
975             '.all' => [
976             {
977             '-skip' => 1,
978             '.rgx' => qr/\Gtype(?:\s|\x{FEFF}|,|[\ \t]*\#[\ \t]*[^\r\n]*(?:\r?\n|\r!NL|\z))*/
979             },
980             {
981             '.ref' => 'name'
982             },
983             {
984             '-skip' => 1,
985             '.ref' => '_'
986             },
987             {
988             '+max' => 1,
989             '.ref' => 'implementsInterfaces'
990             },
991             {
992             '-skip' => 1,
993             '.ref' => '_'
994             },
995             {
996             '+max' => 1,
997             '.ref' => 'directives'
998             },
999             {
1000             '+max' => 1,
1001             '.all' => [
1002             {
1003             '-skip' => 1,
1004             '.rgx' => qr/\G(?:\s|\x{FEFF}|,|[\ \t]*\#[\ \t]*[^\r\n]*(?:\r?\n|\r!NL|\z))*\{/
1005             },
1006             {
1007             '+min' => 1,
1008             '.ref' => 'fieldDefinition'
1009             },
1010             {
1011             '-skip' => 1,
1012             '.rgx' => qr/\G(?:\s|\x{FEFF}|,|[\ \t]*\#[\ \t]*[^\r\n]*(?:\r?\n|\r!NL|\z))*\}/
1013             }
1014             ]
1015             }
1016             ]
1017             },
1018             'typeCondition' => {
1019             '.all' => [
1020             {
1021             '-skip' => 1,
1022             '.rgx' => qr/\Gon(?:\s|\x{FEFF}|,|[\ \t]*\#[\ \t]*[^\r\n]*(?:\r?\n|\r!NL|\z))*/
1023             },
1024             {
1025             '.ref' => 'namedType'
1026             }
1027             ]
1028             },
1029             'typeDefinition' => {
1030             '.any' => [
1031             {
1032             '.ref' => 'scalar'
1033             },
1034             {
1035             '.ref' => 'type'
1036             },
1037             {
1038             '.ref' => 'interface'
1039             },
1040             {
1041             '.ref' => 'union'
1042             },
1043             {
1044             '.ref' => 'enumTypeDefinition'
1045             },
1046             {
1047             '.ref' => 'input'
1048             }
1049             ]
1050             },
1051             'typeExtensionDefinition' => {
1052             '.all' => [
1053             {
1054             '-skip' => 1,
1055             '.rgx' => qr/\Gextend(?:\s|\x{FEFF}|,|[\ \t]*\#[\ \t]*[^\r\n]*(?:\r?\n|\r!NL|\z))*/
1056             },
1057             {
1058             '.any' => [
1059             {
1060             '.ref' => 'schema'
1061             },
1062             {
1063             '.ref' => 'typeDefinition'
1064             }
1065             ]
1066             }
1067             ]
1068             },
1069             'typeSystemDefinition' => {
1070             '.all' => [
1071             {
1072             '+max' => 1,
1073             '.ref' => 'description'
1074             },
1075             {
1076             '.any' => [
1077             {
1078             '.ref' => 'schema'
1079             },
1080             {
1081             '.ref' => 'typeDefinition'
1082             },
1083             {
1084             '.ref' => 'typeExtensionDefinition'
1085             },
1086             {
1087             '.ref' => 'directive'
1088             }
1089             ]
1090             }
1091             ]
1092             },
1093             'typedef' => {
1094             '.any' => [
1095             {
1096             '.ref' => 'nonNullType'
1097             },
1098             {
1099             '.ref' => 'namedType'
1100             },
1101             {
1102             '.ref' => 'listType'
1103             }
1104             ]
1105             },
1106             'union' => {
1107             '.all' => [
1108             {
1109             '-skip' => 1,
1110             '.rgx' => qr/\Gunion(?:\s|\x{FEFF}|,|[\ \t]*\#[\ \t]*[^\r\n]*(?:\r?\n|\r!NL|\z))*/
1111             },
1112             {
1113             '.ref' => 'name'
1114             },
1115             {
1116             '-skip' => 1,
1117             '.ref' => '_'
1118             },
1119             {
1120             '+max' => 1,
1121             '.ref' => 'directives'
1122             },
1123             {
1124             '+max' => 1,
1125             '.all' => [
1126             {
1127             '-skip' => 1,
1128             '.rgx' => qr/\G(?:\s|\x{FEFF}|,|[\ \t]*\#[\ \t]*[^\r\n]*(?:\r?\n|\r!NL|\z))*=(?:\s|\x{FEFF}|,|[\ \t]*\#[\ \t]*[^\r\n]*(?:\r?\n|\r!NL|\z))*/
1129             },
1130             {
1131             '.ref' => 'unionMembers'
1132             }
1133             ]
1134             }
1135             ]
1136             },
1137             'unionMembers' => {
1138             '.all' => [
1139             {
1140             '+max' => 1,
1141             '-skip' => 1,
1142             '.rgx' => qr/\G(?:\s|\x{FEFF}|,|[\ \t]*\#[\ \t]*[^\r\n]*(?:\r?\n|\r!NL|\z))*\|(?:\s|\x{FEFF}|,|[\ \t]*\#[\ \t]*[^\r\n]*(?:\r?\n|\r!NL|\z))*/
1143             },
1144             {
1145             '.all' => [
1146             {
1147             '.ref' => 'namedType'
1148             },
1149             {
1150             '+min' => 0,
1151             '-flat' => 1,
1152             '.all' => [
1153             {
1154             '-skip' => 1,
1155             '.rgx' => qr/\G(?:\s|\x{FEFF}|,|[\ \t]*\#[\ \t]*[^\r\n]*(?:\r?\n|\r!NL|\z))*\|(?:\s|\x{FEFF}|,|[\ \t]*\#[\ \t]*[^\r\n]*(?:\r?\n|\r!NL|\z))*/
1156             },
1157             {
1158             '.ref' => 'namedType'
1159             }
1160             ]
1161             }
1162             ]
1163             }
1164             ]
1165             },
1166             'value' => {
1167             '.all' => [
1168             {
1169             '.any' => [
1170             {
1171             '.ref' => 'variable'
1172             },
1173             {
1174             '.ref' => 'float'
1175             },
1176             {
1177             '.ref' => 'int'
1178             },
1179             {
1180             '.ref' => 'string'
1181             },
1182             {
1183             '.ref' => 'boolean'
1184             },
1185             {
1186             '.ref' => 'null'
1187             },
1188             {
1189             '.ref' => 'enumValue'
1190             },
1191             {
1192             '.ref' => 'listValue'
1193             },
1194             {
1195             '.ref' => 'objectValue'
1196             }
1197             ]
1198             },
1199             {
1200             '-skip' => 1,
1201             '.ref' => '_'
1202             }
1203             ]
1204             },
1205             'value_const' => {
1206             '.all' => [
1207             {
1208             '.any' => [
1209             {
1210             '.ref' => 'float'
1211             },
1212             {
1213             '.ref' => 'int'
1214             },
1215             {
1216             '.ref' => 'string'
1217             },
1218             {
1219             '.ref' => 'boolean'
1220             },
1221             {
1222             '.ref' => 'null'
1223             },
1224             {
1225             '.ref' => 'enumValue'
1226             },
1227             {
1228             '.ref' => 'listValue_const'
1229             },
1230             {
1231             '.ref' => 'objectValue_const'
1232             }
1233             ]
1234             },
1235             {
1236             '-skip' => 1,
1237             '.ref' => '_'
1238             }
1239             ]
1240             },
1241             'variable' => {
1242             '.all' => [
1243             {
1244             '-skip' => 1,
1245             '.rgx' => qr/\G(?:\s|\x{FEFF}|,|[\ \t]*\#[\ \t]*[^\r\n]*(?:\r?\n|\r!NL|\z))*\$/
1246             },
1247             {
1248             '.ref' => 'name'
1249             }
1250             ]
1251             },
1252             'variableDefinition' => {
1253             '.all' => [
1254             {
1255             '.ref' => 'variable'
1256             },
1257             {
1258             '-skip' => 1,
1259             '.rgx' => qr/\G(?:\s|\x{FEFF}|,|[\ \t]*\#[\ \t]*[^\r\n]*(?:\r?\n|\r!NL|\z))*:(?:\s|\x{FEFF}|,|[\ \t]*\#[\ \t]*[^\r\n]*(?:\r?\n|\r!NL|\z))*/
1260             },
1261             {
1262             '.ref' => 'typedef'
1263             },
1264             {
1265             '+max' => 1,
1266             '.ref' => 'defaultValue'
1267             },
1268             {
1269             '-skip' => 1,
1270             '.ref' => '_'
1271             }
1272             ]
1273             },
1274             'variableDefinitions' => {
1275             '.all' => [
1276             {
1277             '-skip' => 1,
1278             '.rgx' => qr/\G(?:\s|\x{FEFF}|,|[\ \t]*\#[\ \t]*[^\r\n]*(?:\r?\n|\r!NL|\z))*\((?:\s|\x{FEFF}|,|[\ \t]*\#[\ \t]*[^\r\n]*(?:\r?\n|\r!NL|\z))*/
1279             },
1280             {
1281             '.any' => [
1282             {
1283             '+min' => 1,
1284             '.ref' => 'variableDefinition'
1285             },
1286             {
1287             '.err' => 'Expected $argument: Type'
1288             }
1289             ]
1290             },
1291             {
1292             '-skip' => 1,
1293             '.rgx' => qr/\G(?:\s|\x{FEFF}|,|[\ \t]*\#[\ \t]*[^\r\n]*(?:\r?\n|\r!NL|\z))*\)(?:\s|\x{FEFF}|,|[\ \t]*\#[\ \t]*[^\r\n]*(?:\r?\n|\r!NL|\z))*/
1294             }
1295             ]
1296             },
1297             'ws2' => {
1298             '.rgx' => qr/\G(?:\s|\x{FEFF}|,|[\ \t]*\#[\ \t]*[^\r\n]*(?:\r?\n|\r!NL|\z))+/
1299             }
1300             }
1301             }
1302              
1303             1;