dimus-biodiversity 0.0.1

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.
data/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ Copyright (c) 2007 Tusk-It Contributors See:
2
+ http://code.google.com/p/tuskit/wiki/ProjectContributors
3
+
4
+ Permission is hereby granted, free of charge, to any person obtaining
5
+ a copy of this software and associated documentation files (the
6
+ "Software"), to deal in the Software without restriction, including
7
+ without limitation the rights to use, copy, modify, merge, publish,
8
+ distribute, sublicense, and/or sell copies of the Software, and to
9
+ permit persons to whom the Software is furnished to do so, subject to
10
+ the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be
13
+ included in all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
19
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
20
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
21
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
File without changes
@@ -0,0 +1,24 @@
1
+ dir = File.dirname(__FILE__)
2
+ require 'rubygems'
3
+ require 'rake'
4
+ $LOAD_PATH.unshift(File.join(dir, 'vendor', 'rspec', 'lib'))
5
+ require 'spec/rake/spectask'
6
+
7
+ Gem::manage_gems
8
+ require 'rake/gempackagetask'
9
+
10
+ task :default => :spec
11
+
12
+
13
+ task :tt do
14
+ system("tt #{dir}/lib/biodiversity/parser/scientific_name.treetop")
15
+ end
16
+
17
+ task :files do
18
+ puts FileList["LICENSE", "README.rdoc", "Rakefile", "{spec,lib,bin,doc,examples}/**/*"].to_a.join(' ')
19
+ end
20
+
21
+ Spec::Rake::SpecTask.new do |t|
22
+ t.pattern = 'spec/**/*spec.rb'
23
+ end
24
+
@@ -0,0 +1,28 @@
1
+ #!/usr/bin/env ruby
2
+ require 'rubygems'
3
+ gem 'biodiversity'
4
+
5
+ $LOAD_PATH.unshift(File.expand_path(File.dirname(__FILE__) + "/../lib"))
6
+ require 'biodiversity'
7
+
8
+ if ARGV.empty?
9
+ puts "Usage:\n\nnnparse file_with_scientific_names\n\n"
10
+ exit
11
+ end
12
+
13
+
14
+ parser = ScientificNameParser.new
15
+ debug = true
16
+ # parse a file with names
17
+ count = count2 = 0
18
+ IO.foreach(ARGV[-1]) do |n|
19
+ puts 'started' if count2 == 0 && debug
20
+ count2 += 1
21
+ puts count2.to_s + "/" + count.to_s if count2 % 10000 == 0 && debug
22
+ n.strip!
23
+ unless parser.parse n
24
+ puts n
25
+ count += 1
26
+ end
27
+ end
28
+ puts count.to_s
@@ -0,0 +1,9 @@
1
+ require 'rubygems'
2
+ require 'treetop'
3
+
4
+ dir = File.dirname(__FILE__)
5
+
6
+ BIODIVERSITY_ROOT = File.join(dir, 'biodiversity')
7
+ require File.join(BIODIVERSITY_ROOT, "parser")
8
+
9
+
@@ -0,0 +1,2 @@
1
+ dir = File.dirname(__FILE__)
2
+ require File.join(dir, *%w[parser scientific_name])
@@ -0,0 +1,3403 @@
1
+ module ScientificName
2
+ include Treetop::Runtime
3
+
4
+ def root
5
+ @root || :composite_scientific_name
6
+ end
7
+
8
+ module CompositeScientificName0
9
+ def a
10
+ elements[0]
11
+ end
12
+
13
+ def space
14
+ elements[1]
15
+ end
16
+
17
+ def hybrid_separator
18
+ elements[2]
19
+ end
20
+
21
+ def space
22
+ elements[3]
23
+ end
24
+
25
+ def b
26
+ elements[4]
27
+ end
28
+
29
+ def space
30
+ elements[5]
31
+ end
32
+ end
33
+
34
+ module CompositeScientificName1
35
+ def value
36
+ a.value + " × " + b.value
37
+ end
38
+ def canonical
39
+ a.canonical + " × " + b.canonical
40
+ end
41
+ def details
42
+ {:hybrid => {:scientific_name1 => a.details, :scientific_name2 => b.details}}
43
+ end
44
+ end
45
+
46
+ module CompositeScientificName2
47
+ def a
48
+ elements[0]
49
+ end
50
+
51
+ def space
52
+ elements[1]
53
+ end
54
+
55
+ def hybrid_separator
56
+ elements[2]
57
+ end
58
+
59
+ def space
60
+ elements[3]
61
+ end
62
+
63
+ end
64
+
65
+ module CompositeScientificName3
66
+ def value
67
+ a.value + " × ?"
68
+ end
69
+
70
+ def canonical
71
+ a.canonical
72
+ end
73
+
74
+ def details
75
+ {:hybrid => {:scientific_name1 => a.details, :scientific_name2 => "?"}}
76
+ end
77
+ end
78
+
79
+ def _nt_composite_scientific_name
80
+ start_index = index
81
+ if node_cache[:composite_scientific_name].has_key?(index)
82
+ cached = node_cache[:composite_scientific_name][index]
83
+ @index = cached.interval.end if cached
84
+ return cached
85
+ end
86
+
87
+ i0 = index
88
+ i1, s1 = index, []
89
+ r2 = _nt_scientific_name
90
+ s1 << r2
91
+ if r2
92
+ r3 = _nt_space
93
+ s1 << r3
94
+ if r3
95
+ r4 = _nt_hybrid_separator
96
+ s1 << r4
97
+ if r4
98
+ r5 = _nt_space
99
+ s1 << r5
100
+ if r5
101
+ r6 = _nt_scientific_name
102
+ s1 << r6
103
+ if r6
104
+ r7 = _nt_space
105
+ s1 << r7
106
+ end
107
+ end
108
+ end
109
+ end
110
+ end
111
+ if s1.last
112
+ r1 = (SyntaxNode).new(input, i1...index, s1)
113
+ r1.extend(CompositeScientificName0)
114
+ r1.extend(CompositeScientificName1)
115
+ else
116
+ self.index = i1
117
+ r1 = nil
118
+ end
119
+ if r1
120
+ r0 = r1
121
+ else
122
+ i8, s8 = index, []
123
+ r9 = _nt_scientific_name
124
+ s8 << r9
125
+ if r9
126
+ r10 = _nt_space
127
+ s8 << r10
128
+ if r10
129
+ r11 = _nt_hybrid_separator
130
+ s8 << r11
131
+ if r11
132
+ r12 = _nt_space
133
+ s8 << r12
134
+ if r12
135
+ if input.index(Regexp.new('[\\?]'), index) == index
136
+ r14 = (SyntaxNode).new(input, index...(index + 1))
137
+ @index += 1
138
+ else
139
+ r14 = nil
140
+ end
141
+ if r14
142
+ r13 = r14
143
+ else
144
+ r13 = SyntaxNode.new(input, index...index)
145
+ end
146
+ s8 << r13
147
+ end
148
+ end
149
+ end
150
+ end
151
+ if s8.last
152
+ r8 = (SyntaxNode).new(input, i8...index, s8)
153
+ r8.extend(CompositeScientificName2)
154
+ r8.extend(CompositeScientificName3)
155
+ else
156
+ self.index = i8
157
+ r8 = nil
158
+ end
159
+ if r8
160
+ r0 = r8
161
+ else
162
+ r15 = _nt_scientific_name
163
+ if r15
164
+ r0 = r15
165
+ else
166
+ self.index = i0
167
+ r0 = nil
168
+ end
169
+ end
170
+ end
171
+
172
+ node_cache[:composite_scientific_name][start_index] = r0
173
+
174
+ return r0
175
+ end
176
+
177
+ module ScientificName0
178
+ def space
179
+ elements[0]
180
+ end
181
+
182
+ def a
183
+ elements[1]
184
+ end
185
+
186
+ def space
187
+ elements[2]
188
+ end
189
+
190
+ def b
191
+ elements[3]
192
+ end
193
+
194
+ def space
195
+ elements[4]
196
+ end
197
+
198
+ def c
199
+ elements[5]
200
+ end
201
+
202
+ def space
203
+ elements[6]
204
+ end
205
+ end
206
+
207
+ module ScientificName1
208
+ def value
209
+ a.value + " " + b.value + " " + c.value
210
+ end
211
+ def canonical
212
+ a.canonical
213
+ end
214
+ def details
215
+ a.details.merge(b.details).merge(c.details)
216
+ end
217
+ end
218
+
219
+ module ScientificName2
220
+ def space
221
+ elements[0]
222
+ end
223
+
224
+ def a
225
+ elements[1]
226
+ end
227
+
228
+ def space
229
+ elements[2]
230
+ end
231
+
232
+ def b
233
+ elements[3]
234
+ end
235
+
236
+ def space
237
+ elements[4]
238
+ end
239
+ end
240
+
241
+ module ScientificName3
242
+ def value
243
+ a.value + " " + b.value
244
+ end
245
+ def canonical
246
+ a.canonical
247
+ end
248
+ def details
249
+ a.details.merge(b.details)
250
+ end
251
+ end
252
+
253
+ module ScientificName4
254
+ def space
255
+ elements[0]
256
+ end
257
+
258
+ def a
259
+ elements[1]
260
+ end
261
+
262
+ def space
263
+ elements[2]
264
+ end
265
+
266
+ def b
267
+ elements[3]
268
+ end
269
+
270
+ def space
271
+ elements[4]
272
+ end
273
+ end
274
+
275
+ module ScientificName5
276
+ def value
277
+ a.value + " " + b.value
278
+ end
279
+
280
+ def canonical
281
+ a.canonical
282
+ end
283
+
284
+ def details
285
+ a.details.merge(b.details).merge({:is_valid => false})
286
+ end
287
+ end
288
+
289
+ def _nt_scientific_name
290
+ start_index = index
291
+ if node_cache[:scientific_name].has_key?(index)
292
+ cached = node_cache[:scientific_name][index]
293
+ @index = cached.interval.end if cached
294
+ return cached
295
+ end
296
+
297
+ i0 = index
298
+ i1, s1 = index, []
299
+ r2 = _nt_space
300
+ s1 << r2
301
+ if r2
302
+ r3 = _nt_name_part
303
+ s1 << r3
304
+ if r3
305
+ r4 = _nt_space
306
+ s1 << r4
307
+ if r4
308
+ r5 = _nt_authors_part
309
+ s1 << r5
310
+ if r5
311
+ r6 = _nt_space
312
+ s1 << r6
313
+ if r6
314
+ r7 = _nt_status_part
315
+ s1 << r7
316
+ if r7
317
+ r8 = _nt_space
318
+ s1 << r8
319
+ end
320
+ end
321
+ end
322
+ end
323
+ end
324
+ end
325
+ if s1.last
326
+ r1 = (SyntaxNode).new(input, i1...index, s1)
327
+ r1.extend(ScientificName0)
328
+ r1.extend(ScientificName1)
329
+ else
330
+ self.index = i1
331
+ r1 = nil
332
+ end
333
+ if r1
334
+ r0 = r1
335
+ else
336
+ i9, s9 = index, []
337
+ r10 = _nt_space
338
+ s9 << r10
339
+ if r10
340
+ r11 = _nt_name_part
341
+ s9 << r11
342
+ if r11
343
+ r12 = _nt_space
344
+ s9 << r12
345
+ if r12
346
+ r13 = _nt_authors_part
347
+ s9 << r13
348
+ if r13
349
+ r14 = _nt_space
350
+ s9 << r14
351
+ end
352
+ end
353
+ end
354
+ end
355
+ if s9.last
356
+ r9 = (SyntaxNode).new(input, i9...index, s9)
357
+ r9.extend(ScientificName2)
358
+ r9.extend(ScientificName3)
359
+ else
360
+ self.index = i9
361
+ r9 = nil
362
+ end
363
+ if r9
364
+ r0 = r9
365
+ else
366
+ i15, s15 = index, []
367
+ r16 = _nt_space
368
+ s15 << r16
369
+ if r16
370
+ r17 = _nt_name_part
371
+ s15 << r17
372
+ if r17
373
+ r18 = _nt_space
374
+ s15 << r18
375
+ if r18
376
+ r19 = _nt_year
377
+ s15 << r19
378
+ if r19
379
+ r20 = _nt_space
380
+ s15 << r20
381
+ end
382
+ end
383
+ end
384
+ end
385
+ if s15.last
386
+ r15 = (SyntaxNode).new(input, i15...index, s15)
387
+ r15.extend(ScientificName4)
388
+ r15.extend(ScientificName5)
389
+ else
390
+ self.index = i15
391
+ r15 = nil
392
+ end
393
+ if r15
394
+ r0 = r15
395
+ else
396
+ r21 = _nt_name_part
397
+ if r21
398
+ r0 = r21
399
+ else
400
+ self.index = i0
401
+ r0 = nil
402
+ end
403
+ end
404
+ end
405
+ end
406
+
407
+ node_cache[:scientific_name][start_index] = r0
408
+
409
+ return r0
410
+ end
411
+
412
+ module StatusPart0
413
+ def a
414
+ elements[0]
415
+ end
416
+
417
+ def space
418
+ elements[1]
419
+ end
420
+
421
+ def b
422
+ elements[2]
423
+ end
424
+ end
425
+
426
+ module StatusPart1
427
+ def value
428
+ a.value + " " + b.value
429
+ end
430
+ def details
431
+ {:status => value}
432
+ end
433
+ end
434
+
435
+ def _nt_status_part
436
+ start_index = index
437
+ if node_cache[:status_part].has_key?(index)
438
+ cached = node_cache[:status_part][index]
439
+ @index = cached.interval.end if cached
440
+ return cached
441
+ end
442
+
443
+ i0 = index
444
+ i1, s1 = index, []
445
+ r2 = _nt_status_word
446
+ s1 << r2
447
+ if r2
448
+ r3 = _nt_space
449
+ s1 << r3
450
+ if r3
451
+ r4 = _nt_status_part
452
+ s1 << r4
453
+ end
454
+ end
455
+ if s1.last
456
+ r1 = (SyntaxNode).new(input, i1...index, s1)
457
+ r1.extend(StatusPart0)
458
+ r1.extend(StatusPart1)
459
+ else
460
+ self.index = i1
461
+ r1 = nil
462
+ end
463
+ if r1
464
+ r0 = r1
465
+ else
466
+ r5 = _nt_status_word
467
+ if r5
468
+ r0 = r5
469
+ else
470
+ self.index = i0
471
+ r0 = nil
472
+ end
473
+ end
474
+
475
+ node_cache[:status_part][start_index] = r0
476
+
477
+ return r0
478
+ end
479
+
480
+ module StatusWord0
481
+ def latin_word
482
+ elements[0]
483
+ end
484
+
485
+ end
486
+
487
+ module StatusWord1
488
+ def value
489
+ text_value.strip
490
+ end
491
+ def details
492
+ {:status => value}
493
+ end
494
+ end
495
+
496
+ def _nt_status_word
497
+ start_index = index
498
+ if node_cache[:status_word].has_key?(index)
499
+ cached = node_cache[:status_word][index]
500
+ @index = cached.interval.end if cached
501
+ return cached
502
+ end
503
+
504
+ i0 = index
505
+ i1, s1 = index, []
506
+ r2 = _nt_latin_word
507
+ s1 << r2
508
+ if r2
509
+ if input.index(Regexp.new('[\\.]'), index) == index
510
+ r3 = (SyntaxNode).new(input, index...(index + 1))
511
+ @index += 1
512
+ else
513
+ r3 = nil
514
+ end
515
+ s1 << r3
516
+ end
517
+ if s1.last
518
+ r1 = (SyntaxNode).new(input, i1...index, s1)
519
+ r1.extend(StatusWord0)
520
+ r1.extend(StatusWord1)
521
+ else
522
+ self.index = i1
523
+ r1 = nil
524
+ end
525
+ if r1
526
+ r0 = r1
527
+ else
528
+ r4 = _nt_latin_word
529
+ if r4
530
+ r0 = r4
531
+ else
532
+ self.index = i0
533
+ r0 = nil
534
+ end
535
+ end
536
+
537
+ node_cache[:status_word][start_index] = r0
538
+
539
+ return r0
540
+ end
541
+
542
+ module AuthorsPart0
543
+ def a
544
+ elements[0]
545
+ end
546
+
547
+ def space
548
+ elements[1]
549
+ end
550
+
551
+ def b
552
+ elements[2]
553
+ end
554
+ end
555
+
556
+ module AuthorsPart1
557
+ def value
558
+ a.value + " " + b.value
559
+ end
560
+
561
+ def details
562
+ a.details.merge(b.details)
563
+ end
564
+ end
565
+
566
+ module AuthorsPart2
567
+ def a
568
+ elements[0]
569
+ end
570
+
571
+ def space
572
+ elements[1]
573
+ end
574
+
575
+ def space
576
+ elements[3]
577
+ end
578
+
579
+ def b
580
+ elements[4]
581
+ end
582
+ end
583
+
584
+ module AuthorsPart3
585
+ def value
586
+ a.value + " ex " + b.value
587
+ end
588
+
589
+ def details
590
+ {:revised_name_authors => {:revised_authors => a.details[:authors], :authors => b.details[:authors]}}
591
+ end
592
+ end
593
+
594
+ module AuthorsPart4
595
+ def a
596
+ elements[0]
597
+ end
598
+
599
+ def space
600
+ elements[1]
601
+ end
602
+
603
+ def b
604
+ elements[2]
605
+ end
606
+ end
607
+
608
+ module AuthorsPart5
609
+ def value
610
+ a.value + " " + b.value
611
+ end
612
+ def details
613
+ a.details.merge(b.details)
614
+ end
615
+ end
616
+
617
+ def _nt_authors_part
618
+ start_index = index
619
+ if node_cache[:authors_part].has_key?(index)
620
+ cached = node_cache[:authors_part][index]
621
+ @index = cached.interval.end if cached
622
+ return cached
623
+ end
624
+
625
+ i0 = index
626
+ i1, s1 = index, []
627
+ r2 = _nt_original_authors_revised_name
628
+ s1 << r2
629
+ if r2
630
+ r3 = _nt_space
631
+ s1 << r3
632
+ if r3
633
+ r4 = _nt_authors_revised_name
634
+ s1 << r4
635
+ end
636
+ end
637
+ if s1.last
638
+ r1 = (SyntaxNode).new(input, i1...index, s1)
639
+ r1.extend(AuthorsPart0)
640
+ r1.extend(AuthorsPart1)
641
+ else
642
+ self.index = i1
643
+ r1 = nil
644
+ end
645
+ if r1
646
+ r0 = r1
647
+ else
648
+ i5, s5 = index, []
649
+ r6 = _nt_simple_authors_part
650
+ s5 << r6
651
+ if r6
652
+ r7 = _nt_space
653
+ s5 << r7
654
+ if r7
655
+ if input.index("ex", index) == index
656
+ r8 = (SyntaxNode).new(input, index...(index + 2))
657
+ @index += 2
658
+ else
659
+ terminal_parse_failure("ex")
660
+ r8 = nil
661
+ end
662
+ s5 << r8
663
+ if r8
664
+ r9 = _nt_space
665
+ s5 << r9
666
+ if r9
667
+ r10 = _nt_simple_authors_part
668
+ s5 << r10
669
+ end
670
+ end
671
+ end
672
+ end
673
+ if s5.last
674
+ r5 = (SyntaxNode).new(input, i5...index, s5)
675
+ r5.extend(AuthorsPart2)
676
+ r5.extend(AuthorsPart3)
677
+ else
678
+ self.index = i5
679
+ r5 = nil
680
+ end
681
+ if r5
682
+ r0 = r5
683
+ else
684
+ i11, s11 = index, []
685
+ r12 = _nt_original_authors_revised_name
686
+ s11 << r12
687
+ if r12
688
+ r13 = _nt_space
689
+ s11 << r13
690
+ if r13
691
+ r14 = _nt_authors_names_full
692
+ s11 << r14
693
+ end
694
+ end
695
+ if s11.last
696
+ r11 = (SyntaxNode).new(input, i11...index, s11)
697
+ r11.extend(AuthorsPart4)
698
+ r11.extend(AuthorsPart5)
699
+ else
700
+ self.index = i11
701
+ r11 = nil
702
+ end
703
+ if r11
704
+ r0 = r11
705
+ else
706
+ r15 = _nt_authors_revised_name
707
+ if r15
708
+ r0 = r15
709
+ else
710
+ r16 = _nt_original_authors_revised_name
711
+ if r16
712
+ r0 = r16
713
+ else
714
+ r17 = _nt_simple_authors_part
715
+ if r17
716
+ r0 = r17
717
+ else
718
+ self.index = i0
719
+ r0 = nil
720
+ end
721
+ end
722
+ end
723
+ end
724
+ end
725
+ end
726
+
727
+ node_cache[:authors_part][start_index] = r0
728
+
729
+ return r0
730
+ end
731
+
732
+ module SimpleAuthorsPart0
733
+ def a
734
+ elements[0]
735
+ end
736
+
737
+ def space
738
+ elements[1]
739
+ end
740
+
741
+ def b
742
+ elements[2]
743
+ end
744
+ end
745
+
746
+ module SimpleAuthorsPart1
747
+ def value
748
+ a.value + " " + b.value
749
+ end
750
+ def details
751
+ a.details.merge(b.details)
752
+ end
753
+ end
754
+
755
+ def _nt_simple_authors_part
756
+ start_index = index
757
+ if node_cache[:simple_authors_part].has_key?(index)
758
+ cached = node_cache[:simple_authors_part][index]
759
+ @index = cached.interval.end if cached
760
+ return cached
761
+ end
762
+
763
+ i0 = index
764
+ i1, s1 = index, []
765
+ r2 = _nt_original_authors_names_full
766
+ s1 << r2
767
+ if r2
768
+ r3 = _nt_space
769
+ s1 << r3
770
+ if r3
771
+ r4 = _nt_authors_names_full
772
+ s1 << r4
773
+ end
774
+ end
775
+ if s1.last
776
+ r1 = (SyntaxNode).new(input, i1...index, s1)
777
+ r1.extend(SimpleAuthorsPart0)
778
+ r1.extend(SimpleAuthorsPart1)
779
+ else
780
+ self.index = i1
781
+ r1 = nil
782
+ end
783
+ if r1
784
+ r0 = r1
785
+ else
786
+ r5 = _nt_original_authors_names_full
787
+ if r5
788
+ r0 = r5
789
+ else
790
+ r6 = _nt_authors_names_full
791
+ if r6
792
+ r0 = r6
793
+ else
794
+ self.index = i0
795
+ r0 = nil
796
+ end
797
+ end
798
+ end
799
+
800
+ node_cache[:simple_authors_part][start_index] = r0
801
+
802
+ return r0
803
+ end
804
+
805
+ module OriginalAuthorsNamesFull0
806
+ def space
807
+ elements[1]
808
+ end
809
+
810
+ def a
811
+ elements[2]
812
+ end
813
+
814
+ def space
815
+ elements[3]
816
+ end
817
+
818
+ end
819
+
820
+ module OriginalAuthorsNamesFull1
821
+ def value
822
+ "(" + a.value + ")"
823
+ end
824
+ def details
825
+ {:orig_authors => a.details[:authors]}
826
+ end
827
+ end
828
+
829
+ def _nt_original_authors_names_full
830
+ start_index = index
831
+ if node_cache[:original_authors_names_full].has_key?(index)
832
+ cached = node_cache[:original_authors_names_full][index]
833
+ @index = cached.interval.end if cached
834
+ return cached
835
+ end
836
+
837
+ i0, s0 = index, []
838
+ if input.index("(", index) == index
839
+ r1 = (SyntaxNode).new(input, index...(index + 1))
840
+ @index += 1
841
+ else
842
+ terminal_parse_failure("(")
843
+ r1 = nil
844
+ end
845
+ s0 << r1
846
+ if r1
847
+ r2 = _nt_space
848
+ s0 << r2
849
+ if r2
850
+ r3 = _nt_authors_names_full
851
+ s0 << r3
852
+ if r3
853
+ r4 = _nt_space
854
+ s0 << r4
855
+ if r4
856
+ if input.index(")", index) == index
857
+ r5 = (SyntaxNode).new(input, index...(index + 1))
858
+ @index += 1
859
+ else
860
+ terminal_parse_failure(")")
861
+ r5 = nil
862
+ end
863
+ s0 << r5
864
+ end
865
+ end
866
+ end
867
+ end
868
+ if s0.last
869
+ r0 = (SyntaxNode).new(input, i0...index, s0)
870
+ r0.extend(OriginalAuthorsNamesFull0)
871
+ r0.extend(OriginalAuthorsNamesFull1)
872
+ else
873
+ self.index = i0
874
+ r0 = nil
875
+ end
876
+
877
+ node_cache[:original_authors_names_full][start_index] = r0
878
+
879
+ return r0
880
+ end
881
+
882
+ module OriginalAuthorsRevisedName0
883
+ def space
884
+ elements[1]
885
+ end
886
+
887
+ def a
888
+ elements[2]
889
+ end
890
+
891
+ def space
892
+ elements[3]
893
+ end
894
+
895
+ end
896
+
897
+ module OriginalAuthorsRevisedName1
898
+ def value
899
+ "(" + a.value + ")"
900
+ end
901
+
902
+ def details
903
+ {:original_revised_name_authors => a.details[:revised_name_authors]}
904
+ end
905
+ end
906
+
907
+ def _nt_original_authors_revised_name
908
+ start_index = index
909
+ if node_cache[:original_authors_revised_name].has_key?(index)
910
+ cached = node_cache[:original_authors_revised_name][index]
911
+ @index = cached.interval.end if cached
912
+ return cached
913
+ end
914
+
915
+ i0, s0 = index, []
916
+ if input.index("(", index) == index
917
+ r1 = (SyntaxNode).new(input, index...(index + 1))
918
+ @index += 1
919
+ else
920
+ terminal_parse_failure("(")
921
+ r1 = nil
922
+ end
923
+ s0 << r1
924
+ if r1
925
+ r2 = _nt_space
926
+ s0 << r2
927
+ if r2
928
+ r3 = _nt_authors_revised_name
929
+ s0 << r3
930
+ if r3
931
+ r4 = _nt_space
932
+ s0 << r4
933
+ if r4
934
+ if input.index(")", index) == index
935
+ r5 = (SyntaxNode).new(input, index...(index + 1))
936
+ @index += 1
937
+ else
938
+ terminal_parse_failure(")")
939
+ r5 = nil
940
+ end
941
+ s0 << r5
942
+ end
943
+ end
944
+ end
945
+ end
946
+ if s0.last
947
+ r0 = (SyntaxNode).new(input, i0...index, s0)
948
+ r0.extend(OriginalAuthorsRevisedName0)
949
+ r0.extend(OriginalAuthorsRevisedName1)
950
+ else
951
+ self.index = i0
952
+ r0 = nil
953
+ end
954
+
955
+ node_cache[:original_authors_revised_name][start_index] = r0
956
+
957
+ return r0
958
+ end
959
+
960
+ module AuthorsRevisedName0
961
+ def a
962
+ elements[0]
963
+ end
964
+
965
+ def space
966
+ elements[1]
967
+ end
968
+
969
+ def space
970
+ elements[3]
971
+ end
972
+
973
+ def b
974
+ elements[4]
975
+ end
976
+ end
977
+
978
+ module AuthorsRevisedName1
979
+ def value
980
+ a.value + " ex " + b.value
981
+ end
982
+ def details
983
+ {:revised_name_authors =>{:revised_authors => a.details[:authors], :authors => b.details[:authors]}}
984
+ end
985
+ end
986
+
987
+ def _nt_authors_revised_name
988
+ start_index = index
989
+ if node_cache[:authors_revised_name].has_key?(index)
990
+ cached = node_cache[:authors_revised_name][index]
991
+ @index = cached.interval.end if cached
992
+ return cached
993
+ end
994
+
995
+ i0, s0 = index, []
996
+ r1 = _nt_authors_names_full
997
+ s0 << r1
998
+ if r1
999
+ r2 = _nt_space
1000
+ s0 << r2
1001
+ if r2
1002
+ if input.index("ex", index) == index
1003
+ r3 = (SyntaxNode).new(input, index...(index + 2))
1004
+ @index += 2
1005
+ else
1006
+ terminal_parse_failure("ex")
1007
+ r3 = nil
1008
+ end
1009
+ s0 << r3
1010
+ if r3
1011
+ r4 = _nt_space
1012
+ s0 << r4
1013
+ if r4
1014
+ r5 = _nt_authors_names_full
1015
+ s0 << r5
1016
+ end
1017
+ end
1018
+ end
1019
+ end
1020
+ if s0.last
1021
+ r0 = (SyntaxNode).new(input, i0...index, s0)
1022
+ r0.extend(AuthorsRevisedName0)
1023
+ r0.extend(AuthorsRevisedName1)
1024
+ else
1025
+ self.index = i0
1026
+ r0 = nil
1027
+ end
1028
+
1029
+ node_cache[:authors_revised_name][start_index] = r0
1030
+
1031
+ return r0
1032
+ end
1033
+
1034
+ module AuthorsNamesFull0
1035
+ def a
1036
+ elements[0]
1037
+ end
1038
+
1039
+ def space
1040
+ elements[1]
1041
+ end
1042
+
1043
+ def space
1044
+ elements[3]
1045
+ end
1046
+
1047
+ def b
1048
+ elements[4]
1049
+ end
1050
+ end
1051
+
1052
+ module AuthorsNamesFull1
1053
+ def value
1054
+ a.value + " " + b.value
1055
+ end
1056
+ def details
1057
+ {:authors => {:names => a.details[:authors][:names]}.merge(b.details)}
1058
+ end
1059
+ end
1060
+
1061
+ def _nt_authors_names_full
1062
+ start_index = index
1063
+ if node_cache[:authors_names_full].has_key?(index)
1064
+ cached = node_cache[:authors_names_full][index]
1065
+ @index = cached.interval.end if cached
1066
+ return cached
1067
+ end
1068
+
1069
+ i0 = index
1070
+ i1, s1 = index, []
1071
+ r2 = _nt_authors_names
1072
+ s1 << r2
1073
+ if r2
1074
+ r3 = _nt_space
1075
+ s1 << r3
1076
+ if r3
1077
+ if input.index(Regexp.new('[,]'), index) == index
1078
+ r5 = (SyntaxNode).new(input, index...(index + 1))
1079
+ @index += 1
1080
+ else
1081
+ r5 = nil
1082
+ end
1083
+ if r5
1084
+ r4 = r5
1085
+ else
1086
+ r4 = SyntaxNode.new(input, index...index)
1087
+ end
1088
+ s1 << r4
1089
+ if r4
1090
+ r6 = _nt_space
1091
+ s1 << r6
1092
+ if r6
1093
+ r7 = _nt_year
1094
+ s1 << r7
1095
+ end
1096
+ end
1097
+ end
1098
+ end
1099
+ if s1.last
1100
+ r1 = (SyntaxNode).new(input, i1...index, s1)
1101
+ r1.extend(AuthorsNamesFull0)
1102
+ r1.extend(AuthorsNamesFull1)
1103
+ else
1104
+ self.index = i1
1105
+ r1 = nil
1106
+ end
1107
+ if r1
1108
+ r0 = r1
1109
+ else
1110
+ r8 = _nt_authors_names
1111
+ if r8
1112
+ r0 = r8
1113
+ else
1114
+ self.index = i0
1115
+ r0 = nil
1116
+ end
1117
+ end
1118
+
1119
+ node_cache[:authors_names_full][start_index] = r0
1120
+
1121
+ return r0
1122
+ end
1123
+
1124
+ module AuthorsNames0
1125
+ def a
1126
+ elements[0]
1127
+ end
1128
+
1129
+ def space
1130
+ elements[1]
1131
+ end
1132
+
1133
+ def sep
1134
+ elements[2]
1135
+ end
1136
+
1137
+ def space
1138
+ elements[3]
1139
+ end
1140
+
1141
+ def b
1142
+ elements[4]
1143
+ end
1144
+ end
1145
+
1146
+ module AuthorsNames1
1147
+ def value
1148
+ sep.apply(a,b)
1149
+ end
1150
+
1151
+ def details
1152
+ sep.details(a,b)
1153
+ end
1154
+ end
1155
+
1156
+ def _nt_authors_names
1157
+ start_index = index
1158
+ if node_cache[:authors_names].has_key?(index)
1159
+ cached = node_cache[:authors_names][index]
1160
+ @index = cached.interval.end if cached
1161
+ return cached
1162
+ end
1163
+
1164
+ i0 = index
1165
+ i1, s1 = index, []
1166
+ r2 = _nt_author_name
1167
+ s1 << r2
1168
+ if r2
1169
+ r3 = _nt_space
1170
+ s1 << r3
1171
+ if r3
1172
+ r4 = _nt_author_name_separator
1173
+ s1 << r4
1174
+ if r4
1175
+ r5 = _nt_space
1176
+ s1 << r5
1177
+ if r5
1178
+ r6 = _nt_authors_names
1179
+ s1 << r6
1180
+ end
1181
+ end
1182
+ end
1183
+ end
1184
+ if s1.last
1185
+ r1 = (SyntaxNode).new(input, i1...index, s1)
1186
+ r1.extend(AuthorsNames0)
1187
+ r1.extend(AuthorsNames1)
1188
+ else
1189
+ self.index = i1
1190
+ r1 = nil
1191
+ end
1192
+ if r1
1193
+ r0 = r1
1194
+ else
1195
+ r7 = _nt_author_name
1196
+ if r7
1197
+ r0 = r7
1198
+ else
1199
+ self.index = i0
1200
+ r0 = nil
1201
+ end
1202
+ end
1203
+
1204
+ node_cache[:authors_names][start_index] = r0
1205
+
1206
+ return r0
1207
+ end
1208
+
1209
+ module AuthorNameSeparator0
1210
+ def apply(a,b)
1211
+ a.value + " " + text_value + " " + b.value
1212
+ end
1213
+
1214
+ def details(a,b)
1215
+ {:authors => {:names => a.details[:authors][:names] + b.details[:authors][:names]}}
1216
+ end
1217
+ end
1218
+
1219
+ def _nt_author_name_separator
1220
+ start_index = index
1221
+ if node_cache[:author_name_separator].has_key?(index)
1222
+ cached = node_cache[:author_name_separator][index]
1223
+ @index = cached.interval.end if cached
1224
+ return cached
1225
+ end
1226
+
1227
+ i0 = index
1228
+ if input.index("&", index) == index
1229
+ r1 = (SyntaxNode).new(input, index...(index + 1))
1230
+ @index += 1
1231
+ else
1232
+ terminal_parse_failure("&")
1233
+ r1 = nil
1234
+ end
1235
+ if r1
1236
+ r0 = r1
1237
+ r0.extend(AuthorNameSeparator0)
1238
+ else
1239
+ if input.index(",", index) == index
1240
+ r2 = (SyntaxNode).new(input, index...(index + 1))
1241
+ @index += 1
1242
+ else
1243
+ terminal_parse_failure(",")
1244
+ r2 = nil
1245
+ end
1246
+ if r2
1247
+ r0 = r2
1248
+ r0.extend(AuthorNameSeparator0)
1249
+ else
1250
+ self.index = i0
1251
+ r0 = nil
1252
+ end
1253
+ end
1254
+
1255
+ node_cache[:author_name_separator][start_index] = r0
1256
+
1257
+ return r0
1258
+ end
1259
+
1260
+ module AuthorName0
1261
+ def space
1262
+ elements[0]
1263
+ end
1264
+
1265
+ def a
1266
+ elements[1]
1267
+ end
1268
+
1269
+ def space
1270
+ elements[2]
1271
+ end
1272
+
1273
+ def b
1274
+ elements[3]
1275
+ end
1276
+
1277
+ def space
1278
+ elements[4]
1279
+ end
1280
+ end
1281
+
1282
+ module AuthorName1
1283
+ def value
1284
+ a.value + " " + b.value
1285
+ end
1286
+
1287
+ def details
1288
+ {:authors => {:names => [value]}}
1289
+ end
1290
+ end
1291
+
1292
+ def _nt_author_name
1293
+ start_index = index
1294
+ if node_cache[:author_name].has_key?(index)
1295
+ cached = node_cache[:author_name][index]
1296
+ @index = cached.interval.end if cached
1297
+ return cached
1298
+ end
1299
+
1300
+ i0 = index
1301
+ i1, s1 = index, []
1302
+ r2 = _nt_space
1303
+ s1 << r2
1304
+ if r2
1305
+ r3 = _nt_author_word
1306
+ s1 << r3
1307
+ if r3
1308
+ r4 = _nt_space
1309
+ s1 << r4
1310
+ if r4
1311
+ r5 = _nt_author_name
1312
+ s1 << r5
1313
+ if r5
1314
+ r6 = _nt_space
1315
+ s1 << r6
1316
+ end
1317
+ end
1318
+ end
1319
+ end
1320
+ if s1.last
1321
+ r1 = (SyntaxNode).new(input, i1...index, s1)
1322
+ r1.extend(AuthorName0)
1323
+ r1.extend(AuthorName1)
1324
+ else
1325
+ self.index = i1
1326
+ r1 = nil
1327
+ end
1328
+ if r1
1329
+ r0 = r1
1330
+ else
1331
+ r7 = _nt_author_word
1332
+ if r7
1333
+ r0 = r7
1334
+ else
1335
+ self.index = i0
1336
+ r0 = nil
1337
+ end
1338
+ end
1339
+
1340
+ node_cache[:author_name][start_index] = r0
1341
+
1342
+ return r0
1343
+ end
1344
+
1345
+ module AuthorWord0
1346
+ def value
1347
+ text_value.strip
1348
+ end
1349
+ def details
1350
+ {:authors => {:names => [value]}}
1351
+ end
1352
+ end
1353
+
1354
+ module AuthorWord1
1355
+ end
1356
+
1357
+ module AuthorWord2
1358
+ def value
1359
+ text_value.gsub(/\s+/, " ").strip
1360
+ end
1361
+ def details
1362
+ {:authors => {:names => [value]}}
1363
+ end
1364
+ end
1365
+
1366
+ def _nt_author_word
1367
+ start_index = index
1368
+ if node_cache[:author_word].has_key?(index)
1369
+ cached = node_cache[:author_word][index]
1370
+ @index = cached.interval.end if cached
1371
+ return cached
1372
+ end
1373
+
1374
+ i0 = index
1375
+ if input.index("A S. Xu", index) == index
1376
+ r1 = (SyntaxNode).new(input, index...(index + 7))
1377
+ @index += 7
1378
+ else
1379
+ terminal_parse_failure("A S. Xu")
1380
+ r1 = nil
1381
+ end
1382
+ if r1
1383
+ r0 = r1
1384
+ else
1385
+ i2 = index
1386
+ if input.index("anon.", index) == index
1387
+ r3 = (SyntaxNode).new(input, index...(index + 5))
1388
+ @index += 5
1389
+ else
1390
+ terminal_parse_failure("anon.")
1391
+ r3 = nil
1392
+ end
1393
+ if r3
1394
+ r2 = r3
1395
+ r2.extend(AuthorWord0)
1396
+ else
1397
+ if input.index("f.", index) == index
1398
+ r4 = (SyntaxNode).new(input, index...(index + 2))
1399
+ @index += 2
1400
+ else
1401
+ terminal_parse_failure("f.")
1402
+ r4 = nil
1403
+ end
1404
+ if r4
1405
+ r2 = r4
1406
+ r2.extend(AuthorWord0)
1407
+ else
1408
+ if input.index("bis", index) == index
1409
+ r5 = (SyntaxNode).new(input, index...(index + 3))
1410
+ @index += 3
1411
+ else
1412
+ terminal_parse_failure("bis")
1413
+ r5 = nil
1414
+ end
1415
+ if r5
1416
+ r2 = r5
1417
+ r2.extend(AuthorWord0)
1418
+ else
1419
+ if input.index("arg.", index) == index
1420
+ r6 = (SyntaxNode).new(input, index...(index + 4))
1421
+ @index += 4
1422
+ else
1423
+ terminal_parse_failure("arg.")
1424
+ r6 = nil
1425
+ end
1426
+ if r6
1427
+ r2 = r6
1428
+ r2.extend(AuthorWord0)
1429
+ else
1430
+ if input.index("da", index) == index
1431
+ r7 = (SyntaxNode).new(input, index...(index + 2))
1432
+ @index += 2
1433
+ else
1434
+ terminal_parse_failure("da")
1435
+ r7 = nil
1436
+ end
1437
+ if r7
1438
+ r2 = r7
1439
+ r2.extend(AuthorWord0)
1440
+ else
1441
+ if input.index("der", index) == index
1442
+ r8 = (SyntaxNode).new(input, index...(index + 3))
1443
+ @index += 3
1444
+ else
1445
+ terminal_parse_failure("der")
1446
+ r8 = nil
1447
+ end
1448
+ if r8
1449
+ r2 = r8
1450
+ r2.extend(AuthorWord0)
1451
+ else
1452
+ if input.index("den", index) == index
1453
+ r9 = (SyntaxNode).new(input, index...(index + 3))
1454
+ @index += 3
1455
+ else
1456
+ terminal_parse_failure("den")
1457
+ r9 = nil
1458
+ end
1459
+ if r9
1460
+ r2 = r9
1461
+ r2.extend(AuthorWord0)
1462
+ else
1463
+ if input.index("de", index) == index
1464
+ r10 = (SyntaxNode).new(input, index...(index + 2))
1465
+ @index += 2
1466
+ else
1467
+ terminal_parse_failure("de")
1468
+ r10 = nil
1469
+ end
1470
+ if r10
1471
+ r2 = r10
1472
+ r2.extend(AuthorWord0)
1473
+ else
1474
+ if input.index("du", index) == index
1475
+ r11 = (SyntaxNode).new(input, index...(index + 2))
1476
+ @index += 2
1477
+ else
1478
+ terminal_parse_failure("du")
1479
+ r11 = nil
1480
+ end
1481
+ if r11
1482
+ r2 = r11
1483
+ r2.extend(AuthorWord0)
1484
+ else
1485
+ if input.index("la", index) == index
1486
+ r12 = (SyntaxNode).new(input, index...(index + 2))
1487
+ @index += 2
1488
+ else
1489
+ terminal_parse_failure("la")
1490
+ r12 = nil
1491
+ end
1492
+ if r12
1493
+ r2 = r12
1494
+ r2.extend(AuthorWord0)
1495
+ else
1496
+ if input.index("ter", index) == index
1497
+ r13 = (SyntaxNode).new(input, index...(index + 3))
1498
+ @index += 3
1499
+ else
1500
+ terminal_parse_failure("ter")
1501
+ r13 = nil
1502
+ end
1503
+ if r13
1504
+ r2 = r13
1505
+ r2.extend(AuthorWord0)
1506
+ else
1507
+ if input.index("van", index) == index
1508
+ r14 = (SyntaxNode).new(input, index...(index + 3))
1509
+ @index += 3
1510
+ else
1511
+ terminal_parse_failure("van")
1512
+ r14 = nil
1513
+ end
1514
+ if r14
1515
+ r2 = r14
1516
+ r2.extend(AuthorWord0)
1517
+ else
1518
+ if input.index("et al.\{\?\}", index) == index
1519
+ r15 = (SyntaxNode).new(input, index...(index + 9))
1520
+ @index += 9
1521
+ else
1522
+ terminal_parse_failure("et al.\{\?\}")
1523
+ r15 = nil
1524
+ end
1525
+ if r15
1526
+ r2 = r15
1527
+ r2.extend(AuthorWord0)
1528
+ else
1529
+ if input.index("et al.", index) == index
1530
+ r16 = (SyntaxNode).new(input, index...(index + 6))
1531
+ @index += 6
1532
+ else
1533
+ terminal_parse_failure("et al.")
1534
+ r16 = nil
1535
+ end
1536
+ if r16
1537
+ r2 = r16
1538
+ r2.extend(AuthorWord0)
1539
+ else
1540
+ self.index = i2
1541
+ r2 = nil
1542
+ end
1543
+ end
1544
+ end
1545
+ end
1546
+ end
1547
+ end
1548
+ end
1549
+ end
1550
+ end
1551
+ end
1552
+ end
1553
+ end
1554
+ end
1555
+ end
1556
+ if r2
1557
+ r0 = r2
1558
+ else
1559
+ i17, s17 = index, []
1560
+ i18 = index
1561
+ if input.index("Å", index) == index
1562
+ r19 = (SyntaxNode).new(input, index...(index + 2))
1563
+ @index += 2
1564
+ else
1565
+ terminal_parse_failure("Å")
1566
+ r19 = nil
1567
+ end
1568
+ if r19
1569
+ r18 = r19
1570
+ else
1571
+ if input.index("Ö", index) == index
1572
+ r20 = (SyntaxNode).new(input, index...(index + 2))
1573
+ @index += 2
1574
+ else
1575
+ terminal_parse_failure("Ö")
1576
+ r20 = nil
1577
+ end
1578
+ if r20
1579
+ r18 = r20
1580
+ else
1581
+ if input.index("Á", index) == index
1582
+ r21 = (SyntaxNode).new(input, index...(index + 2))
1583
+ @index += 2
1584
+ else
1585
+ terminal_parse_failure("Á")
1586
+ r21 = nil
1587
+ end
1588
+ if r21
1589
+ r18 = r21
1590
+ else
1591
+ if input.index("Ø", index) == index
1592
+ r22 = (SyntaxNode).new(input, index...(index + 2))
1593
+ @index += 2
1594
+ else
1595
+ terminal_parse_failure("Ø")
1596
+ r22 = nil
1597
+ end
1598
+ if r22
1599
+ r18 = r22
1600
+ else
1601
+ if input.index("Ô", index) == index
1602
+ r23 = (SyntaxNode).new(input, index...(index + 2))
1603
+ @index += 2
1604
+ else
1605
+ terminal_parse_failure("Ô")
1606
+ r23 = nil
1607
+ end
1608
+ if r23
1609
+ r18 = r23
1610
+ else
1611
+ if input.index("Š", index) == index
1612
+ r24 = (SyntaxNode).new(input, index...(index + 2))
1613
+ @index += 2
1614
+ else
1615
+ terminal_parse_failure("Š")
1616
+ r24 = nil
1617
+ end
1618
+ if r24
1619
+ r18 = r24
1620
+ else
1621
+ if input.index("Ś", index) == index
1622
+ r25 = (SyntaxNode).new(input, index...(index + 2))
1623
+ @index += 2
1624
+ else
1625
+ terminal_parse_failure("Ś")
1626
+ r25 = nil
1627
+ end
1628
+ if r25
1629
+ r18 = r25
1630
+ else
1631
+ if input.index("Č", index) == index
1632
+ r26 = (SyntaxNode).new(input, index...(index + 2))
1633
+ @index += 2
1634
+ else
1635
+ terminal_parse_failure("Č")
1636
+ r26 = nil
1637
+ end
1638
+ if r26
1639
+ r18 = r26
1640
+ else
1641
+ if input.index("Ķ", index) == index
1642
+ r27 = (SyntaxNode).new(input, index...(index + 2))
1643
+ @index += 2
1644
+ else
1645
+ terminal_parse_failure("Ķ")
1646
+ r27 = nil
1647
+ end
1648
+ if r27
1649
+ r18 = r27
1650
+ else
1651
+ if input.index("Ł", index) == index
1652
+ r28 = (SyntaxNode).new(input, index...(index + 2))
1653
+ @index += 2
1654
+ else
1655
+ terminal_parse_failure("Ł")
1656
+ r28 = nil
1657
+ end
1658
+ if r28
1659
+ r18 = r28
1660
+ else
1661
+ if input.index("É", index) == index
1662
+ r29 = (SyntaxNode).new(input, index...(index + 2))
1663
+ @index += 2
1664
+ else
1665
+ terminal_parse_failure("É")
1666
+ r29 = nil
1667
+ end
1668
+ if r29
1669
+ r18 = r29
1670
+ else
1671
+ if input.index("Ž", index) == index
1672
+ r30 = (SyntaxNode).new(input, index...(index + 2))
1673
+ @index += 2
1674
+ else
1675
+ terminal_parse_failure("Ž")
1676
+ r30 = nil
1677
+ end
1678
+ if r30
1679
+ r18 = r30
1680
+ else
1681
+ if input.index(Regexp.new('[A-Z]'), index) == index
1682
+ r31 = (SyntaxNode).new(input, index...(index + 1))
1683
+ @index += 1
1684
+ else
1685
+ r31 = nil
1686
+ end
1687
+ if r31
1688
+ r18 = r31
1689
+ else
1690
+ self.index = i18
1691
+ r18 = nil
1692
+ end
1693
+ end
1694
+ end
1695
+ end
1696
+ end
1697
+ end
1698
+ end
1699
+ end
1700
+ end
1701
+ end
1702
+ end
1703
+ end
1704
+ end
1705
+ s17 << r18
1706
+ if r18
1707
+ s32, i32 = [], index
1708
+ loop do
1709
+ if input.index(Regexp.new('[^0-9()\\s&,]'), index) == index
1710
+ r33 = (SyntaxNode).new(input, index...(index + 1))
1711
+ @index += 1
1712
+ else
1713
+ r33 = nil
1714
+ end
1715
+ if r33
1716
+ s32 << r33
1717
+ else
1718
+ break
1719
+ end
1720
+ end
1721
+ if s32.empty?
1722
+ self.index = i32
1723
+ r32 = nil
1724
+ else
1725
+ r32 = SyntaxNode.new(input, i32...index, s32)
1726
+ end
1727
+ s17 << r32
1728
+ end
1729
+ if s17.last
1730
+ r17 = (SyntaxNode).new(input, i17...index, s17)
1731
+ r17.extend(AuthorWord1)
1732
+ r17.extend(AuthorWord2)
1733
+ else
1734
+ self.index = i17
1735
+ r17 = nil
1736
+ end
1737
+ if r17
1738
+ r0 = r17
1739
+ else
1740
+ self.index = i0
1741
+ r0 = nil
1742
+ end
1743
+ end
1744
+ end
1745
+
1746
+ node_cache[:author_word][start_index] = r0
1747
+
1748
+ return r0
1749
+ end
1750
+
1751
+ module NamePart0
1752
+ def space
1753
+ elements[0]
1754
+ end
1755
+
1756
+ def a
1757
+ elements[1]
1758
+ end
1759
+
1760
+ def space
1761
+ elements[2]
1762
+ end
1763
+
1764
+ def b
1765
+ elements[3]
1766
+ end
1767
+
1768
+ def space_hard
1769
+ elements[4]
1770
+ end
1771
+
1772
+ def c
1773
+ elements[5]
1774
+ end
1775
+ end
1776
+
1777
+ module NamePart1
1778
+ def value
1779
+ a.value + " " + b.value + " " + c.value
1780
+ end
1781
+ def canonical
1782
+ a.canonical
1783
+ end
1784
+ def details
1785
+ a.details.merge(b.details).merge(c.details)
1786
+ end
1787
+ end
1788
+
1789
+ module NamePart2
1790
+ def space
1791
+ elements[0]
1792
+ end
1793
+
1794
+ def a
1795
+ elements[1]
1796
+ end
1797
+
1798
+ def space
1799
+ elements[2]
1800
+ end
1801
+
1802
+ def b
1803
+ elements[3]
1804
+ end
1805
+ end
1806
+
1807
+ module NamePart3
1808
+ def value
1809
+ a.value + b.value
1810
+ end
1811
+ def canonical
1812
+ a.canonical + b.canonical
1813
+ end
1814
+
1815
+ def details
1816
+ a.details.merge(b.details)
1817
+ end
1818
+ end
1819
+
1820
+ module NamePart4
1821
+ def space
1822
+ elements[0]
1823
+ end
1824
+
1825
+ def a
1826
+ elements[1]
1827
+ end
1828
+
1829
+ def space
1830
+ elements[2]
1831
+ end
1832
+
1833
+ def b
1834
+ elements[3]
1835
+ end
1836
+ end
1837
+
1838
+ module NamePart5
1839
+ def value
1840
+ a.value + " " + b.value
1841
+ end
1842
+
1843
+ def canonical
1844
+ value
1845
+ end
1846
+
1847
+ def details
1848
+ a.details.merge({:subspecies => {:type => "n/a", :value =>b.value}})
1849
+ end
1850
+ end
1851
+
1852
+ def _nt_name_part
1853
+ start_index = index
1854
+ if node_cache[:name_part].has_key?(index)
1855
+ cached = node_cache[:name_part][index]
1856
+ @index = cached.interval.end if cached
1857
+ return cached
1858
+ end
1859
+
1860
+ i0 = index
1861
+ i1, s1 = index, []
1862
+ r2 = _nt_space
1863
+ s1 << r2
1864
+ if r2
1865
+ r3 = _nt_species_name
1866
+ s1 << r3
1867
+ if r3
1868
+ r4 = _nt_space
1869
+ s1 << r4
1870
+ if r4
1871
+ r5 = _nt_selector
1872
+ s1 << r5
1873
+ if r5
1874
+ r6 = _nt_space_hard
1875
+ s1 << r6
1876
+ if r6
1877
+ r7 = _nt_editorials_full
1878
+ s1 << r7
1879
+ end
1880
+ end
1881
+ end
1882
+ end
1883
+ end
1884
+ if s1.last
1885
+ r1 = (SyntaxNode).new(input, i1...index, s1)
1886
+ r1.extend(NamePart0)
1887
+ r1.extend(NamePart1)
1888
+ else
1889
+ self.index = i1
1890
+ r1 = nil
1891
+ end
1892
+ if r1
1893
+ r0 = r1
1894
+ else
1895
+ i8, s8 = index, []
1896
+ r9 = _nt_space
1897
+ s8 << r9
1898
+ if r9
1899
+ r10 = _nt_species_name
1900
+ s8 << r10
1901
+ if r10
1902
+ r11 = _nt_space
1903
+ s8 << r11
1904
+ if r11
1905
+ r12 = _nt_subspecies_names
1906
+ s8 << r12
1907
+ end
1908
+ end
1909
+ end
1910
+ if s8.last
1911
+ r8 = (SyntaxNode).new(input, i8...index, s8)
1912
+ r8.extend(NamePart2)
1913
+ r8.extend(NamePart3)
1914
+ else
1915
+ self.index = i8
1916
+ r8 = nil
1917
+ end
1918
+ if r8
1919
+ r0 = r8
1920
+ else
1921
+ i13, s13 = index, []
1922
+ r14 = _nt_space
1923
+ s13 << r14
1924
+ if r14
1925
+ r15 = _nt_species_name
1926
+ s13 << r15
1927
+ if r15
1928
+ r16 = _nt_space
1929
+ s13 << r16
1930
+ if r16
1931
+ r17 = _nt_latin_word
1932
+ s13 << r17
1933
+ end
1934
+ end
1935
+ end
1936
+ if s13.last
1937
+ r13 = (SyntaxNode).new(input, i13...index, s13)
1938
+ r13.extend(NamePart4)
1939
+ r13.extend(NamePart5)
1940
+ else
1941
+ self.index = i13
1942
+ r13 = nil
1943
+ end
1944
+ if r13
1945
+ r0 = r13
1946
+ else
1947
+ r18 = _nt_species_name
1948
+ if r18
1949
+ r0 = r18
1950
+ else
1951
+ r19 = _nt_cap_latin_word
1952
+ if r19
1953
+ r0 = r19
1954
+ else
1955
+ self.index = i0
1956
+ r0 = nil
1957
+ end
1958
+ end
1959
+ end
1960
+ end
1961
+ end
1962
+
1963
+ node_cache[:name_part][start_index] = r0
1964
+
1965
+ return r0
1966
+ end
1967
+
1968
+ module SubspeciesNames0
1969
+ def a
1970
+ elements[0]
1971
+ end
1972
+
1973
+ def space
1974
+ elements[1]
1975
+ end
1976
+
1977
+ def b
1978
+ elements[2]
1979
+ end
1980
+ end
1981
+
1982
+ module SubspeciesNames1
1983
+ def value
1984
+ a.value + b.value
1985
+ end
1986
+
1987
+ def canonical
1988
+ a.canonical + b.canonical
1989
+ end
1990
+
1991
+ def details
1992
+ c = a.details[:subspecies] + b.details_subspecies
1993
+ a.details.merge({:subspecies => c, :is_valid => false})
1994
+ end
1995
+ end
1996
+
1997
+ def _nt_subspecies_names
1998
+ start_index = index
1999
+ if node_cache[:subspecies_names].has_key?(index)
2000
+ cached = node_cache[:subspecies_names][index]
2001
+ @index = cached.interval.end if cached
2002
+ return cached
2003
+ end
2004
+
2005
+ i0 = index
2006
+ i1, s1 = index, []
2007
+ r2 = _nt_subspecies_name
2008
+ s1 << r2
2009
+ if r2
2010
+ r3 = _nt_space
2011
+ s1 << r3
2012
+ if r3
2013
+ r4 = _nt_subspecies_names
2014
+ s1 << r4
2015
+ end
2016
+ end
2017
+ if s1.last
2018
+ r1 = (SyntaxNode).new(input, i1...index, s1)
2019
+ r1.extend(SubspeciesNames0)
2020
+ r1.extend(SubspeciesNames1)
2021
+ else
2022
+ self.index = i1
2023
+ r1 = nil
2024
+ end
2025
+ if r1
2026
+ r0 = r1
2027
+ else
2028
+ r5 = _nt_subspecies_name
2029
+ if r5
2030
+ r0 = r5
2031
+ else
2032
+ self.index = i0
2033
+ r0 = nil
2034
+ end
2035
+ end
2036
+
2037
+ node_cache[:subspecies_names][start_index] = r0
2038
+
2039
+ return r0
2040
+ end
2041
+
2042
+ module SubspeciesName0
2043
+ def sel
2044
+ elements[0]
2045
+ end
2046
+
2047
+ def space_hard
2048
+ elements[1]
2049
+ end
2050
+
2051
+ def a
2052
+ elements[2]
2053
+ end
2054
+ end
2055
+
2056
+ module SubspeciesName1
2057
+ def value
2058
+ sel.apply(a)
2059
+ end
2060
+ def canonical
2061
+ sel.canonical(a)
2062
+ end
2063
+ def details
2064
+ sel.details(a)
2065
+ end
2066
+ def details_subspecies
2067
+ details[:subspecies]
2068
+ end
2069
+ end
2070
+
2071
+ def _nt_subspecies_name
2072
+ start_index = index
2073
+ if node_cache[:subspecies_name].has_key?(index)
2074
+ cached = node_cache[:subspecies_name][index]
2075
+ @index = cached.interval.end if cached
2076
+ return cached
2077
+ end
2078
+
2079
+ i0, s0 = index, []
2080
+ r1 = _nt_selector
2081
+ s0 << r1
2082
+ if r1
2083
+ r2 = _nt_space_hard
2084
+ s0 << r2
2085
+ if r2
2086
+ r3 = _nt_latin_word
2087
+ s0 << r3
2088
+ end
2089
+ end
2090
+ if s0.last
2091
+ r0 = (SyntaxNode).new(input, i0...index, s0)
2092
+ r0.extend(SubspeciesName0)
2093
+ r0.extend(SubspeciesName1)
2094
+ else
2095
+ self.index = i0
2096
+ r0 = nil
2097
+ end
2098
+
2099
+ node_cache[:subspecies_name][start_index] = r0
2100
+
2101
+ return r0
2102
+ end
2103
+
2104
+ module EditorialsFull0
2105
+ def space
2106
+ elements[1]
2107
+ end
2108
+
2109
+ def a
2110
+ elements[2]
2111
+ end
2112
+
2113
+ def space
2114
+ elements[3]
2115
+ end
2116
+
2117
+ end
2118
+
2119
+ module EditorialsFull1
2120
+ def value
2121
+ "(" + a.value + ")"
2122
+ end
2123
+ def details
2124
+ {:editorial_markup => value, :is_valid => false}
2125
+ end
2126
+ end
2127
+
2128
+ def _nt_editorials_full
2129
+ start_index = index
2130
+ if node_cache[:editorials_full].has_key?(index)
2131
+ cached = node_cache[:editorials_full][index]
2132
+ @index = cached.interval.end if cached
2133
+ return cached
2134
+ end
2135
+
2136
+ i0, s0 = index, []
2137
+ if input.index("(", index) == index
2138
+ r1 = (SyntaxNode).new(input, index...(index + 1))
2139
+ @index += 1
2140
+ else
2141
+ terminal_parse_failure("(")
2142
+ r1 = nil
2143
+ end
2144
+ s0 << r1
2145
+ if r1
2146
+ r2 = _nt_space
2147
+ s0 << r2
2148
+ if r2
2149
+ r3 = _nt_editorials
2150
+ s0 << r3
2151
+ if r3
2152
+ r4 = _nt_space
2153
+ s0 << r4
2154
+ if r4
2155
+ if input.index(")", index) == index
2156
+ r5 = (SyntaxNode).new(input, index...(index + 1))
2157
+ @index += 1
2158
+ else
2159
+ terminal_parse_failure(")")
2160
+ r5 = nil
2161
+ end
2162
+ s0 << r5
2163
+ end
2164
+ end
2165
+ end
2166
+ end
2167
+ if s0.last
2168
+ r0 = (SyntaxNode).new(input, i0...index, s0)
2169
+ r0.extend(EditorialsFull0)
2170
+ r0.extend(EditorialsFull1)
2171
+ else
2172
+ self.index = i0
2173
+ r0 = nil
2174
+ end
2175
+
2176
+ node_cache[:editorials_full][start_index] = r0
2177
+
2178
+ return r0
2179
+ end
2180
+
2181
+ module Editorials0
2182
+ def space
2183
+ elements[0]
2184
+ end
2185
+
2186
+ def a
2187
+ elements[1]
2188
+ end
2189
+
2190
+ def space
2191
+ elements[2]
2192
+ end
2193
+
2194
+ def space
2195
+ elements[4]
2196
+ end
2197
+
2198
+ def b
2199
+ elements[5]
2200
+ end
2201
+ end
2202
+
2203
+ module Editorials1
2204
+ def value
2205
+ a.value + b.value
2206
+ end
2207
+ end
2208
+
2209
+ def _nt_editorials
2210
+ start_index = index
2211
+ if node_cache[:editorials].has_key?(index)
2212
+ cached = node_cache[:editorials][index]
2213
+ @index = cached.interval.end if cached
2214
+ return cached
2215
+ end
2216
+
2217
+ i0 = index
2218
+ i1, s1 = index, []
2219
+ r2 = _nt_space
2220
+ s1 << r2
2221
+ if r2
2222
+ r3 = _nt_selector
2223
+ s1 << r3
2224
+ if r3
2225
+ r4 = _nt_space
2226
+ s1 << r4
2227
+ if r4
2228
+ if input.index(Regexp.new('[&]'), index) == index
2229
+ r6 = (SyntaxNode).new(input, index...(index + 1))
2230
+ @index += 1
2231
+ else
2232
+ r6 = nil
2233
+ end
2234
+ if r6
2235
+ r5 = r6
2236
+ else
2237
+ r5 = SyntaxNode.new(input, index...index)
2238
+ end
2239
+ s1 << r5
2240
+ if r5
2241
+ r7 = _nt_space
2242
+ s1 << r7
2243
+ if r7
2244
+ r8 = _nt_editorials
2245
+ s1 << r8
2246
+ end
2247
+ end
2248
+ end
2249
+ end
2250
+ end
2251
+ if s1.last
2252
+ r1 = (SyntaxNode).new(input, i1...index, s1)
2253
+ r1.extend(Editorials0)
2254
+ r1.extend(Editorials1)
2255
+ else
2256
+ self.index = i1
2257
+ r1 = nil
2258
+ end
2259
+ if r1
2260
+ r0 = r1
2261
+ else
2262
+ r9 = _nt_selector
2263
+ if r9
2264
+ r0 = r9
2265
+ else
2266
+ self.index = i0
2267
+ r0 = nil
2268
+ end
2269
+ end
2270
+
2271
+ node_cache[:editorials][start_index] = r0
2272
+
2273
+ return r0
2274
+ end
2275
+
2276
+ module Selector0
2277
+ def value
2278
+ text_value.strip
2279
+ end
2280
+ def apply(a)
2281
+ " " + text_value + " " + a.value
2282
+ end
2283
+ def canonical(a)
2284
+ " " + a.value
2285
+ end
2286
+ def details(a = nil)
2287
+ {:subspecies => [{:type => text_value, :value => (a.value rescue nil)}]}
2288
+ end
2289
+ end
2290
+
2291
+ def _nt_selector
2292
+ start_index = index
2293
+ if node_cache[:selector].has_key?(index)
2294
+ cached = node_cache[:selector][index]
2295
+ @index = cached.interval.end if cached
2296
+ return cached
2297
+ end
2298
+
2299
+ i0 = index
2300
+ if input.index("f.sp.", index) == index
2301
+ r1 = (SyntaxNode).new(input, index...(index + 5))
2302
+ @index += 5
2303
+ else
2304
+ terminal_parse_failure("f.sp.")
2305
+ r1 = nil
2306
+ end
2307
+ if r1
2308
+ r0 = r1
2309
+ r0.extend(Selector0)
2310
+ else
2311
+ if input.index("f.", index) == index
2312
+ r2 = (SyntaxNode).new(input, index...(index + 2))
2313
+ @index += 2
2314
+ else
2315
+ terminal_parse_failure("f.")
2316
+ r2 = nil
2317
+ end
2318
+ if r2
2319
+ r0 = r2
2320
+ r0.extend(Selector0)
2321
+ else
2322
+ if input.index("B", index) == index
2323
+ r3 = (SyntaxNode).new(input, index...(index + 1))
2324
+ @index += 1
2325
+ else
2326
+ terminal_parse_failure("B")
2327
+ r3 = nil
2328
+ end
2329
+ if r3
2330
+ r0 = r3
2331
+ r0.extend(Selector0)
2332
+ else
2333
+ if input.index("ssp.", index) == index
2334
+ r4 = (SyntaxNode).new(input, index...(index + 4))
2335
+ @index += 4
2336
+ else
2337
+ terminal_parse_failure("ssp.")
2338
+ r4 = nil
2339
+ end
2340
+ if r4
2341
+ r0 = r4
2342
+ r0.extend(Selector0)
2343
+ else
2344
+ if input.index("mut.", index) == index
2345
+ r5 = (SyntaxNode).new(input, index...(index + 4))
2346
+ @index += 4
2347
+ else
2348
+ terminal_parse_failure("mut.")
2349
+ r5 = nil
2350
+ end
2351
+ if r5
2352
+ r0 = r5
2353
+ r0.extend(Selector0)
2354
+ else
2355
+ if input.index("pseudovar.", index) == index
2356
+ r6 = (SyntaxNode).new(input, index...(index + 10))
2357
+ @index += 10
2358
+ else
2359
+ terminal_parse_failure("pseudovar.")
2360
+ r6 = nil
2361
+ end
2362
+ if r6
2363
+ r0 = r6
2364
+ r0.extend(Selector0)
2365
+ else
2366
+ if input.index("sect.", index) == index
2367
+ r7 = (SyntaxNode).new(input, index...(index + 5))
2368
+ @index += 5
2369
+ else
2370
+ terminal_parse_failure("sect.")
2371
+ r7 = nil
2372
+ end
2373
+ if r7
2374
+ r0 = r7
2375
+ r0.extend(Selector0)
2376
+ else
2377
+ if input.index("ser.", index) == index
2378
+ r8 = (SyntaxNode).new(input, index...(index + 4))
2379
+ @index += 4
2380
+ else
2381
+ terminal_parse_failure("ser.")
2382
+ r8 = nil
2383
+ end
2384
+ if r8
2385
+ r0 = r8
2386
+ r0.extend(Selector0)
2387
+ else
2388
+ if input.index("var.", index) == index
2389
+ r9 = (SyntaxNode).new(input, index...(index + 4))
2390
+ @index += 4
2391
+ else
2392
+ terminal_parse_failure("var.")
2393
+ r9 = nil
2394
+ end
2395
+ if r9
2396
+ r0 = r9
2397
+ r0.extend(Selector0)
2398
+ else
2399
+ if input.index("subvar.", index) == index
2400
+ r10 = (SyntaxNode).new(input, index...(index + 7))
2401
+ @index += 7
2402
+ else
2403
+ terminal_parse_failure("subvar.")
2404
+ r10 = nil
2405
+ end
2406
+ if r10
2407
+ r0 = r10
2408
+ r0.extend(Selector0)
2409
+ else
2410
+ if input.index("[var.]", index) == index
2411
+ r11 = (SyntaxNode).new(input, index...(index + 6))
2412
+ @index += 6
2413
+ else
2414
+ terminal_parse_failure("[var.]")
2415
+ r11 = nil
2416
+ end
2417
+ if r11
2418
+ r0 = r11
2419
+ r0.extend(Selector0)
2420
+ else
2421
+ if input.index("subsp.", index) == index
2422
+ r12 = (SyntaxNode).new(input, index...(index + 6))
2423
+ @index += 6
2424
+ else
2425
+ terminal_parse_failure("subsp.")
2426
+ r12 = nil
2427
+ end
2428
+ if r12
2429
+ r0 = r12
2430
+ r0.extend(Selector0)
2431
+ else
2432
+ if input.index("subf.", index) == index
2433
+ r13 = (SyntaxNode).new(input, index...(index + 5))
2434
+ @index += 5
2435
+ else
2436
+ terminal_parse_failure("subf.")
2437
+ r13 = nil
2438
+ end
2439
+ if r13
2440
+ r0 = r13
2441
+ r0.extend(Selector0)
2442
+ else
2443
+ if input.index("race", index) == index
2444
+ r14 = (SyntaxNode).new(input, index...(index + 4))
2445
+ @index += 4
2446
+ else
2447
+ terminal_parse_failure("race")
2448
+ r14 = nil
2449
+ end
2450
+ if r14
2451
+ r0 = r14
2452
+ r0.extend(Selector0)
2453
+ else
2454
+ if input.index("α", index) == index
2455
+ r15 = (SyntaxNode).new(input, index...(index + 2))
2456
+ @index += 2
2457
+ else
2458
+ terminal_parse_failure("α")
2459
+ r15 = nil
2460
+ end
2461
+ if r15
2462
+ r0 = r15
2463
+ r0.extend(Selector0)
2464
+ else
2465
+ if input.index("ββ", index) == index
2466
+ r16 = (SyntaxNode).new(input, index...(index + 4))
2467
+ @index += 4
2468
+ else
2469
+ terminal_parse_failure("ββ")
2470
+ r16 = nil
2471
+ end
2472
+ if r16
2473
+ r0 = r16
2474
+ r0.extend(Selector0)
2475
+ else
2476
+ if input.index("β", index) == index
2477
+ r17 = (SyntaxNode).new(input, index...(index + 2))
2478
+ @index += 2
2479
+ else
2480
+ terminal_parse_failure("β")
2481
+ r17 = nil
2482
+ end
2483
+ if r17
2484
+ r0 = r17
2485
+ r0.extend(Selector0)
2486
+ else
2487
+ if input.index("γ", index) == index
2488
+ r18 = (SyntaxNode).new(input, index...(index + 2))
2489
+ @index += 2
2490
+ else
2491
+ terminal_parse_failure("γ")
2492
+ r18 = nil
2493
+ end
2494
+ if r18
2495
+ r0 = r18
2496
+ r0.extend(Selector0)
2497
+ else
2498
+ if input.index("δ", index) == index
2499
+ r19 = (SyntaxNode).new(input, index...(index + 2))
2500
+ @index += 2
2501
+ else
2502
+ terminal_parse_failure("δ")
2503
+ r19 = nil
2504
+ end
2505
+ if r19
2506
+ r0 = r19
2507
+ r0.extend(Selector0)
2508
+ else
2509
+ if input.index("ε", index) == index
2510
+ r20 = (SyntaxNode).new(input, index...(index + 2))
2511
+ @index += 2
2512
+ else
2513
+ terminal_parse_failure("ε")
2514
+ r20 = nil
2515
+ end
2516
+ if r20
2517
+ r0 = r20
2518
+ r0.extend(Selector0)
2519
+ else
2520
+ if input.index("φ", index) == index
2521
+ r21 = (SyntaxNode).new(input, index...(index + 2))
2522
+ @index += 2
2523
+ else
2524
+ terminal_parse_failure("φ")
2525
+ r21 = nil
2526
+ end
2527
+ if r21
2528
+ r0 = r21
2529
+ r0.extend(Selector0)
2530
+ else
2531
+ if input.index("θ", index) == index
2532
+ r22 = (SyntaxNode).new(input, index...(index + 2))
2533
+ @index += 2
2534
+ else
2535
+ terminal_parse_failure("θ")
2536
+ r22 = nil
2537
+ end
2538
+ if r22
2539
+ r0 = r22
2540
+ r0.extend(Selector0)
2541
+ else
2542
+ if input.index("μ", index) == index
2543
+ r23 = (SyntaxNode).new(input, index...(index + 2))
2544
+ @index += 2
2545
+ else
2546
+ terminal_parse_failure("μ")
2547
+ r23 = nil
2548
+ end
2549
+ if r23
2550
+ r0 = r23
2551
+ r0.extend(Selector0)
2552
+ else
2553
+ if input.index("a.", index) == index
2554
+ r24 = (SyntaxNode).new(input, index...(index + 2))
2555
+ @index += 2
2556
+ else
2557
+ terminal_parse_failure("a.")
2558
+ r24 = nil
2559
+ end
2560
+ if r24
2561
+ r0 = r24
2562
+ r0.extend(Selector0)
2563
+ else
2564
+ if input.index("b.", index) == index
2565
+ r25 = (SyntaxNode).new(input, index...(index + 2))
2566
+ @index += 2
2567
+ else
2568
+ terminal_parse_failure("b.")
2569
+ r25 = nil
2570
+ end
2571
+ if r25
2572
+ r0 = r25
2573
+ r0.extend(Selector0)
2574
+ else
2575
+ if input.index("c.", index) == index
2576
+ r26 = (SyntaxNode).new(input, index...(index + 2))
2577
+ @index += 2
2578
+ else
2579
+ terminal_parse_failure("c.")
2580
+ r26 = nil
2581
+ end
2582
+ if r26
2583
+ r0 = r26
2584
+ r0.extend(Selector0)
2585
+ else
2586
+ if input.index("d.", index) == index
2587
+ r27 = (SyntaxNode).new(input, index...(index + 2))
2588
+ @index += 2
2589
+ else
2590
+ terminal_parse_failure("d.")
2591
+ r27 = nil
2592
+ end
2593
+ if r27
2594
+ r0 = r27
2595
+ r0.extend(Selector0)
2596
+ else
2597
+ if input.index("e.", index) == index
2598
+ r28 = (SyntaxNode).new(input, index...(index + 2))
2599
+ @index += 2
2600
+ else
2601
+ terminal_parse_failure("e.")
2602
+ r28 = nil
2603
+ end
2604
+ if r28
2605
+ r0 = r28
2606
+ r0.extend(Selector0)
2607
+ else
2608
+ if input.index("g.", index) == index
2609
+ r29 = (SyntaxNode).new(input, index...(index + 2))
2610
+ @index += 2
2611
+ else
2612
+ terminal_parse_failure("g.")
2613
+ r29 = nil
2614
+ end
2615
+ if r29
2616
+ r0 = r29
2617
+ r0.extend(Selector0)
2618
+ else
2619
+ if input.index("k.", index) == index
2620
+ r30 = (SyntaxNode).new(input, index...(index + 2))
2621
+ @index += 2
2622
+ else
2623
+ terminal_parse_failure("k.")
2624
+ r30 = nil
2625
+ end
2626
+ if r30
2627
+ r0 = r30
2628
+ r0.extend(Selector0)
2629
+ else
2630
+ if input.index("****", index) == index
2631
+ r31 = (SyntaxNode).new(input, index...(index + 4))
2632
+ @index += 4
2633
+ else
2634
+ terminal_parse_failure("****")
2635
+ r31 = nil
2636
+ end
2637
+ if r31
2638
+ r0 = r31
2639
+ r0.extend(Selector0)
2640
+ else
2641
+ if input.index("**", index) == index
2642
+ r32 = (SyntaxNode).new(input, index...(index + 2))
2643
+ @index += 2
2644
+ else
2645
+ terminal_parse_failure("**")
2646
+ r32 = nil
2647
+ end
2648
+ if r32
2649
+ r0 = r32
2650
+ r0.extend(Selector0)
2651
+ else
2652
+ if input.index("*", index) == index
2653
+ r33 = (SyntaxNode).new(input, index...(index + 1))
2654
+ @index += 1
2655
+ else
2656
+ terminal_parse_failure("*")
2657
+ r33 = nil
2658
+ end
2659
+ if r33
2660
+ r0 = r33
2661
+ r0.extend(Selector0)
2662
+ else
2663
+ self.index = i0
2664
+ r0 = nil
2665
+ end
2666
+ end
2667
+ end
2668
+ end
2669
+ end
2670
+ end
2671
+ end
2672
+ end
2673
+ end
2674
+ end
2675
+ end
2676
+ end
2677
+ end
2678
+ end
2679
+ end
2680
+ end
2681
+ end
2682
+ end
2683
+ end
2684
+ end
2685
+ end
2686
+ end
2687
+ end
2688
+ end
2689
+ end
2690
+ end
2691
+ end
2692
+ end
2693
+ end
2694
+ end
2695
+ end
2696
+ end
2697
+ end
2698
+
2699
+ node_cache[:selector][start_index] = r0
2700
+
2701
+ return r0
2702
+ end
2703
+
2704
+ module SpeciesName0
2705
+ def hybrid_separator
2706
+ elements[0]
2707
+ end
2708
+
2709
+ def space_hard
2710
+ elements[1]
2711
+ end
2712
+
2713
+ def a
2714
+ elements[2]
2715
+ end
2716
+
2717
+ def space_hard
2718
+ elements[3]
2719
+ end
2720
+
2721
+ def b
2722
+ elements[4]
2723
+ end
2724
+ end
2725
+
2726
+ module SpeciesName1
2727
+ def value
2728
+ "× " + a.value + " " + b.value
2729
+ end
2730
+ def canonical
2731
+ a.value + " " + b.value
2732
+ end
2733
+ def details
2734
+ {:genus => a.value, :species => b.value, :cross => 'before'}
2735
+ end
2736
+ end
2737
+
2738
+ module SpeciesName2
2739
+ def hybrid_separator
2740
+ elements[0]
2741
+ end
2742
+
2743
+ def space_hard
2744
+ elements[1]
2745
+ end
2746
+
2747
+ def a
2748
+ elements[2]
2749
+ end
2750
+ end
2751
+
2752
+ module SpeciesName3
2753
+ def value
2754
+ "× " + a.value
2755
+ end
2756
+ def canonical
2757
+ a.value
2758
+ end
2759
+ def details
2760
+ {:uninomial => a.value, :cross => 'before'}
2761
+ end
2762
+ end
2763
+
2764
+ module SpeciesName4
2765
+ def a
2766
+ elements[0]
2767
+ end
2768
+
2769
+ def space_hard
2770
+ elements[1]
2771
+ end
2772
+
2773
+ def hybrid_separator
2774
+ elements[2]
2775
+ end
2776
+
2777
+ def space_hard
2778
+ elements[3]
2779
+ end
2780
+
2781
+ def b
2782
+ elements[4]
2783
+ end
2784
+ end
2785
+
2786
+ module SpeciesName5
2787
+ def value
2788
+ a.value + " × " + b.value
2789
+ end
2790
+ def canonical
2791
+ a.value + " " + b.value
2792
+ end
2793
+ def details
2794
+ {:genus => a.value, :species => b.value, :cross => 'inside'}
2795
+ end
2796
+ end
2797
+
2798
+ module SpeciesName6
2799
+ def a
2800
+ elements[0]
2801
+ end
2802
+
2803
+ def space_hard
2804
+ elements[1]
2805
+ end
2806
+
2807
+ def b
2808
+ elements[2]
2809
+ end
2810
+
2811
+ def space_hard
2812
+ elements[3]
2813
+ end
2814
+
2815
+ def c
2816
+ elements[4]
2817
+ end
2818
+ end
2819
+
2820
+ module SpeciesName7
2821
+ def value
2822
+ a.value + " " + b.value + " " + c.value
2823
+ end
2824
+ def canonical
2825
+ a.value + " " + c.value
2826
+ end
2827
+ def details
2828
+ {:genus => a.value, :subgenus => b.details, :species => c.value}
2829
+ end
2830
+ end
2831
+
2832
+ module SpeciesName8
2833
+ def a
2834
+ elements[0]
2835
+ end
2836
+
2837
+ def space_hard
2838
+ elements[1]
2839
+ end
2840
+
2841
+ def b
2842
+ elements[2]
2843
+ end
2844
+ end
2845
+
2846
+ module SpeciesName9
2847
+ def value
2848
+ a.value + " " + b.value
2849
+ end
2850
+ def canonical
2851
+ value
2852
+ end
2853
+
2854
+ def details
2855
+ {:genus => a.value, :species => b.value}
2856
+ end
2857
+ end
2858
+
2859
+ def _nt_species_name
2860
+ start_index = index
2861
+ if node_cache[:species_name].has_key?(index)
2862
+ cached = node_cache[:species_name][index]
2863
+ @index = cached.interval.end if cached
2864
+ return cached
2865
+ end
2866
+
2867
+ i0 = index
2868
+ i1, s1 = index, []
2869
+ r2 = _nt_hybrid_separator
2870
+ s1 << r2
2871
+ if r2
2872
+ r3 = _nt_space_hard
2873
+ s1 << r3
2874
+ if r3
2875
+ r4 = _nt_cap_latin_word
2876
+ s1 << r4
2877
+ if r4
2878
+ r5 = _nt_space_hard
2879
+ s1 << r5
2880
+ if r5
2881
+ r6 = _nt_latin_word
2882
+ s1 << r6
2883
+ end
2884
+ end
2885
+ end
2886
+ end
2887
+ if s1.last
2888
+ r1 = (SyntaxNode).new(input, i1...index, s1)
2889
+ r1.extend(SpeciesName0)
2890
+ r1.extend(SpeciesName1)
2891
+ else
2892
+ self.index = i1
2893
+ r1 = nil
2894
+ end
2895
+ if r1
2896
+ r0 = r1
2897
+ else
2898
+ i7, s7 = index, []
2899
+ r8 = _nt_hybrid_separator
2900
+ s7 << r8
2901
+ if r8
2902
+ r9 = _nt_space_hard
2903
+ s7 << r9
2904
+ if r9
2905
+ r10 = _nt_cap_latin_word
2906
+ s7 << r10
2907
+ end
2908
+ end
2909
+ if s7.last
2910
+ r7 = (SyntaxNode).new(input, i7...index, s7)
2911
+ r7.extend(SpeciesName2)
2912
+ r7.extend(SpeciesName3)
2913
+ else
2914
+ self.index = i7
2915
+ r7 = nil
2916
+ end
2917
+ if r7
2918
+ r0 = r7
2919
+ else
2920
+ i11, s11 = index, []
2921
+ r12 = _nt_cap_latin_word
2922
+ s11 << r12
2923
+ if r12
2924
+ r13 = _nt_space_hard
2925
+ s11 << r13
2926
+ if r13
2927
+ r14 = _nt_hybrid_separator
2928
+ s11 << r14
2929
+ if r14
2930
+ r15 = _nt_space_hard
2931
+ s11 << r15
2932
+ if r15
2933
+ r16 = _nt_latin_word
2934
+ s11 << r16
2935
+ end
2936
+ end
2937
+ end
2938
+ end
2939
+ if s11.last
2940
+ r11 = (SyntaxNode).new(input, i11...index, s11)
2941
+ r11.extend(SpeciesName4)
2942
+ r11.extend(SpeciesName5)
2943
+ else
2944
+ self.index = i11
2945
+ r11 = nil
2946
+ end
2947
+ if r11
2948
+ r0 = r11
2949
+ else
2950
+ i17, s17 = index, []
2951
+ r18 = _nt_cap_latin_word
2952
+ s17 << r18
2953
+ if r18
2954
+ r19 = _nt_space_hard
2955
+ s17 << r19
2956
+ if r19
2957
+ r20 = _nt_subgenus
2958
+ s17 << r20
2959
+ if r20
2960
+ r21 = _nt_space_hard
2961
+ s17 << r21
2962
+ if r21
2963
+ r22 = _nt_latin_word
2964
+ s17 << r22
2965
+ end
2966
+ end
2967
+ end
2968
+ end
2969
+ if s17.last
2970
+ r17 = (SyntaxNode).new(input, i17...index, s17)
2971
+ r17.extend(SpeciesName6)
2972
+ r17.extend(SpeciesName7)
2973
+ else
2974
+ self.index = i17
2975
+ r17 = nil
2976
+ end
2977
+ if r17
2978
+ r0 = r17
2979
+ else
2980
+ i23, s23 = index, []
2981
+ r24 = _nt_cap_latin_word
2982
+ s23 << r24
2983
+ if r24
2984
+ r25 = _nt_space_hard
2985
+ s23 << r25
2986
+ if r25
2987
+ r26 = _nt_latin_word
2988
+ s23 << r26
2989
+ end
2990
+ end
2991
+ if s23.last
2992
+ r23 = (SyntaxNode).new(input, i23...index, s23)
2993
+ r23.extend(SpeciesName8)
2994
+ r23.extend(SpeciesName9)
2995
+ else
2996
+ self.index = i23
2997
+ r23 = nil
2998
+ end
2999
+ if r23
3000
+ r0 = r23
3001
+ else
3002
+ self.index = i0
3003
+ r0 = nil
3004
+ end
3005
+ end
3006
+ end
3007
+ end
3008
+ end
3009
+
3010
+ node_cache[:species_name][start_index] = r0
3011
+
3012
+ return r0
3013
+ end
3014
+
3015
+ module Subgenus0
3016
+ def space
3017
+ elements[1]
3018
+ end
3019
+
3020
+ def a
3021
+ elements[2]
3022
+ end
3023
+
3024
+ def space
3025
+ elements[3]
3026
+ end
3027
+
3028
+ end
3029
+
3030
+ module Subgenus1
3031
+ def value
3032
+ "(" + a.value + ")"
3033
+ end
3034
+ def details
3035
+ a.value
3036
+ end
3037
+ end
3038
+
3039
+ def _nt_subgenus
3040
+ start_index = index
3041
+ if node_cache[:subgenus].has_key?(index)
3042
+ cached = node_cache[:subgenus][index]
3043
+ @index = cached.interval.end if cached
3044
+ return cached
3045
+ end
3046
+
3047
+ i0, s0 = index, []
3048
+ if input.index("(", index) == index
3049
+ r1 = (SyntaxNode).new(input, index...(index + 1))
3050
+ @index += 1
3051
+ else
3052
+ terminal_parse_failure("(")
3053
+ r1 = nil
3054
+ end
3055
+ s0 << r1
3056
+ if r1
3057
+ r2 = _nt_space
3058
+ s0 << r2
3059
+ if r2
3060
+ r3 = _nt_cap_latin_word
3061
+ s0 << r3
3062
+ if r3
3063
+ r4 = _nt_space
3064
+ s0 << r4
3065
+ if r4
3066
+ if input.index(")", index) == index
3067
+ r5 = (SyntaxNode).new(input, index...(index + 1))
3068
+ @index += 1
3069
+ else
3070
+ terminal_parse_failure(")")
3071
+ r5 = nil
3072
+ end
3073
+ s0 << r5
3074
+ end
3075
+ end
3076
+ end
3077
+ end
3078
+ if s0.last
3079
+ r0 = (SyntaxNode).new(input, i0...index, s0)
3080
+ r0.extend(Subgenus0)
3081
+ r0.extend(Subgenus1)
3082
+ else
3083
+ self.index = i0
3084
+ r0 = nil
3085
+ end
3086
+
3087
+ node_cache[:subgenus][start_index] = r0
3088
+
3089
+ return r0
3090
+ end
3091
+
3092
+ module LatinWord0
3093
+ end
3094
+
3095
+ module LatinWord1
3096
+ def value
3097
+ text_value.strip
3098
+ end
3099
+ end
3100
+
3101
+ def _nt_latin_word
3102
+ start_index = index
3103
+ if node_cache[:latin_word].has_key?(index)
3104
+ cached = node_cache[:latin_word][index]
3105
+ @index = cached.interval.end if cached
3106
+ return cached
3107
+ end
3108
+
3109
+ i0, s0 = index, []
3110
+ if input.index(Regexp.new('[a-zë]'), index) == index
3111
+ r1 = (SyntaxNode).new(input, index...(index + 1))
3112
+ @index += 1
3113
+ else
3114
+ r1 = nil
3115
+ end
3116
+ s0 << r1
3117
+ if r1
3118
+ s2, i2 = [], index
3119
+ loop do
3120
+ if input.index(Regexp.new('[a-z\\-ëüäöï]'), index) == index
3121
+ r3 = (SyntaxNode).new(input, index...(index + 1))
3122
+ @index += 1
3123
+ else
3124
+ r3 = nil
3125
+ end
3126
+ if r3
3127
+ s2 << r3
3128
+ else
3129
+ break
3130
+ end
3131
+ end
3132
+ if s2.empty?
3133
+ self.index = i2
3134
+ r2 = nil
3135
+ else
3136
+ r2 = SyntaxNode.new(input, i2...index, s2)
3137
+ end
3138
+ s0 << r2
3139
+ end
3140
+ if s0.last
3141
+ r0 = (SyntaxNode).new(input, i0...index, s0)
3142
+ r0.extend(LatinWord0)
3143
+ r0.extend(LatinWord1)
3144
+ else
3145
+ self.index = i0
3146
+ r0 = nil
3147
+ end
3148
+
3149
+ node_cache[:latin_word][start_index] = r0
3150
+
3151
+ return r0
3152
+ end
3153
+
3154
+ module CapLatinWord0
3155
+ end
3156
+
3157
+ module CapLatinWord1
3158
+ def value
3159
+ text_value.strip
3160
+ end
3161
+
3162
+ def canonical
3163
+ text_value.strip
3164
+ end
3165
+
3166
+ def details
3167
+ {:name_type => "Uninomial", :uninomial => value}
3168
+ end
3169
+ end
3170
+
3171
+ def _nt_cap_latin_word
3172
+ start_index = index
3173
+ if node_cache[:cap_latin_word].has_key?(index)
3174
+ cached = node_cache[:cap_latin_word][index]
3175
+ @index = cached.interval.end if cached
3176
+ return cached
3177
+ end
3178
+
3179
+ i0, s0 = index, []
3180
+ if input.index(Regexp.new('[A-Z]'), index) == index
3181
+ r1 = (SyntaxNode).new(input, index...(index + 1))
3182
+ @index += 1
3183
+ else
3184
+ r1 = nil
3185
+ end
3186
+ s0 << r1
3187
+ if r1
3188
+ if input.index(Regexp.new('[a-zë]'), index) == index
3189
+ r2 = (SyntaxNode).new(input, index...(index + 1))
3190
+ @index += 1
3191
+ else
3192
+ r2 = nil
3193
+ end
3194
+ s0 << r2
3195
+ if r2
3196
+ s3, i3 = [], index
3197
+ loop do
3198
+ if input.index(Regexp.new('[a-z\\-ëüäöï]'), index) == index
3199
+ r4 = (SyntaxNode).new(input, index...(index + 1))
3200
+ @index += 1
3201
+ else
3202
+ r4 = nil
3203
+ end
3204
+ if r4
3205
+ s3 << r4
3206
+ else
3207
+ break
3208
+ end
3209
+ end
3210
+ if s3.empty?
3211
+ self.index = i3
3212
+ r3 = nil
3213
+ else
3214
+ r3 = SyntaxNode.new(input, i3...index, s3)
3215
+ end
3216
+ s0 << r3
3217
+ end
3218
+ end
3219
+ if s0.last
3220
+ r0 = (SyntaxNode).new(input, i0...index, s0)
3221
+ r0.extend(CapLatinWord0)
3222
+ r0.extend(CapLatinWord1)
3223
+ else
3224
+ self.index = i0
3225
+ r0 = nil
3226
+ end
3227
+
3228
+ node_cache[:cap_latin_word][start_index] = r0
3229
+
3230
+ return r0
3231
+ end
3232
+
3233
+ module HybridSeparator0
3234
+ def value
3235
+ "x"
3236
+ end
3237
+ end
3238
+
3239
+ def _nt_hybrid_separator
3240
+ start_index = index
3241
+ if node_cache[:hybrid_separator].has_key?(index)
3242
+ cached = node_cache[:hybrid_separator][index]
3243
+ @index = cached.interval.end if cached
3244
+ return cached
3245
+ end
3246
+
3247
+ i0 = index
3248
+ if input.index("x", index) == index
3249
+ r1 = (SyntaxNode).new(input, index...(index + 1))
3250
+ @index += 1
3251
+ else
3252
+ terminal_parse_failure("x")
3253
+ r1 = nil
3254
+ end
3255
+ if r1
3256
+ r0 = r1
3257
+ r0.extend(HybridSeparator0)
3258
+ else
3259
+ if input.index("X", index) == index
3260
+ r2 = (SyntaxNode).new(input, index...(index + 1))
3261
+ @index += 1
3262
+ else
3263
+ terminal_parse_failure("X")
3264
+ r2 = nil
3265
+ end
3266
+ if r2
3267
+ r0 = r2
3268
+ r0.extend(HybridSeparator0)
3269
+ else
3270
+ if input.index("×", index) == index
3271
+ r3 = (SyntaxNode).new(input, index...(index + 2))
3272
+ @index += 2
3273
+ else
3274
+ terminal_parse_failure("×")
3275
+ r3 = nil
3276
+ end
3277
+ if r3
3278
+ r0 = r3
3279
+ r0.extend(HybridSeparator0)
3280
+ else
3281
+ self.index = i0
3282
+ r0 = nil
3283
+ end
3284
+ end
3285
+ end
3286
+
3287
+ node_cache[:hybrid_separator][start_index] = r0
3288
+
3289
+ return r0
3290
+ end
3291
+
3292
+ module Year0
3293
+ def value
3294
+ text_value.strip
3295
+ end
3296
+ def details
3297
+ {:year => value}
3298
+ end
3299
+ end
3300
+
3301
+ def _nt_year
3302
+ start_index = index
3303
+ if node_cache[:year].has_key?(index)
3304
+ cached = node_cache[:year][index]
3305
+ @index = cached.interval.end if cached
3306
+ return cached
3307
+ end
3308
+
3309
+ s0, i0 = [], index
3310
+ loop do
3311
+ if input.index(Regexp.new('[0-9\\?]'), index) == index
3312
+ r1 = (SyntaxNode).new(input, index...(index + 1))
3313
+ @index += 1
3314
+ else
3315
+ r1 = nil
3316
+ end
3317
+ if r1
3318
+ s0 << r1
3319
+ else
3320
+ break
3321
+ end
3322
+ end
3323
+ if s0.empty?
3324
+ self.index = i0
3325
+ r0 = nil
3326
+ else
3327
+ r0 = SyntaxNode.new(input, i0...index, s0)
3328
+ r0.extend(Year0)
3329
+ end
3330
+
3331
+ node_cache[:year][start_index] = r0
3332
+
3333
+ return r0
3334
+ end
3335
+
3336
+ def _nt_space
3337
+ start_index = index
3338
+ if node_cache[:space].has_key?(index)
3339
+ cached = node_cache[:space][index]
3340
+ @index = cached.interval.end if cached
3341
+ return cached
3342
+ end
3343
+
3344
+ s0, i0 = [], index
3345
+ loop do
3346
+ if input.index(Regexp.new('[\\s]'), index) == index
3347
+ r1 = (SyntaxNode).new(input, index...(index + 1))
3348
+ @index += 1
3349
+ else
3350
+ r1 = nil
3351
+ end
3352
+ if r1
3353
+ s0 << r1
3354
+ else
3355
+ break
3356
+ end
3357
+ end
3358
+ r0 = SyntaxNode.new(input, i0...index, s0)
3359
+
3360
+ node_cache[:space][start_index] = r0
3361
+
3362
+ return r0
3363
+ end
3364
+
3365
+ def _nt_space_hard
3366
+ start_index = index
3367
+ if node_cache[:space_hard].has_key?(index)
3368
+ cached = node_cache[:space_hard][index]
3369
+ @index = cached.interval.end if cached
3370
+ return cached
3371
+ end
3372
+
3373
+ s0, i0 = [], index
3374
+ loop do
3375
+ if input.index(Regexp.new('[\\s]'), index) == index
3376
+ r1 = (SyntaxNode).new(input, index...(index + 1))
3377
+ @index += 1
3378
+ else
3379
+ r1 = nil
3380
+ end
3381
+ if r1
3382
+ s0 << r1
3383
+ else
3384
+ break
3385
+ end
3386
+ end
3387
+ if s0.empty?
3388
+ self.index = i0
3389
+ r0 = nil
3390
+ else
3391
+ r0 = SyntaxNode.new(input, i0...index, s0)
3392
+ end
3393
+
3394
+ node_cache[:space_hard][start_index] = r0
3395
+
3396
+ return r0
3397
+ end
3398
+
3399
+ end
3400
+
3401
+ class ScientificNameParser < Treetop::Runtime::CompiledParser
3402
+ include ScientificName
3403
+ end