dimus-biodiversity 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
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