json_select 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (75) hide show
  1. data/.gitignore +4 -0
  2. data/Gemfile +7 -0
  3. data/LICENSE +20 -0
  4. data/README.md +67 -0
  5. data/Rakefile +18 -0
  6. data/json_select.gemspec +23 -0
  7. data/lib/json_select.rb +35 -0
  8. data/lib/json_select/ast/combination_selector.rb +14 -0
  9. data/lib/json_select/ast/complex_expr.rb +27 -0
  10. data/lib/json_select/ast/even_expr.rb +7 -0
  11. data/lib/json_select/ast/hash_selector.rb +12 -0
  12. data/lib/json_select/ast/odd_expr.rb +7 -0
  13. data/lib/json_select/ast/pseudo_selector.rb +24 -0
  14. data/lib/json_select/ast/selector_group.rb +17 -0
  15. data/lib/json_select/ast/simple_expr.rb +7 -0
  16. data/lib/json_select/ast/simple_selector.rb +23 -0
  17. data/lib/json_select/ast/type_selector.rb +8 -0
  18. data/lib/json_select/ast/universal_selector.rb +7 -0
  19. data/lib/json_select/parser.rb +19 -0
  20. data/lib/json_select/selector.rb +176 -0
  21. data/lib/json_select/selector_parser.rb +1251 -0
  22. data/lib/json_select/selector_parser.tt +161 -0
  23. data/lib/json_select/version.rb +3 -0
  24. data/spec/conformance_spec.rb +41 -0
  25. data/spec/fixtures/README.md +14 -0
  26. data/spec/fixtures/alltests.txt +31 -0
  27. data/spec/fixtures/basic.json +31 -0
  28. data/spec/fixtures/basic.xml +31 -0
  29. data/spec/fixtures/basic_first-child.ast +6 -0
  30. data/spec/fixtures/basic_first-child.output +6 -0
  31. data/spec/fixtures/basic_first-child.selector +2 -0
  32. data/spec/fixtures/basic_grouping.ast +12 -0
  33. data/spec/fixtures/basic_grouping.output +4 -0
  34. data/spec/fixtures/basic_grouping.selector +1 -0
  35. data/spec/fixtures/basic_id.ast +3 -0
  36. data/spec/fixtures/basic_id.output +1 -0
  37. data/spec/fixtures/basic_id.selector +1 -0
  38. data/spec/fixtures/basic_id_multiple.ast +3 -0
  39. data/spec/fixtures/basic_id_multiple.output +3 -0
  40. data/spec/fixtures/basic_id_multiple.selector +1 -0
  41. data/spec/fixtures/basic_id_quotes.ast +3 -0
  42. data/spec/fixtures/basic_id_quotes.output +2 -0
  43. data/spec/fixtures/basic_id_quotes.selector +1 -0
  44. data/spec/fixtures/basic_id_with_type.ast +4 -0
  45. data/spec/fixtures/basic_id_with_type.output +1 -0
  46. data/spec/fixtures/basic_id_with_type.selector +1 -0
  47. data/spec/fixtures/basic_last-child.ast +6 -0
  48. data/spec/fixtures/basic_last-child.output +6 -0
  49. data/spec/fixtures/basic_last-child.selector +2 -0
  50. data/spec/fixtures/basic_nth-child-2.ast +6 -0
  51. data/spec/fixtures/basic_nth-child-2.output +13 -0
  52. data/spec/fixtures/basic_nth-child-2.selector +1 -0
  53. data/spec/fixtures/basic_nth-child.ast +6 -0
  54. data/spec/fixtures/basic_nth-child.output +7 -0
  55. data/spec/fixtures/basic_nth-child.selector +1 -0
  56. data/spec/fixtures/basic_nth-last-child.ast +6 -0
  57. data/spec/fixtures/basic_nth-last-child.output +6 -0
  58. data/spec/fixtures/basic_nth-last-child.selector +1 -0
  59. data/spec/fixtures/basic_root_pseudo.ast +3 -0
  60. data/spec/fixtures/basic_root_pseudo.output +31 -0
  61. data/spec/fixtures/basic_root_pseudo.selector +1 -0
  62. data/spec/fixtures/basic_type.ast +3 -0
  63. data/spec/fixtures/basic_type.output +14 -0
  64. data/spec/fixtures/basic_type.selector +1 -0
  65. data/spec/fixtures/basic_type2.ast +3 -0
  66. data/spec/fixtures/basic_type2.output +1 -0
  67. data/spec/fixtures/basic_type2.selector +1 -0
  68. data/spec/fixtures/basic_type3.ast +3 -0
  69. data/spec/fixtures/basic_type3.output +47 -0
  70. data/spec/fixtures/basic_type3.selector +1 -0
  71. data/spec/fixtures/basic_universal.ast +2 -0
  72. data/spec/fixtures/basic_universal.output +85 -0
  73. data/spec/fixtures/basic_universal.selector +1 -0
  74. data/spec/spec_helper.rb +6 -0
  75. metadata +190 -0
@@ -0,0 +1,1251 @@
1
+ # Autogenerated from a Treetop grammar. Edits may be lost.
2
+
3
+
4
+ module JSONSelect
5
+ module SelectorParser
6
+ include Treetop::Runtime
7
+
8
+ def root
9
+ @root ||= :selectors_group
10
+ end
11
+
12
+ module SelectorsGroup0
13
+ def c
14
+ elements[1]
15
+ end
16
+ end
17
+
18
+ module SelectorsGroup1
19
+ def a
20
+ elements[0]
21
+ end
22
+
23
+ def b
24
+ elements[1]
25
+ end
26
+ end
27
+
28
+ def _nt_selectors_group
29
+ start_index = index
30
+ if node_cache[:selectors_group].has_key?(index)
31
+ cached = node_cache[:selectors_group][index]
32
+ if cached
33
+ cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
34
+ @index = cached.interval.end
35
+ end
36
+ return cached
37
+ end
38
+
39
+ i0, s0 = index, []
40
+ r1 = _nt_selector
41
+ s0 << r1
42
+ if r1
43
+ s2, i2 = [], index
44
+ loop do
45
+ i3, s3 = index, []
46
+ if has_terminal?(',', false, index)
47
+ r4 = instantiate_node(SyntaxNode,input, index...(index + 1))
48
+ @index += 1
49
+ else
50
+ terminal_parse_failure(',')
51
+ r4 = nil
52
+ end
53
+ s3 << r4
54
+ if r4
55
+ r5 = _nt_selector
56
+ s3 << r5
57
+ end
58
+ if s3.last
59
+ r3 = instantiate_node(SyntaxNode,input, i3...index, s3)
60
+ r3.extend(SelectorsGroup0)
61
+ else
62
+ @index = i3
63
+ r3 = nil
64
+ end
65
+ if r3
66
+ s2 << r3
67
+ else
68
+ break
69
+ end
70
+ end
71
+ r2 = instantiate_node(SyntaxNode,input, i2...index, s2)
72
+ s0 << r2
73
+ end
74
+ if s0.last
75
+ r0 = instantiate_node(JSONSelect::Ast::SelectorGroup,input, i0...index, s0)
76
+ r0.extend(SelectorsGroup1)
77
+ else
78
+ @index = i0
79
+ r0 = nil
80
+ end
81
+
82
+ node_cache[:selectors_group][start_index] = r0
83
+
84
+ r0
85
+ end
86
+
87
+ module Selector0
88
+ def c
89
+ elements[0]
90
+ end
91
+
92
+ def d
93
+ elements[1]
94
+ end
95
+ end
96
+
97
+ module Selector1
98
+ def a
99
+ elements[0]
100
+ end
101
+
102
+ def b
103
+ elements[1]
104
+ end
105
+ end
106
+
107
+ def _nt_selector
108
+ start_index = index
109
+ if node_cache[:selector].has_key?(index)
110
+ cached = node_cache[:selector][index]
111
+ if cached
112
+ cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
113
+ @index = cached.interval.end
114
+ end
115
+ return cached
116
+ end
117
+
118
+ i0, s0 = index, []
119
+ r1 = _nt_simple_selector_sequence
120
+ s0 << r1
121
+ if r1
122
+ s2, i2 = [], index
123
+ loop do
124
+ i3, s3 = index, []
125
+ r4 = _nt_combinator
126
+ s3 << r4
127
+ if r4
128
+ r5 = _nt_simple_selector_sequence
129
+ s3 << r5
130
+ end
131
+ if s3.last
132
+ r3 = instantiate_node(SyntaxNode,input, i3...index, s3)
133
+ r3.extend(Selector0)
134
+ else
135
+ @index = i3
136
+ r3 = nil
137
+ end
138
+ if r3
139
+ s2 << r3
140
+ else
141
+ break
142
+ end
143
+ end
144
+ r2 = instantiate_node(SyntaxNode,input, i2...index, s2)
145
+ s0 << r2
146
+ end
147
+ if s0.last
148
+ r0 = instantiate_node(JSONSelect::Ast::CombinationSelector,input, i0...index, s0)
149
+ r0.extend(Selector1)
150
+ else
151
+ @index = i0
152
+ r0 = nil
153
+ end
154
+
155
+ node_cache[:selector][start_index] = r0
156
+
157
+ r0
158
+ end
159
+
160
+ def _nt_combinator
161
+ start_index = index
162
+ if node_cache[:combinator].has_key?(index)
163
+ cached = node_cache[:combinator][index]
164
+ if cached
165
+ cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
166
+ @index = cached.interval.end
167
+ end
168
+ return cached
169
+ end
170
+
171
+ i0 = index
172
+ if has_terminal?('>', false, index)
173
+ r1 = instantiate_node(SyntaxNode,input, index...(index + 1))
174
+ @index += 1
175
+ else
176
+ terminal_parse_failure('>')
177
+ r1 = nil
178
+ end
179
+ if r1
180
+ r0 = r1
181
+ else
182
+ s2, i2 = [], index
183
+ loop do
184
+ if has_terminal?('\G[\\s]', true, index)
185
+ r3 = true
186
+ @index += 1
187
+ else
188
+ r3 = nil
189
+ end
190
+ if r3
191
+ s2 << r3
192
+ else
193
+ break
194
+ end
195
+ end
196
+ if s2.empty?
197
+ @index = i2
198
+ r2 = nil
199
+ else
200
+ r2 = instantiate_node(SyntaxNode,input, i2...index, s2)
201
+ end
202
+ if r2
203
+ r0 = r2
204
+ else
205
+ @index = i0
206
+ r0 = nil
207
+ end
208
+ end
209
+
210
+ node_cache[:combinator][start_index] = r0
211
+
212
+ r0
213
+ end
214
+
215
+ module SimpleSelectorSequence0
216
+ def a
217
+ elements[0]
218
+ end
219
+
220
+ def b
221
+ elements[1]
222
+ end
223
+ end
224
+
225
+ def _nt_simple_selector_sequence
226
+ start_index = index
227
+ if node_cache[:simple_selector_sequence].has_key?(index)
228
+ cached = node_cache[:simple_selector_sequence][index]
229
+ if cached
230
+ cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
231
+ @index = cached.interval.end
232
+ end
233
+ return cached
234
+ end
235
+
236
+ i0 = index
237
+ i1, s1 = index, []
238
+ i2 = index
239
+ r3 = _nt_type_selector
240
+ if r3
241
+ r2 = r3
242
+ else
243
+ r4 = _nt_universal
244
+ if r4
245
+ r2 = r4
246
+ else
247
+ @index = i2
248
+ r2 = nil
249
+ end
250
+ end
251
+ s1 << r2
252
+ if r2
253
+ s5, i5 = [], index
254
+ loop do
255
+ i6 = index
256
+ r7 = _nt_hash
257
+ if r7
258
+ r6 = r7
259
+ else
260
+ r8 = _nt_pseudo
261
+ if r8
262
+ r6 = r8
263
+ else
264
+ @index = i6
265
+ r6 = nil
266
+ end
267
+ end
268
+ if r6
269
+ s5 << r6
270
+ else
271
+ break
272
+ end
273
+ end
274
+ r5 = instantiate_node(SyntaxNode,input, i5...index, s5)
275
+ s1 << r5
276
+ end
277
+ if s1.last
278
+ r1 = instantiate_node(JSONSelect::Ast::SimpleSelector,input, i1...index, s1)
279
+ r1.extend(SimpleSelectorSequence0)
280
+ else
281
+ @index = i1
282
+ r1 = nil
283
+ end
284
+ if r1
285
+ r0 = r1
286
+ else
287
+ s9, i9 = [], index
288
+ loop do
289
+ i10 = index
290
+ r11 = _nt_hash
291
+ if r11
292
+ r10 = r11
293
+ else
294
+ r12 = _nt_pseudo
295
+ if r12
296
+ r10 = r12
297
+ else
298
+ @index = i10
299
+ r10 = nil
300
+ end
301
+ end
302
+ if r10
303
+ s9 << r10
304
+ else
305
+ break
306
+ end
307
+ end
308
+ if s9.empty?
309
+ @index = i9
310
+ r9 = nil
311
+ else
312
+ r9 = instantiate_node(JSONSelect::Ast::SimpleSelector,input, i9...index, s9)
313
+ end
314
+ if r9
315
+ r0 = r9
316
+ else
317
+ @index = i0
318
+ r0 = nil
319
+ end
320
+ end
321
+
322
+ node_cache[:simple_selector_sequence][start_index] = r0
323
+
324
+ r0
325
+ end
326
+
327
+ def _nt_type_selector
328
+ start_index = index
329
+ if node_cache[:type_selector].has_key?(index)
330
+ cached = node_cache[:type_selector][index]
331
+ if cached
332
+ cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
333
+ @index = cached.interval.end
334
+ end
335
+ return cached
336
+ end
337
+
338
+ i0 = index
339
+ if has_terminal?('object', false, index)
340
+ r1 = instantiate_node(SyntaxNode,input, index...(index + 6))
341
+ @index += 6
342
+ else
343
+ terminal_parse_failure('object')
344
+ r1 = nil
345
+ end
346
+ if r1
347
+ r0 = r1
348
+ r0.extend(JSONSelect::Ast::TypeSelector)
349
+ else
350
+ if has_terminal?('array', false, index)
351
+ r2 = instantiate_node(SyntaxNode,input, index...(index + 5))
352
+ @index += 5
353
+ else
354
+ terminal_parse_failure('array')
355
+ r2 = nil
356
+ end
357
+ if r2
358
+ r0 = r2
359
+ r0.extend(JSONSelect::Ast::TypeSelector)
360
+ else
361
+ if has_terminal?('number', false, index)
362
+ r3 = instantiate_node(SyntaxNode,input, index...(index + 6))
363
+ @index += 6
364
+ else
365
+ terminal_parse_failure('number')
366
+ r3 = nil
367
+ end
368
+ if r3
369
+ r0 = r3
370
+ r0.extend(JSONSelect::Ast::TypeSelector)
371
+ else
372
+ if has_terminal?('string', false, index)
373
+ r4 = instantiate_node(SyntaxNode,input, index...(index + 6))
374
+ @index += 6
375
+ else
376
+ terminal_parse_failure('string')
377
+ r4 = nil
378
+ end
379
+ if r4
380
+ r0 = r4
381
+ r0.extend(JSONSelect::Ast::TypeSelector)
382
+ else
383
+ if has_terminal?('boolean', false, index)
384
+ r5 = instantiate_node(SyntaxNode,input, index...(index + 7))
385
+ @index += 7
386
+ else
387
+ terminal_parse_failure('boolean')
388
+ r5 = nil
389
+ end
390
+ if r5
391
+ r0 = r5
392
+ r0.extend(JSONSelect::Ast::TypeSelector)
393
+ else
394
+ if has_terminal?('null', false, index)
395
+ r6 = instantiate_node(SyntaxNode,input, index...(index + 4))
396
+ @index += 4
397
+ else
398
+ terminal_parse_failure('null')
399
+ r6 = nil
400
+ end
401
+ if r6
402
+ r0 = r6
403
+ r0.extend(JSONSelect::Ast::TypeSelector)
404
+ else
405
+ @index = i0
406
+ r0 = nil
407
+ end
408
+ end
409
+ end
410
+ end
411
+ end
412
+ end
413
+
414
+ node_cache[:type_selector][start_index] = r0
415
+
416
+ r0
417
+ end
418
+
419
+ def _nt_universal
420
+ start_index = index
421
+ if node_cache[:universal].has_key?(index)
422
+ cached = node_cache[:universal][index]
423
+ if cached
424
+ cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
425
+ @index = cached.interval.end
426
+ end
427
+ return cached
428
+ end
429
+
430
+ if has_terminal?('*', false, index)
431
+ r0 = instantiate_node(JSONSelect::Ast::UniversalSelector,input, index...(index + 1))
432
+ @index += 1
433
+ else
434
+ terminal_parse_failure('*')
435
+ r0 = nil
436
+ end
437
+
438
+ node_cache[:universal][start_index] = r0
439
+
440
+ r0
441
+ end
442
+
443
+ module Hash0
444
+ def name
445
+ elements[1]
446
+ end
447
+ end
448
+
449
+ module Hash1
450
+ def json_string
451
+ elements[1]
452
+ end
453
+ end
454
+
455
+ def _nt_hash
456
+ start_index = index
457
+ if node_cache[:hash].has_key?(index)
458
+ cached = node_cache[:hash][index]
459
+ if cached
460
+ cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
461
+ @index = cached.interval.end
462
+ end
463
+ return cached
464
+ end
465
+
466
+ i0 = index
467
+ i1, s1 = index, []
468
+ if has_terminal?('.', false, index)
469
+ r2 = instantiate_node(SyntaxNode,input, index...(index + 1))
470
+ @index += 1
471
+ else
472
+ terminal_parse_failure('.')
473
+ r2 = nil
474
+ end
475
+ s1 << r2
476
+ if r2
477
+ r3 = _nt_name
478
+ s1 << r3
479
+ end
480
+ if s1.last
481
+ r1 = instantiate_node(SyntaxNode,input, i1...index, s1)
482
+ r1.extend(Hash0)
483
+ else
484
+ @index = i1
485
+ r1 = nil
486
+ end
487
+ if r1
488
+ r0 = r1
489
+ r0.extend(JSONSelect::Ast::HashSelector)
490
+ else
491
+ i4, s4 = index, []
492
+ if has_terminal?('.', false, index)
493
+ r5 = instantiate_node(SyntaxNode,input, index...(index + 1))
494
+ @index += 1
495
+ else
496
+ terminal_parse_failure('.')
497
+ r5 = nil
498
+ end
499
+ s4 << r5
500
+ if r5
501
+ r6 = _nt_json_string
502
+ s4 << r6
503
+ end
504
+ if s4.last
505
+ r4 = instantiate_node(SyntaxNode,input, i4...index, s4)
506
+ r4.extend(Hash1)
507
+ else
508
+ @index = i4
509
+ r4 = nil
510
+ end
511
+ if r4
512
+ r0 = r4
513
+ r0.extend(JSONSelect::Ast::HashSelector)
514
+ else
515
+ @index = i0
516
+ r0 = nil
517
+ end
518
+ end
519
+
520
+ node_cache[:hash][start_index] = r0
521
+
522
+ r0
523
+ end
524
+
525
+ module Pseudo0
526
+ def a
527
+ elements[1]
528
+ end
529
+ end
530
+
531
+ module Pseudo1
532
+ def a
533
+ elements[1]
534
+ end
535
+
536
+ def e
537
+ elements[3]
538
+ end
539
+
540
+ end
541
+
542
+ def _nt_pseudo
543
+ start_index = index
544
+ if node_cache[:pseudo].has_key?(index)
545
+ cached = node_cache[:pseudo][index]
546
+ if cached
547
+ cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
548
+ @index = cached.interval.end
549
+ end
550
+ return cached
551
+ end
552
+
553
+ i0 = index
554
+ i1, s1 = index, []
555
+ if has_terminal?(':', false, index)
556
+ r2 = instantiate_node(SyntaxNode,input, index...(index + 1))
557
+ @index += 1
558
+ else
559
+ terminal_parse_failure(':')
560
+ r2 = nil
561
+ end
562
+ s1 << r2
563
+ if r2
564
+ r3 = _nt_pseudo_class_name
565
+ s1 << r3
566
+ end
567
+ if s1.last
568
+ r1 = instantiate_node(JSONSelect::Ast::PseudoSelector,input, i1...index, s1)
569
+ r1.extend(Pseudo0)
570
+ else
571
+ @index = i1
572
+ r1 = nil
573
+ end
574
+ if r1
575
+ r0 = r1
576
+ else
577
+ i4, s4 = index, []
578
+ if has_terminal?(':', false, index)
579
+ r5 = instantiate_node(SyntaxNode,input, index...(index + 1))
580
+ @index += 1
581
+ else
582
+ terminal_parse_failure(':')
583
+ r5 = nil
584
+ end
585
+ s4 << r5
586
+ if r5
587
+ r6 = _nt_pseudo_function_name
588
+ s4 << r6
589
+ if r6
590
+ if has_terminal?('(', false, index)
591
+ r7 = instantiate_node(SyntaxNode,input, index...(index + 1))
592
+ @index += 1
593
+ else
594
+ terminal_parse_failure('(')
595
+ r7 = nil
596
+ end
597
+ s4 << r7
598
+ if r7
599
+ r8 = _nt_expression
600
+ s4 << r8
601
+ if r8
602
+ if has_terminal?(')', false, index)
603
+ r9 = instantiate_node(SyntaxNode,input, index...(index + 1))
604
+ @index += 1
605
+ else
606
+ terminal_parse_failure(')')
607
+ r9 = nil
608
+ end
609
+ s4 << r9
610
+ end
611
+ end
612
+ end
613
+ end
614
+ if s4.last
615
+ r4 = instantiate_node(JSONSelect::Ast::PseudoSelector,input, i4...index, s4)
616
+ r4.extend(Pseudo1)
617
+ else
618
+ @index = i4
619
+ r4 = nil
620
+ end
621
+ if r4
622
+ r0 = r4
623
+ else
624
+ @index = i0
625
+ r0 = nil
626
+ end
627
+ end
628
+
629
+ node_cache[:pseudo][start_index] = r0
630
+
631
+ r0
632
+ end
633
+
634
+ def _nt_pseudo_class_name
635
+ start_index = index
636
+ if node_cache[:pseudo_class_name].has_key?(index)
637
+ cached = node_cache[:pseudo_class_name][index]
638
+ if cached
639
+ cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
640
+ @index = cached.interval.end
641
+ end
642
+ return cached
643
+ end
644
+
645
+ i0 = index
646
+ if has_terminal?('root', false, index)
647
+ r1 = instantiate_node(SyntaxNode,input, index...(index + 4))
648
+ @index += 4
649
+ else
650
+ terminal_parse_failure('root')
651
+ r1 = nil
652
+ end
653
+ if r1
654
+ r0 = r1
655
+ else
656
+ if has_terminal?('first-child', false, index)
657
+ r2 = instantiate_node(SyntaxNode,input, index...(index + 11))
658
+ @index += 11
659
+ else
660
+ terminal_parse_failure('first-child')
661
+ r2 = nil
662
+ end
663
+ if r2
664
+ r0 = r2
665
+ else
666
+ if has_terminal?('last-child', false, index)
667
+ r3 = instantiate_node(SyntaxNode,input, index...(index + 10))
668
+ @index += 10
669
+ else
670
+ terminal_parse_failure('last-child')
671
+ r3 = nil
672
+ end
673
+ if r3
674
+ r0 = r3
675
+ else
676
+ if has_terminal?('only-child', false, index)
677
+ r4 = instantiate_node(SyntaxNode,input, index...(index + 10))
678
+ @index += 10
679
+ else
680
+ terminal_parse_failure('only-child')
681
+ r4 = nil
682
+ end
683
+ if r4
684
+ r0 = r4
685
+ else
686
+ @index = i0
687
+ r0 = nil
688
+ end
689
+ end
690
+ end
691
+ end
692
+
693
+ node_cache[:pseudo_class_name][start_index] = r0
694
+
695
+ r0
696
+ end
697
+
698
+ def _nt_pseudo_function_name
699
+ start_index = index
700
+ if node_cache[:pseudo_function_name].has_key?(index)
701
+ cached = node_cache[:pseudo_function_name][index]
702
+ if cached
703
+ cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
704
+ @index = cached.interval.end
705
+ end
706
+ return cached
707
+ end
708
+
709
+ i0 = index
710
+ if has_terminal?('nth-child', false, index)
711
+ r1 = instantiate_node(SyntaxNode,input, index...(index + 9))
712
+ @index += 9
713
+ else
714
+ terminal_parse_failure('nth-child')
715
+ r1 = nil
716
+ end
717
+ if r1
718
+ r0 = r1
719
+ else
720
+ if has_terminal?('nth-last-child', false, index)
721
+ r2 = instantiate_node(SyntaxNode,input, index...(index + 14))
722
+ @index += 14
723
+ else
724
+ terminal_parse_failure('nth-last-child')
725
+ r2 = nil
726
+ end
727
+ if r2
728
+ r0 = r2
729
+ else
730
+ @index = i0
731
+ r0 = nil
732
+ end
733
+ end
734
+
735
+ node_cache[:pseudo_function_name][start_index] = r0
736
+
737
+ r0
738
+ end
739
+
740
+ module Expression0
741
+ end
742
+
743
+ module Expression1
744
+ def a
745
+ elements[0]
746
+ end
747
+
748
+ def b
749
+ elements[1]
750
+ end
751
+
752
+ def c
753
+ elements[3]
754
+ end
755
+ end
756
+
757
+ module Expression2
758
+ end
759
+
760
+ def _nt_expression
761
+ start_index = index
762
+ if node_cache[:expression].has_key?(index)
763
+ cached = node_cache[:expression][index]
764
+ if cached
765
+ cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
766
+ @index = cached.interval.end
767
+ end
768
+ return cached
769
+ end
770
+
771
+ i0 = index
772
+ if has_terminal?('odd', false, index)
773
+ r1 = instantiate_node(JSONSelect::Ast::OddExpr,input, index...(index + 3))
774
+ @index += 3
775
+ else
776
+ terminal_parse_failure('odd')
777
+ r1 = nil
778
+ end
779
+ if r1
780
+ r0 = r1
781
+ else
782
+ if has_terminal?('even', false, index)
783
+ r2 = instantiate_node(JSONSelect::Ast::EvenExpr,input, index...(index + 4))
784
+ @index += 4
785
+ else
786
+ terminal_parse_failure('even')
787
+ r2 = nil
788
+ end
789
+ if r2
790
+ r0 = r2
791
+ else
792
+ i3, s3 = index, []
793
+ if has_terminal?('\G[+-]', true, index)
794
+ r5 = true
795
+ @index += 1
796
+ else
797
+ r5 = nil
798
+ end
799
+ if r5
800
+ r4 = r5
801
+ else
802
+ r4 = instantiate_node(SyntaxNode,input, index...index)
803
+ end
804
+ s3 << r4
805
+ if r4
806
+ s6, i6 = [], index
807
+ loop do
808
+ if has_terminal?('\G[0-9]', true, index)
809
+ r7 = true
810
+ @index += 1
811
+ else
812
+ r7 = nil
813
+ end
814
+ if r7
815
+ s6 << r7
816
+ else
817
+ break
818
+ end
819
+ end
820
+ r6 = instantiate_node(SyntaxNode,input, i6...index, s6)
821
+ s3 << r6
822
+ if r6
823
+ if has_terminal?('n', false, index)
824
+ r8 = instantiate_node(SyntaxNode,input, index...(index + 1))
825
+ @index += 1
826
+ else
827
+ terminal_parse_failure('n')
828
+ r8 = nil
829
+ end
830
+ s3 << r8
831
+ if r8
832
+ i10, s10 = index, []
833
+ if has_terminal?('\G[+-]', true, index)
834
+ r11 = true
835
+ @index += 1
836
+ else
837
+ r11 = nil
838
+ end
839
+ s10 << r11
840
+ if r11
841
+ if has_terminal?('\G[0-9]', true, index)
842
+ r12 = true
843
+ @index += 1
844
+ else
845
+ r12 = nil
846
+ end
847
+ s10 << r12
848
+ end
849
+ if s10.last
850
+ r10 = instantiate_node(SyntaxNode,input, i10...index, s10)
851
+ r10.extend(Expression0)
852
+ else
853
+ @index = i10
854
+ r10 = nil
855
+ end
856
+ if r10
857
+ r9 = r10
858
+ else
859
+ r9 = instantiate_node(SyntaxNode,input, index...index)
860
+ end
861
+ s3 << r9
862
+ end
863
+ end
864
+ end
865
+ if s3.last
866
+ r3 = instantiate_node(JSONSelect::Ast::ComplexExpr,input, i3...index, s3)
867
+ r3.extend(Expression1)
868
+ else
869
+ @index = i3
870
+ r3 = nil
871
+ end
872
+ if r3
873
+ r0 = r3
874
+ else
875
+ i13, s13 = index, []
876
+ if has_terminal?('\G[+-]', true, index)
877
+ r15 = true
878
+ @index += 1
879
+ else
880
+ r15 = nil
881
+ end
882
+ if r15
883
+ r14 = r15
884
+ else
885
+ r14 = instantiate_node(SyntaxNode,input, index...index)
886
+ end
887
+ s13 << r14
888
+ if r14
889
+ s16, i16 = [], index
890
+ loop do
891
+ if has_terminal?('\G[0-9]', true, index)
892
+ r17 = true
893
+ @index += 1
894
+ else
895
+ r17 = nil
896
+ end
897
+ if r17
898
+ s16 << r17
899
+ else
900
+ break
901
+ end
902
+ end
903
+ if s16.empty?
904
+ @index = i16
905
+ r16 = nil
906
+ else
907
+ r16 = instantiate_node(SyntaxNode,input, i16...index, s16)
908
+ end
909
+ s13 << r16
910
+ end
911
+ if s13.last
912
+ r13 = instantiate_node(JSONSelect::Ast::SimpleExpr,input, i13...index, s13)
913
+ r13.extend(Expression2)
914
+ else
915
+ @index = i13
916
+ r13 = nil
917
+ end
918
+ if r13
919
+ r0 = r13
920
+ else
921
+ @index = i0
922
+ r0 = nil
923
+ end
924
+ end
925
+ end
926
+ end
927
+
928
+ node_cache[:expression][start_index] = r0
929
+
930
+ r0
931
+ end
932
+
933
+ module JsonString0
934
+ end
935
+
936
+ def _nt_json_string
937
+ start_index = index
938
+ if node_cache[:json_string].has_key?(index)
939
+ cached = node_cache[:json_string][index]
940
+ if cached
941
+ cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
942
+ @index = cached.interval.end
943
+ end
944
+ return cached
945
+ end
946
+
947
+ i0, s0 = index, []
948
+ if has_terminal?('\G["]', true, index)
949
+ r1 = true
950
+ @index += 1
951
+ else
952
+ r1 = nil
953
+ end
954
+ s0 << r1
955
+ if r1
956
+ s2, i2 = [], index
957
+ loop do
958
+ r3 = _nt_json_chars
959
+ if r3
960
+ s2 << r3
961
+ else
962
+ break
963
+ end
964
+ end
965
+ r2 = instantiate_node(SyntaxNode,input, i2...index, s2)
966
+ s0 << r2
967
+ if r2
968
+ if has_terminal?('\G["]', true, index)
969
+ r4 = true
970
+ @index += 1
971
+ else
972
+ r4 = nil
973
+ end
974
+ s0 << r4
975
+ end
976
+ end
977
+ if s0.last
978
+ r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
979
+ r0.extend(JsonString0)
980
+ else
981
+ @index = i0
982
+ r0 = nil
983
+ end
984
+
985
+ node_cache[:json_string][start_index] = r0
986
+
987
+ r0
988
+ end
989
+
990
+ module JsonChars0
991
+ end
992
+
993
+ def _nt_json_chars
994
+ start_index = index
995
+ if node_cache[:json_chars].has_key?(index)
996
+ cached = node_cache[:json_chars][index]
997
+ if cached
998
+ cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
999
+ @index = cached.interval.end
1000
+ end
1001
+ return cached
1002
+ end
1003
+
1004
+ i0 = index
1005
+ if has_terminal?('\G[^\\\\"]', true, index)
1006
+ r1 = true
1007
+ @index += 1
1008
+ else
1009
+ r1 = nil
1010
+ end
1011
+ if r1
1012
+ r0 = r1
1013
+ else
1014
+ i2, s2 = index, []
1015
+ if has_terminal?('\G[\\\\]', true, index)
1016
+ r3 = true
1017
+ @index += 1
1018
+ else
1019
+ r3 = nil
1020
+ end
1021
+ s2 << r3
1022
+ if r3
1023
+ if has_terminal?('\G["\\\\/bfnrt]', true, index)
1024
+ r4 = true
1025
+ @index += 1
1026
+ else
1027
+ r4 = nil
1028
+ end
1029
+ s2 << r4
1030
+ end
1031
+ if s2.last
1032
+ r2 = instantiate_node(SyntaxNode,input, i2...index, s2)
1033
+ r2.extend(JsonChars0)
1034
+ else
1035
+ @index = i2
1036
+ r2 = nil
1037
+ end
1038
+ if r2
1039
+ r0 = r2
1040
+ else
1041
+ @index = i0
1042
+ r0 = nil
1043
+ end
1044
+ end
1045
+
1046
+ node_cache[:json_chars][start_index] = r0
1047
+
1048
+ r0
1049
+ end
1050
+
1051
+ module Name0
1052
+ def nmstart
1053
+ elements[0]
1054
+ end
1055
+
1056
+ end
1057
+
1058
+ def _nt_name
1059
+ start_index = index
1060
+ if node_cache[:name].has_key?(index)
1061
+ cached = node_cache[:name][index]
1062
+ if cached
1063
+ cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
1064
+ @index = cached.interval.end
1065
+ end
1066
+ return cached
1067
+ end
1068
+
1069
+ i0, s0 = index, []
1070
+ r1 = _nt_nmstart
1071
+ s0 << r1
1072
+ if r1
1073
+ s2, i2 = [], index
1074
+ loop do
1075
+ r3 = _nt_nmchar
1076
+ if r3
1077
+ s2 << r3
1078
+ else
1079
+ break
1080
+ end
1081
+ end
1082
+ r2 = instantiate_node(SyntaxNode,input, i2...index, s2)
1083
+ s0 << r2
1084
+ end
1085
+ if s0.last
1086
+ r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
1087
+ r0.extend(Name0)
1088
+ else
1089
+ @index = i0
1090
+ r0 = nil
1091
+ end
1092
+
1093
+ node_cache[:name][start_index] = r0
1094
+
1095
+ r0
1096
+ end
1097
+
1098
+ def _nt_nmstart
1099
+ start_index = index
1100
+ if node_cache[:nmstart].has_key?(index)
1101
+ cached = node_cache[:nmstart][index]
1102
+ if cached
1103
+ cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
1104
+ @index = cached.interval.end
1105
+ end
1106
+ return cached
1107
+ end
1108
+
1109
+ i0 = index
1110
+ r1 = _nt_escape
1111
+ if r1
1112
+ r0 = r1
1113
+ else
1114
+ if has_terminal?('\G[_a-zA-Z]', true, index)
1115
+ r2 = true
1116
+ @index += 1
1117
+ else
1118
+ r2 = nil
1119
+ end
1120
+ if r2
1121
+ r0 = r2
1122
+ else
1123
+ r3 = _nt_nonascii
1124
+ if r3
1125
+ r0 = r3
1126
+ else
1127
+ @index = i0
1128
+ r0 = nil
1129
+ end
1130
+ end
1131
+ end
1132
+
1133
+ node_cache[:nmstart][start_index] = r0
1134
+
1135
+ r0
1136
+ end
1137
+
1138
+ def _nt_nmchar
1139
+ start_index = index
1140
+ if node_cache[:nmchar].has_key?(index)
1141
+ cached = node_cache[:nmchar][index]
1142
+ if cached
1143
+ cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
1144
+ @index = cached.interval.end
1145
+ end
1146
+ return cached
1147
+ end
1148
+
1149
+ i0 = index
1150
+ if has_terminal?('\G[_a-zA-Z0-9-]', true, index)
1151
+ r1 = true
1152
+ @index += 1
1153
+ else
1154
+ r1 = nil
1155
+ end
1156
+ if r1
1157
+ r0 = r1
1158
+ else
1159
+ r2 = _nt_escape
1160
+ if r2
1161
+ r0 = r2
1162
+ else
1163
+ r3 = _nt_nonascii
1164
+ if r3
1165
+ r0 = r3
1166
+ else
1167
+ @index = i0
1168
+ r0 = nil
1169
+ end
1170
+ end
1171
+ end
1172
+
1173
+ node_cache[:nmchar][start_index] = r0
1174
+
1175
+ r0
1176
+ end
1177
+
1178
+ module Escape0
1179
+ end
1180
+
1181
+ def _nt_escape
1182
+ start_index = index
1183
+ if node_cache[:escape].has_key?(index)
1184
+ cached = node_cache[:escape][index]
1185
+ if cached
1186
+ cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
1187
+ @index = cached.interval.end
1188
+ end
1189
+ return cached
1190
+ end
1191
+
1192
+ i0, s0 = index, []
1193
+ if has_terminal?('\G[\\\\]', true, index)
1194
+ r1 = true
1195
+ @index += 1
1196
+ else
1197
+ r1 = nil
1198
+ end
1199
+ s0 << r1
1200
+ if r1
1201
+ if has_terminal?('\G[^\\r\\n\\f0-9a-fA-F]', true, index)
1202
+ r2 = true
1203
+ @index += 1
1204
+ else
1205
+ r2 = nil
1206
+ end
1207
+ s0 << r2
1208
+ end
1209
+ if s0.last
1210
+ r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
1211
+ r0.extend(Escape0)
1212
+ else
1213
+ @index = i0
1214
+ r0 = nil
1215
+ end
1216
+
1217
+ node_cache[:escape][start_index] = r0
1218
+
1219
+ r0
1220
+ end
1221
+
1222
+ def _nt_nonascii
1223
+ start_index = index
1224
+ if node_cache[:nonascii].has_key?(index)
1225
+ cached = node_cache[:nonascii][index]
1226
+ if cached
1227
+ cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
1228
+ @index = cached.interval.end
1229
+ end
1230
+ return cached
1231
+ end
1232
+
1233
+ if has_terminal?('\G[^\\0-0177]', true, index)
1234
+ r0 = instantiate_node(SyntaxNode,input, index...(index + 1))
1235
+ @index += 1
1236
+ else
1237
+ r0 = nil
1238
+ end
1239
+
1240
+ node_cache[:nonascii][start_index] = r0
1241
+
1242
+ r0
1243
+ end
1244
+
1245
+ end
1246
+
1247
+ class SelectorParserParser < Treetop::Runtime::CompiledParser
1248
+ include SelectorParser
1249
+ end
1250
+
1251
+ end