dimus-biodiversity 0.0.12 → 0.0.13

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/Rakefile CHANGED
@@ -26,7 +26,9 @@ task :default => :spec
26
26
 
27
27
 
28
28
  task :tt do
29
- system("tt #{dir}/lib/biodiversity/parser/scientific_name.treetop")
29
+ system("tt #{dir}/lib/biodiversity/parser/scientific_name_clean.treetop")
30
+ system("tt #{dir}/lib/biodiversity/parser/scientific_name_dirty.treetop")
31
+ system("tt #{dir}/lib/biodiversity/parser/scientific_name_canonical.treetop")
30
32
  end
31
33
 
32
34
  task :files do
data/bin/nnparse CHANGED
@@ -13,6 +13,7 @@ end
13
13
 
14
14
 
15
15
  parser = ScientificNameParser.new
16
+ dirty_parser = ScientificNameDirtyParser.new
16
17
 
17
18
  output = ARGV[1] || 'parsed.json'
18
19
  o = File.open(output,'w')
@@ -30,7 +31,7 @@ IO.foreach(ARGV[0]) do |n|
30
31
  p count2 if count2 % 5000 == 0
31
32
  n.strip!
32
33
  name_dict = {:input => n}
33
- parsed = parser.parse n
34
+ parsed = parser.parse(n) || dirty_parser.parse(n)
34
35
  unless parsed
35
36
  name_dict[:details] = {:parsed => false}
36
37
  last_result = JSON.generate name_dict
@@ -1,3 +1,21 @@
1
1
  # encoding: UTF-8
2
2
  dir = File.dirname(__FILE__)
3
- require File.join(dir, *%w[parser scientific_name])
3
+ require File.join(dir, *%w[parser scientific_name_clean])
4
+ require File.join(dir, *%w[parser scientific_name_dirty])
5
+ require File.join(dir, *%w[parser scientific_name_canonical])
6
+
7
+
8
+ class ScientificNameParser
9
+
10
+ def initialize
11
+ @clean = ScientificNameCleanParser.new
12
+ @dirty = ScientificNameDirtyParser.new
13
+ @canonical = ScientificNameCanonicalParser.new
14
+ end
15
+
16
+ def parse(a_string)
17
+ @clean.parse(a_string) || @dirty.parse(a_string) || @canonical.parse(a_string)
18
+ end
19
+
20
+ end
21
+
@@ -0,0 +1,214 @@
1
+ # encoding: UTF-8
2
+ module ScientificNameCanonical
3
+ include Treetop::Runtime
4
+
5
+ def root
6
+ @root || :composite_scientific_name
7
+ end
8
+
9
+ include ScientificNameClean
10
+
11
+ include ScientificNameDirty
12
+
13
+ def _nt_composite_scientific_name
14
+ start_index = index
15
+ if node_cache[:composite_scientific_name].has_key?(index)
16
+ cached = node_cache[:composite_scientific_name][index]
17
+ @index = cached.interval.end if cached
18
+ return cached
19
+ end
20
+
21
+ r0 = _nt_name_part_with_garbage
22
+
23
+ node_cache[:composite_scientific_name][start_index] = r0
24
+
25
+ return r0
26
+ end
27
+
28
+ module NamePartWithGarbage0
29
+ def a
30
+ elements[0]
31
+ end
32
+
33
+ def space
34
+ elements[1]
35
+ end
36
+
37
+ def b
38
+ elements[2]
39
+ end
40
+ end
41
+
42
+ module NamePartWithGarbage1
43
+ def value
44
+ a.value
45
+ end
46
+ def canonical
47
+ a.canonical
48
+ end
49
+ def details
50
+ a.details.merge(:name_part_verbatim => a.text_value, :auth_part_verbatim => b.text_value)
51
+ end
52
+ end
53
+
54
+ module NamePartWithGarbage2
55
+ def a
56
+ elements[0]
57
+ end
58
+
59
+ def space
60
+ elements[1]
61
+ end
62
+
63
+ def b
64
+ elements[2]
65
+ end
66
+ end
67
+
68
+ module NamePartWithGarbage3
69
+ def value
70
+ a.value
71
+ end
72
+ def canonical
73
+ a.canonical
74
+ end
75
+ def details
76
+ a.details.merge(:name_part_verbatim => a.text_value, :auth_part_verbatim => b.text_value)
77
+ end
78
+ end
79
+
80
+ def _nt_name_part_with_garbage
81
+ start_index = index
82
+ if node_cache[:name_part_with_garbage].has_key?(index)
83
+ cached = node_cache[:name_part_with_garbage][index]
84
+ @index = cached.interval.end if cached
85
+ return cached
86
+ end
87
+
88
+ i0 = index
89
+ i1, s1 = index, []
90
+ r2 = _nt_species_name
91
+ s1 << r2
92
+ if r2
93
+ r3 = _nt_space
94
+ s1 << r3
95
+ if r3
96
+ s4, i4 = [], index
97
+ loop do
98
+ if input.index(Regexp.new('[^ш]'), index) == index
99
+ r5 = instantiate_node(SyntaxNode,input, index...(index + 1))
100
+ @index += 1
101
+ else
102
+ r5 = nil
103
+ end
104
+ if r5
105
+ s4 << r5
106
+ else
107
+ break
108
+ end
109
+ end
110
+ if s4.empty?
111
+ self.index = i4
112
+ r4 = nil
113
+ else
114
+ r4 = instantiate_node(SyntaxNode,input, i4...index, s4)
115
+ end
116
+ s1 << r4
117
+ end
118
+ end
119
+ if s1.last
120
+ r1 = instantiate_node(SyntaxNode,input, i1...index, s1)
121
+ r1.extend(NamePartWithGarbage0)
122
+ r1.extend(NamePartWithGarbage1)
123
+ else
124
+ self.index = i1
125
+ r1 = nil
126
+ end
127
+ if r1
128
+ r0 = r1
129
+ else
130
+ i6, s6 = index, []
131
+ r7 = _nt_name_part
132
+ s6 << r7
133
+ if r7
134
+ r8 = _nt_space
135
+ s6 << r8
136
+ if r8
137
+ s9, i9 = [], index
138
+ loop do
139
+ if input.index(Regexp.new('[^ш]'), index) == index
140
+ r10 = instantiate_node(SyntaxNode,input, index...(index + 1))
141
+ @index += 1
142
+ else
143
+ r10 = nil
144
+ end
145
+ if r10
146
+ s9 << r10
147
+ else
148
+ break
149
+ end
150
+ end
151
+ if s9.empty?
152
+ self.index = i9
153
+ r9 = nil
154
+ else
155
+ r9 = instantiate_node(SyntaxNode,input, i9...index, s9)
156
+ end
157
+ s6 << r9
158
+ end
159
+ end
160
+ if s6.last
161
+ r6 = instantiate_node(SyntaxNode,input, i6...index, s6)
162
+ r6.extend(NamePartWithGarbage2)
163
+ r6.extend(NamePartWithGarbage3)
164
+ else
165
+ self.index = i6
166
+ r6 = nil
167
+ end
168
+ if r6
169
+ r0 = r6
170
+ else
171
+ self.index = i0
172
+ r0 = nil
173
+ end
174
+ end
175
+
176
+ node_cache[:name_part_with_garbage][start_index] = r0
177
+
178
+ return r0
179
+ end
180
+
181
+ def _nt_garbage
182
+ start_index = index
183
+ if node_cache[:garbage].has_key?(index)
184
+ cached = node_cache[:garbage][index]
185
+ @index = cached.interval.end if cached
186
+ return cached
187
+ end
188
+
189
+ s0, i0 = [], index
190
+ loop do
191
+ if input.index(Regexp.new('[.]'), index) == index
192
+ r1 = instantiate_node(SyntaxNode,input, index...(index + 1))
193
+ @index += 1
194
+ else
195
+ r1 = nil
196
+ end
197
+ if r1
198
+ s0 << r1
199
+ else
200
+ break
201
+ end
202
+ end
203
+ r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
204
+
205
+ node_cache[:garbage][start_index] = r0
206
+
207
+ return r0
208
+ end
209
+
210
+ end
211
+
212
+ class ScientificNameCanonicalParser < Treetop::Runtime::CompiledParser
213
+ include ScientificNameCanonical
214
+ end
@@ -0,0 +1,40 @@
1
+ # encoding: UTF-8
2
+ grammar ScientificNameCanonical
3
+ include ScientificNameClean
4
+ include ScientificNameDirty
5
+
6
+ rule composite_scientific_name
7
+ name_part_with_garbage
8
+ end
9
+
10
+ rule name_part_with_garbage
11
+ a:species_name space b:[^ш]+ {
12
+ def value
13
+ a.value
14
+ end
15
+ def canonical
16
+ a.canonical
17
+ end
18
+ def details
19
+ a.details.merge(:name_part_verbatim => a.text_value, :auth_part_verbatim => b.text_value)
20
+ end
21
+ }
22
+ /
23
+ a:name_part space b:[^ш]+ {
24
+ def value
25
+ a.value
26
+ end
27
+ def canonical
28
+ a.canonical
29
+ end
30
+ def details
31
+ a.details.merge(:name_part_verbatim => a.text_value, :auth_part_verbatim => b.text_value)
32
+ end
33
+ }
34
+ end
35
+
36
+ rule garbage
37
+ [.]*
38
+ end
39
+
40
+ end
@@ -1,5 +1,5 @@
1
1
  # encoding: UTF-8
2
- module ScientificName
2
+ module ScientificNameClean
3
3
  include Treetop::Runtime
4
4
 
5
5
  def root
@@ -203,17 +203,27 @@ module ScientificName
203
203
  def space
204
204
  elements[6]
205
205
  end
206
+
207
+ def d
208
+ elements[7]
209
+ end
210
+
211
+ def space
212
+ elements[8]
213
+ end
206
214
  end
207
215
 
208
216
  module ScientificName1
209
217
  def value
210
- a.value + " " + b.value + " " + c.value
218
+ a.value + " " + b.value + " " + c.apply(d)
211
219
  end
220
+
212
221
  def canonical
213
222
  a.canonical
214
223
  end
224
+
215
225
  def details
216
- a.details.merge(b.details).merge(c.details)
226
+ a.details.merge(b.details).merge(c.details(d)).merge({:name_part_verbatim => a.text_value, :auth_part_verbatim => (b.text_value + " " + c.text_value + " " + d.text_value).gsub(/\s{2,}/, ' ').strip})
217
227
  end
218
228
  end
219
229
 
@@ -237,17 +247,27 @@ module ScientificName
237
247
  def space
238
248
  elements[4]
239
249
  end
250
+
251
+ def c
252
+ elements[5]
253
+ end
254
+
255
+ def space
256
+ elements[6]
257
+ end
240
258
  end
241
259
 
242
260
  module ScientificName3
243
261
  def value
244
- a.value + " " + b.value
262
+ a.value + " " + b.apply(c)
245
263
  end
264
+
246
265
  def canonical
247
266
  a.canonical
248
267
  end
268
+
249
269
  def details
250
- a.details.merge(b.details)
270
+ a.details.merge(b.details(c)).merge({:name_part_verbatim => a.text_value, :auth_part_verbatim => (b.text_value + " " + c.text_value).gsub(/\s{2,}/, ' ').strip})
251
271
  end
252
272
  end
253
273
 
@@ -271,9 +291,85 @@ module ScientificName
271
291
  def space
272
292
  elements[4]
273
293
  end
294
+
295
+ def c
296
+ elements[5]
297
+ end
298
+
299
+ def space
300
+ elements[6]
301
+ end
274
302
  end
275
303
 
276
304
  module ScientificName5
305
+ def value
306
+ a.value + " " + b.value + " " + c.value
307
+ end
308
+ def canonical
309
+ a.canonical
310
+ end
311
+ def details
312
+ a.details.merge(b.details).merge(c.details).merge({:name_part_verbatim => a.text_value, :auth_part_verbatim => (b.text_value + " " + c.text_value).gsub(/\s{2,}/, ' ').strip})
313
+ end
314
+ end
315
+
316
+ module ScientificName6
317
+ def space
318
+ elements[0]
319
+ end
320
+
321
+ def a
322
+ elements[1]
323
+ end
324
+
325
+ def space
326
+ elements[2]
327
+ end
328
+
329
+ def b
330
+ elements[3]
331
+ end
332
+
333
+ def space
334
+ elements[4]
335
+ end
336
+ end
337
+
338
+ module ScientificName7
339
+ def value
340
+ a.value + " " + b.value
341
+ end
342
+ def canonical
343
+ a.canonical
344
+ end
345
+ def details
346
+ a.details.merge(b.details).merge({:name_part_verbatim => a.text_value, :auth_part_verbatim => b.text_value.gsub(/\s{2,}/, ' ')})
347
+ end
348
+ end
349
+
350
+ module ScientificName8
351
+ def space
352
+ elements[0]
353
+ end
354
+
355
+ def a
356
+ elements[1]
357
+ end
358
+
359
+ def space
360
+ elements[2]
361
+ end
362
+
363
+ def b
364
+ elements[3]
365
+ end
366
+
367
+ def space
368
+ elements[4]
369
+ end
370
+ end
371
+
372
+ module ScientificName9
277
373
  def value
278
374
  a.value + " " + b.value
279
375
  end
@@ -283,7 +379,7 @@ module ScientificName
283
379
  end
284
380
 
285
381
  def details
286
- a.details.merge(b.details).merge({:is_valid => false})
382
+ a.details.merge(b.details).merge({:is_valid => false}).merge({:name_part_verbatim => a.text_value, :auth_part_verbatim => b.text_value.gsub(/\s{2,}/, ' ')})
287
383
  end
288
384
  end
289
385
 
@@ -316,11 +412,19 @@ module ScientificName
316
412
  r7 = _nt_space
317
413
  s2 << r7
318
414
  if r7
319
- r8 = _nt_status_part
415
+ r8 = _nt_taxon_concept_rank
320
416
  s2 << r8
321
417
  if r8
322
418
  r9 = _nt_space
323
419
  s2 << r9
420
+ if r9
421
+ r10 = _nt_authors_part
422
+ s2 << r10
423
+ if r10
424
+ r11 = _nt_space
425
+ s2 << r11
426
+ end
427
+ end
324
428
  end
325
429
  end
326
430
  end
@@ -338,72 +442,150 @@ module ScientificName
338
442
  if r2
339
443
  r0 = r2
340
444
  else
341
- i10, s10 = index, []
342
- r11 = _nt_space
343
- s10 << r11
344
- if r11
345
- r12 = _nt_name_part
346
- s10 << r12
347
- if r12
348
- r13 = _nt_space
349
- s10 << r13
350
- if r13
351
- r14 = _nt_authors_part
352
- s10 << r14
353
- if r14
354
- r15 = _nt_space
355
- s10 << r15
445
+ i12, s12 = index, []
446
+ r13 = _nt_space
447
+ s12 << r13
448
+ if r13
449
+ r14 = _nt_name_part
450
+ s12 << r14
451
+ if r14
452
+ r15 = _nt_space
453
+ s12 << r15
454
+ if r15
455
+ r16 = _nt_taxon_concept_rank
456
+ s12 << r16
457
+ if r16
458
+ r17 = _nt_space
459
+ s12 << r17
460
+ if r17
461
+ r18 = _nt_authors_part
462
+ s12 << r18
463
+ if r18
464
+ r19 = _nt_space
465
+ s12 << r19
466
+ end
467
+ end
356
468
  end
357
469
  end
358
470
  end
359
471
  end
360
- if s10.last
361
- r10 = instantiate_node(SyntaxNode,input, i10...index, s10)
362
- r10.extend(ScientificName2)
363
- r10.extend(ScientificName3)
472
+ if s12.last
473
+ r12 = instantiate_node(SyntaxNode,input, i12...index, s12)
474
+ r12.extend(ScientificName2)
475
+ r12.extend(ScientificName3)
364
476
  else
365
- self.index = i10
366
- r10 = nil
477
+ self.index = i12
478
+ r12 = nil
367
479
  end
368
- if r10
369
- r0 = r10
480
+ if r12
481
+ r0 = r12
370
482
  else
371
- i16, s16 = index, []
372
- r17 = _nt_space
373
- s16 << r17
374
- if r17
375
- r18 = _nt_name_part
376
- s16 << r18
377
- if r18
378
- r19 = _nt_space
379
- s16 << r19
380
- if r19
381
- r20 = _nt_year
382
- s16 << r20
383
- if r20
384
- r21 = _nt_space
385
- s16 << r21
483
+ i20, s20 = index, []
484
+ r21 = _nt_space
485
+ s20 << r21
486
+ if r21
487
+ r22 = _nt_name_part
488
+ s20 << r22
489
+ if r22
490
+ r23 = _nt_space
491
+ s20 << r23
492
+ if r23
493
+ r24 = _nt_authors_part
494
+ s20 << r24
495
+ if r24
496
+ r25 = _nt_space
497
+ s20 << r25
498
+ if r25
499
+ r26 = _nt_status_part
500
+ s20 << r26
501
+ if r26
502
+ r27 = _nt_space
503
+ s20 << r27
504
+ end
505
+ end
386
506
  end
387
507
  end
388
508
  end
389
509
  end
390
- if s16.last
391
- r16 = instantiate_node(SyntaxNode,input, i16...index, s16)
392
- r16.extend(ScientificName4)
393
- r16.extend(ScientificName5)
510
+ if s20.last
511
+ r20 = instantiate_node(SyntaxNode,input, i20...index, s20)
512
+ r20.extend(ScientificName4)
513
+ r20.extend(ScientificName5)
394
514
  else
395
- self.index = i16
396
- r16 = nil
515
+ self.index = i20
516
+ r20 = nil
397
517
  end
398
- if r16
399
- r0 = r16
518
+ if r20
519
+ r0 = r20
400
520
  else
401
- r22 = _nt_name_part
402
- if r22
403
- r0 = r22
521
+ i28, s28 = index, []
522
+ r29 = _nt_space
523
+ s28 << r29
524
+ if r29
525
+ r30 = _nt_name_part
526
+ s28 << r30
527
+ if r30
528
+ r31 = _nt_space
529
+ s28 << r31
530
+ if r31
531
+ r32 = _nt_authors_part
532
+ s28 << r32
533
+ if r32
534
+ r33 = _nt_space
535
+ s28 << r33
536
+ end
537
+ end
538
+ end
539
+ end
540
+ if s28.last
541
+ r28 = instantiate_node(SyntaxNode,input, i28...index, s28)
542
+ r28.extend(ScientificName6)
543
+ r28.extend(ScientificName7)
404
544
  else
405
- self.index = i0
406
- r0 = nil
545
+ self.index = i28
546
+ r28 = nil
547
+ end
548
+ if r28
549
+ r0 = r28
550
+ else
551
+ i34, s34 = index, []
552
+ r35 = _nt_space
553
+ s34 << r35
554
+ if r35
555
+ r36 = _nt_name_part
556
+ s34 << r36
557
+ if r36
558
+ r37 = _nt_space
559
+ s34 << r37
560
+ if r37
561
+ r38 = _nt_year
562
+ s34 << r38
563
+ if r38
564
+ r39 = _nt_space
565
+ s34 << r39
566
+ end
567
+ end
568
+ end
569
+ end
570
+ if s34.last
571
+ r34 = instantiate_node(SyntaxNode,input, i34...index, s34)
572
+ r34.extend(ScientificName8)
573
+ r34.extend(ScientificName9)
574
+ else
575
+ self.index = i34
576
+ r34 = nil
577
+ end
578
+ if r34
579
+ r0 = r34
580
+ else
581
+ r40 = _nt_name_part
582
+ if r40
583
+ r0 = r40
584
+ else
585
+ self.index = i0
586
+ r0 = nil
587
+ end
588
+ end
407
589
  end
408
590
  end
409
591
  end
@@ -577,13 +759,13 @@ module ScientificName
577
759
 
578
760
  module NamePartAuthorsMix1
579
761
  def value
580
- a.value + " " + b.value + " " + c.value + " " + d.value
762
+ (a.value + " " + b.value + " " + c.value + " " + d.value).gsub(/\s+/,' ')
581
763
  end
582
764
  def canonical
583
- a.canonical + " " + c.canonical
765
+ (a.canonical + " " + c.canonical).gsub(/\s+/,' ')
584
766
  end
585
767
  def details
586
- a.details.merge(c.details).merge({:species_authors=>b.details, :subspecies_authors => d.details})
768
+ a.details.merge(c.details).merge({:species_authors=>b.details, :subspecies_authors => d.details}).merge({:name_part_verbatim => a.text_value, :auth_part_verbatim => (b.text_value + " " + c.text_value + " " + d.text_value).gsub(/\s{2,}/, ' ')})
587
769
  end
588
770
  end
589
771
 
@@ -611,13 +793,13 @@ module ScientificName
611
793
 
612
794
  module NamePartAuthorsMix3
613
795
  def value
614
- a.value + " " + b.value + " " + c.value
796
+ (a.value + " " + b.value + " " + c.value).gsub(/\s+/,' ')
615
797
  end
616
798
  def canonical
617
- a.canonical + " " + c.canonical
799
+ (a.canonical + " " + c.canonical).gsub(/\s+/,' ')
618
800
  end
619
801
  def details
620
- a.details.merge(c.details).merge({:species_authors=>b.details})
802
+ a.details.merge(c.details).merge({:species_authors=>b.details}).merge({:name_part_verbatim => a.text_value, :auth_part_verbatim => (b.text_value + " " + c.text_value).gsub(/\s{2,}/, ' ')})
621
803
  end
622
804
  end
623
805
 
@@ -970,6 +1152,10 @@ module ScientificName
970
1152
  end
971
1153
 
972
1154
  module OriginalAuthorsNamesFull0
1155
+ def left_bracket
1156
+ elements[0]
1157
+ end
1158
+
973
1159
  def space
974
1160
  elements[1]
975
1161
  end
@@ -982,6 +1168,10 @@ module ScientificName
982
1168
  elements[3]
983
1169
  end
984
1170
 
1171
+ def right_bracket
1172
+ elements[4]
1173
+ end
1174
+
985
1175
  def space
986
1176
  elements[5]
987
1177
  end
@@ -1005,6 +1195,10 @@ module ScientificName
1005
1195
  end
1006
1196
 
1007
1197
  module OriginalAuthorsNamesFull2
1198
+ def left_bracket
1199
+ elements[0]
1200
+ end
1201
+
1008
1202
  def space
1009
1203
  elements[1]
1010
1204
  end
@@ -1017,6 +1211,9 @@ module ScientificName
1017
1211
  elements[3]
1018
1212
  end
1019
1213
 
1214
+ def right_bracket
1215
+ elements[4]
1216
+ end
1020
1217
  end
1021
1218
 
1022
1219
  module OriginalAuthorsNamesFull3
@@ -1028,6 +1225,88 @@ module ScientificName
1028
1225
  end
1029
1226
  end
1030
1227
 
1228
+ module OriginalAuthorsNamesFull4
1229
+ def space
1230
+ elements[1]
1231
+ end
1232
+
1233
+ def a
1234
+ elements[2]
1235
+ end
1236
+
1237
+ def space
1238
+ elements[3]
1239
+ end
1240
+
1241
+ end
1242
+
1243
+ module OriginalAuthorsNamesFull5
1244
+ def value
1245
+ "(" + a.value + ")"
1246
+ end
1247
+ def details
1248
+ {:orig_authors => a.details[:authors]}
1249
+ end
1250
+ end
1251
+
1252
+ module OriginalAuthorsNamesFull6
1253
+ def left_bracket
1254
+ elements[0]
1255
+ end
1256
+
1257
+ def space
1258
+ elements[1]
1259
+ end
1260
+
1261
+ def a
1262
+ elements[2]
1263
+ end
1264
+
1265
+ def space
1266
+ elements[3]
1267
+ end
1268
+
1269
+ def right_bracket
1270
+ elements[4]
1271
+ end
1272
+ end
1273
+
1274
+ module OriginalAuthorsNamesFull7
1275
+ def value
1276
+ "(" + a.value + ")"
1277
+ end
1278
+ def details
1279
+ {:orig_authors => a.details[:authors]}
1280
+ end
1281
+ end
1282
+
1283
+ module OriginalAuthorsNamesFull8
1284
+ def left_bracket
1285
+ elements[0]
1286
+ end
1287
+
1288
+ def space
1289
+ elements[1]
1290
+ end
1291
+
1292
+ def space
1293
+ elements[3]
1294
+ end
1295
+
1296
+ def right_bracket
1297
+ elements[4]
1298
+ end
1299
+ end
1300
+
1301
+ module OriginalAuthorsNamesFull9
1302
+ def value
1303
+ "(?)"
1304
+ end
1305
+ def details
1306
+ {:orig_authors => "unknown"}
1307
+ end
1308
+ end
1309
+
1031
1310
  def _nt_original_authors_names_full
1032
1311
  start_index = index
1033
1312
  if node_cache[:original_authors_names_full].has_key?(index)
@@ -1038,13 +1317,7 @@ module ScientificName
1038
1317
 
1039
1318
  i0 = index
1040
1319
  i1, s1 = index, []
1041
- if input.index("(", index) == index
1042
- r2 = instantiate_node(SyntaxNode,input, index...(index + 1))
1043
- @index += 1
1044
- else
1045
- terminal_parse_failure("(")
1046
- r2 = nil
1047
- end
1320
+ r2 = _nt_left_bracket
1048
1321
  s1 << r2
1049
1322
  if r2
1050
1323
  r3 = _nt_space
@@ -1056,13 +1329,7 @@ module ScientificName
1056
1329
  r5 = _nt_space
1057
1330
  s1 << r5
1058
1331
  if r5
1059
- if input.index(")", index) == index
1060
- r6 = instantiate_node(SyntaxNode,input, index...(index + 1))
1061
- @index += 1
1062
- else
1063
- terminal_parse_failure(")")
1064
- r6 = nil
1065
- end
1332
+ r6 = _nt_right_bracket
1066
1333
  s1 << r6
1067
1334
  if r6
1068
1335
  r7 = _nt_space
@@ -1106,13 +1373,7 @@ module ScientificName
1106
1373
  r0 = r1
1107
1374
  else
1108
1375
  i12, s12 = index, []
1109
- if input.index("(", index) == index
1110
- r13 = instantiate_node(SyntaxNode,input, index...(index + 1))
1111
- @index += 1
1112
- else
1113
- terminal_parse_failure("(")
1114
- r13 = nil
1115
- end
1376
+ r13 = _nt_left_bracket
1116
1377
  s12 << r13
1117
1378
  if r13
1118
1379
  r14 = _nt_space
@@ -1124,13 +1385,7 @@ module ScientificName
1124
1385
  r16 = _nt_space
1125
1386
  s12 << r16
1126
1387
  if r16
1127
- if input.index(")", index) == index
1128
- r17 = instantiate_node(SyntaxNode,input, index...(index + 1))
1129
- @index += 1
1130
- else
1131
- terminal_parse_failure(")")
1132
- r17 = nil
1133
- end
1388
+ r17 = _nt_right_bracket
1134
1389
  s12 << r17
1135
1390
  end
1136
1391
  end
@@ -1147,22 +1402,137 @@ module ScientificName
1147
1402
  if r12
1148
1403
  r0 = r12
1149
1404
  else
1150
- self.index = i0
1151
- r0 = nil
1152
- end
1153
- end
1154
-
1155
- node_cache[:original_authors_names_full][start_index] = r0
1156
-
1157
- return r0
1158
- end
1159
-
1160
- module OriginalAuthorsRevisedName0
1161
- def space
1162
- elements[1]
1163
- end
1164
-
1165
- def a
1405
+ i18, s18 = index, []
1406
+ if input.index("[", index) == index
1407
+ r19 = instantiate_node(SyntaxNode,input, index...(index + 1))
1408
+ @index += 1
1409
+ else
1410
+ terminal_parse_failure("[")
1411
+ r19 = nil
1412
+ end
1413
+ s18 << r19
1414
+ if r19
1415
+ r20 = _nt_space
1416
+ s18 << r20
1417
+ if r20
1418
+ r21 = _nt_authors_names_full
1419
+ s18 << r21
1420
+ if r21
1421
+ r22 = _nt_space
1422
+ s18 << r22
1423
+ if r22
1424
+ if input.index("]", index) == index
1425
+ r23 = instantiate_node(SyntaxNode,input, index...(index + 1))
1426
+ @index += 1
1427
+ else
1428
+ terminal_parse_failure("]")
1429
+ r23 = nil
1430
+ end
1431
+ s18 << r23
1432
+ end
1433
+ end
1434
+ end
1435
+ end
1436
+ if s18.last
1437
+ r18 = instantiate_node(SyntaxNode,input, i18...index, s18)
1438
+ r18.extend(OriginalAuthorsNamesFull4)
1439
+ r18.extend(OriginalAuthorsNamesFull5)
1440
+ else
1441
+ self.index = i18
1442
+ r18 = nil
1443
+ end
1444
+ if r18
1445
+ r0 = r18
1446
+ else
1447
+ i24, s24 = index, []
1448
+ r25 = _nt_left_bracket
1449
+ s24 << r25
1450
+ if r25
1451
+ r26 = _nt_space
1452
+ s24 << r26
1453
+ if r26
1454
+ r27 = _nt_unknown_auth
1455
+ s24 << r27
1456
+ if r27
1457
+ r28 = _nt_space
1458
+ s24 << r28
1459
+ if r28
1460
+ r29 = _nt_right_bracket
1461
+ s24 << r29
1462
+ end
1463
+ end
1464
+ end
1465
+ end
1466
+ if s24.last
1467
+ r24 = instantiate_node(SyntaxNode,input, i24...index, s24)
1468
+ r24.extend(OriginalAuthorsNamesFull6)
1469
+ r24.extend(OriginalAuthorsNamesFull7)
1470
+ else
1471
+ self.index = i24
1472
+ r24 = nil
1473
+ end
1474
+ if r24
1475
+ r0 = r24
1476
+ else
1477
+ i30, s30 = index, []
1478
+ r31 = _nt_left_bracket
1479
+ s30 << r31
1480
+ if r31
1481
+ r32 = _nt_space
1482
+ s30 << r32
1483
+ if r32
1484
+ if input.index("?", index) == index
1485
+ r33 = instantiate_node(SyntaxNode,input, index...(index + 1))
1486
+ @index += 1
1487
+ else
1488
+ terminal_parse_failure("?")
1489
+ r33 = nil
1490
+ end
1491
+ s30 << r33
1492
+ if r33
1493
+ r34 = _nt_space
1494
+ s30 << r34
1495
+ if r34
1496
+ r35 = _nt_right_bracket
1497
+ s30 << r35
1498
+ end
1499
+ end
1500
+ end
1501
+ end
1502
+ if s30.last
1503
+ r30 = instantiate_node(SyntaxNode,input, i30...index, s30)
1504
+ r30.extend(OriginalAuthorsNamesFull8)
1505
+ r30.extend(OriginalAuthorsNamesFull9)
1506
+ else
1507
+ self.index = i30
1508
+ r30 = nil
1509
+ end
1510
+ if r30
1511
+ r0 = r30
1512
+ else
1513
+ self.index = i0
1514
+ r0 = nil
1515
+ end
1516
+ end
1517
+ end
1518
+ end
1519
+ end
1520
+
1521
+ node_cache[:original_authors_names_full][start_index] = r0
1522
+
1523
+ return r0
1524
+ end
1525
+
1526
+ module OriginalAuthorsRevisedName0
1527
+ def left_bracket
1528
+ elements[0]
1529
+ end
1530
+
1531
+ def space
1532
+ elements[1]
1533
+ end
1534
+
1535
+ def a
1166
1536
  elements[2]
1167
1537
  end
1168
1538
 
@@ -1170,6 +1540,9 @@ module ScientificName
1170
1540
  elements[3]
1171
1541
  end
1172
1542
 
1543
+ def right_bracket
1544
+ elements[4]
1545
+ end
1173
1546
  end
1174
1547
 
1175
1548
  module OriginalAuthorsRevisedName1
@@ -1191,13 +1564,7 @@ module ScientificName
1191
1564
  end
1192
1565
 
1193
1566
  i0, s0 = index, []
1194
- if input.index("(", index) == index
1195
- r1 = instantiate_node(SyntaxNode,input, index...(index + 1))
1196
- @index += 1
1197
- else
1198
- terminal_parse_failure("(")
1199
- r1 = nil
1200
- end
1567
+ r1 = _nt_left_bracket
1201
1568
  s0 << r1
1202
1569
  if r1
1203
1570
  r2 = _nt_space
@@ -1209,13 +1576,7 @@ module ScientificName
1209
1576
  r4 = _nt_space
1210
1577
  s0 << r4
1211
1578
  if r4
1212
- if input.index(")", index) == index
1213
- r5 = instantiate_node(SyntaxNode,input, index...(index + 1))
1214
- @index += 1
1215
- else
1216
- terminal_parse_failure(")")
1217
- r5 = nil
1218
- end
1579
+ r5 = _nt_right_bracket
1219
1580
  s0 << r5
1220
1581
  end
1221
1582
  end
@@ -1387,8 +1748,13 @@ module ScientificName
1387
1748
  if r8
1388
1749
  r0 = r8
1389
1750
  else
1390
- self.index = i0
1391
- r0 = nil
1751
+ r9 = _nt_unknown_auth
1752
+ if r9
1753
+ r0 = r9
1754
+ else
1755
+ self.index = i0
1756
+ r0 = nil
1757
+ end
1392
1758
  end
1393
1759
  end
1394
1760
 
@@ -1397,6 +1763,80 @@ module ScientificName
1397
1763
  return r0
1398
1764
  end
1399
1765
 
1766
+ module UnknownAuth0
1767
+ def value
1768
+ text_value
1769
+ end
1770
+ def details
1771
+ {:authors => "unknown"}
1772
+ end
1773
+ end
1774
+
1775
+ def _nt_unknown_auth
1776
+ start_index = index
1777
+ if node_cache[:unknown_auth].has_key?(index)
1778
+ cached = node_cache[:unknown_auth][index]
1779
+ @index = cached.interval.end if cached
1780
+ return cached
1781
+ end
1782
+
1783
+ i0 = index
1784
+ if input.index("auct.", index) == index
1785
+ r1 = instantiate_node(SyntaxNode,input, index...(index + 5))
1786
+ @index += 5
1787
+ else
1788
+ terminal_parse_failure("auct.")
1789
+ r1 = nil
1790
+ end
1791
+ if r1
1792
+ r0 = r1
1793
+ r0.extend(UnknownAuth0)
1794
+ else
1795
+ if input.index("hort.", index) == index
1796
+ r2 = instantiate_node(SyntaxNode,input, index...(index + 5))
1797
+ @index += 5
1798
+ else
1799
+ terminal_parse_failure("hort.")
1800
+ r2 = nil
1801
+ end
1802
+ if r2
1803
+ r0 = r2
1804
+ r0.extend(UnknownAuth0)
1805
+ else
1806
+ if input.index("anon.", index) == index
1807
+ r3 = instantiate_node(SyntaxNode,input, index...(index + 5))
1808
+ @index += 5
1809
+ else
1810
+ terminal_parse_failure("anon.")
1811
+ r3 = nil
1812
+ end
1813
+ if r3
1814
+ r0 = r3
1815
+ r0.extend(UnknownAuth0)
1816
+ else
1817
+ if input.index("ht.", index) == index
1818
+ r4 = instantiate_node(SyntaxNode,input, index...(index + 3))
1819
+ @index += 3
1820
+ else
1821
+ terminal_parse_failure("ht.")
1822
+ r4 = nil
1823
+ end
1824
+ if r4
1825
+ r0 = r4
1826
+ r0.extend(UnknownAuth0)
1827
+ else
1828
+ self.index = i0
1829
+ r0 = nil
1830
+ end
1831
+ end
1832
+ end
1833
+ end
1834
+
1835
+ node_cache[:unknown_auth][start_index] = r0
1836
+
1837
+ return r0
1838
+ end
1839
+
1400
1840
  def _nt_ex_sep
1401
1841
  start_index = index
1402
1842
  if node_cache[:ex_sep].has_key?(index)
@@ -1693,9 +2133,18 @@ module ScientificName
1693
2133
  end
1694
2134
 
1695
2135
  module AuthorWord1
2136
+ def value
2137
+ text_value.strip
2138
+ end
2139
+ def details
2140
+ {:authors => {:names => [value]}}
2141
+ end
1696
2142
  end
1697
2143
 
1698
2144
  module AuthorWord2
2145
+ end
2146
+
2147
+ module AuthorWord3
1699
2148
  def value
1700
2149
  text_value.gsub(/\s+/, " ").strip
1701
2150
  end
@@ -1715,6 +2164,7 @@ module ScientificName
1715
2164
  i0 = index
1716
2165
  if input.index("A S. Xu", index) == index
1717
2166
  r1 = instantiate_node(SyntaxNode,input, index...(index + 7))
2167
+ r1.extend(AuthorWord0)
1718
2168
  @index += 7
1719
2169
  else
1720
2170
  terminal_parse_failure("A S. Xu")
@@ -1733,7 +2183,7 @@ module ScientificName
1733
2183
  end
1734
2184
  if r3
1735
2185
  r2 = r3
1736
- r2.extend(AuthorWord0)
2186
+ r2.extend(AuthorWord1)
1737
2187
  else
1738
2188
  if input.index("f.", index) == index
1739
2189
  r4 = instantiate_node(SyntaxNode,input, index...(index + 2))
@@ -1744,7 +2194,7 @@ module ScientificName
1744
2194
  end
1745
2195
  if r4
1746
2196
  r2 = r4
1747
- r2.extend(AuthorWord0)
2197
+ r2.extend(AuthorWord1)
1748
2198
  else
1749
2199
  if input.index("bis", index) == index
1750
2200
  r5 = instantiate_node(SyntaxNode,input, index...(index + 3))
@@ -1755,7 +2205,7 @@ module ScientificName
1755
2205
  end
1756
2206
  if r5
1757
2207
  r2 = r5
1758
- r2.extend(AuthorWord0)
2208
+ r2.extend(AuthorWord1)
1759
2209
  else
1760
2210
  if input.index("arg.", index) == index
1761
2211
  r6 = instantiate_node(SyntaxNode,input, index...(index + 4))
@@ -1766,7 +2216,7 @@ module ScientificName
1766
2216
  end
1767
2217
  if r6
1768
2218
  r2 = r6
1769
- r2.extend(AuthorWord0)
2219
+ r2.extend(AuthorWord1)
1770
2220
  else
1771
2221
  if input.index("da", index) == index
1772
2222
  r7 = instantiate_node(SyntaxNode,input, index...(index + 2))
@@ -1777,7 +2227,7 @@ module ScientificName
1777
2227
  end
1778
2228
  if r7
1779
2229
  r2 = r7
1780
- r2.extend(AuthorWord0)
2230
+ r2.extend(AuthorWord1)
1781
2231
  else
1782
2232
  if input.index("der", index) == index
1783
2233
  r8 = instantiate_node(SyntaxNode,input, index...(index + 3))
@@ -1788,7 +2238,7 @@ module ScientificName
1788
2238
  end
1789
2239
  if r8
1790
2240
  r2 = r8
1791
- r2.extend(AuthorWord0)
2241
+ r2.extend(AuthorWord1)
1792
2242
  else
1793
2243
  if input.index("den", index) == index
1794
2244
  r9 = instantiate_node(SyntaxNode,input, index...(index + 3))
@@ -1799,7 +2249,7 @@ module ScientificName
1799
2249
  end
1800
2250
  if r9
1801
2251
  r2 = r9
1802
- r2.extend(AuthorWord0)
2252
+ r2.extend(AuthorWord1)
1803
2253
  else
1804
2254
  if input.index("de", index) == index
1805
2255
  r10 = instantiate_node(SyntaxNode,input, index...(index + 2))
@@ -1810,7 +2260,7 @@ module ScientificName
1810
2260
  end
1811
2261
  if r10
1812
2262
  r2 = r10
1813
- r2.extend(AuthorWord0)
2263
+ r2.extend(AuthorWord1)
1814
2264
  else
1815
2265
  if input.index("du", index) == index
1816
2266
  r11 = instantiate_node(SyntaxNode,input, index...(index + 2))
@@ -1821,7 +2271,7 @@ module ScientificName
1821
2271
  end
1822
2272
  if r11
1823
2273
  r2 = r11
1824
- r2.extend(AuthorWord0)
2274
+ r2.extend(AuthorWord1)
1825
2275
  else
1826
2276
  if input.index("la", index) == index
1827
2277
  r12 = instantiate_node(SyntaxNode,input, index...(index + 2))
@@ -1832,7 +2282,7 @@ module ScientificName
1832
2282
  end
1833
2283
  if r12
1834
2284
  r2 = r12
1835
- r2.extend(AuthorWord0)
2285
+ r2.extend(AuthorWord1)
1836
2286
  else
1837
2287
  if input.index("ter", index) == index
1838
2288
  r13 = instantiate_node(SyntaxNode,input, index...(index + 3))
@@ -1843,7 +2293,7 @@ module ScientificName
1843
2293
  end
1844
2294
  if r13
1845
2295
  r2 = r13
1846
- r2.extend(AuthorWord0)
2296
+ r2.extend(AuthorWord1)
1847
2297
  else
1848
2298
  if input.index("van", index) == index
1849
2299
  r14 = instantiate_node(SyntaxNode,input, index...(index + 3))
@@ -1854,7 +2304,7 @@ module ScientificName
1854
2304
  end
1855
2305
  if r14
1856
2306
  r2 = r14
1857
- r2.extend(AuthorWord0)
2307
+ r2.extend(AuthorWord1)
1858
2308
  else
1859
2309
  if input.index("et al.\{\?\}", index) == index
1860
2310
  r15 = instantiate_node(SyntaxNode,input, index...(index + 9))
@@ -1865,7 +2315,7 @@ module ScientificName
1865
2315
  end
1866
2316
  if r15
1867
2317
  r2 = r15
1868
- r2.extend(AuthorWord0)
2318
+ r2.extend(AuthorWord1)
1869
2319
  else
1870
2320
  if input.index("et al.", index) == index
1871
2321
  r16 = instantiate_node(SyntaxNode,input, index...(index + 6))
@@ -1876,7 +2326,7 @@ module ScientificName
1876
2326
  end
1877
2327
  if r16
1878
2328
  r2 = r16
1879
- r2.extend(AuthorWord0)
2329
+ r2.extend(AuthorWord1)
1880
2330
  else
1881
2331
  self.index = i2
1882
2332
  r2 = nil
@@ -2069,8 +2519,8 @@ module ScientificName
2069
2519
  end
2070
2520
  if s17.last
2071
2521
  r17 = instantiate_node(SyntaxNode,input, i17...index, s17)
2072
- r17.extend(AuthorWord1)
2073
2522
  r17.extend(AuthorWord2)
2523
+ r17.extend(AuthorWord3)
2074
2524
  else
2075
2525
  self.index = i17
2076
2526
  r17 = nil
@@ -2658,371 +3108,372 @@ module ScientificName
2658
3108
  end
2659
3109
 
2660
3110
  i0 = index
2661
- if input.index("f.sp.", index) == index
2662
- r1 = instantiate_node(SyntaxNode,input, index...(index + 5))
2663
- @index += 5
3111
+ i1 = index
3112
+ if input.index("morph.", index) == index
3113
+ r2 = instantiate_node(SyntaxNode,input, index...(index + 6))
3114
+ @index += 6
2664
3115
  else
2665
- terminal_parse_failure("f.sp.")
2666
- r1 = nil
3116
+ terminal_parse_failure("morph.")
3117
+ r2 = nil
2667
3118
  end
2668
- if r1
2669
- r0 = r1
2670
- r0.extend(Rank0)
3119
+ if r2
3120
+ r1 = r2
3121
+ r1.extend(Rank0)
2671
3122
  else
2672
- if input.index("f.", index) == index
2673
- r2 = instantiate_node(SyntaxNode,input, index...(index + 2))
2674
- @index += 2
3123
+ if input.index("f.sp.", index) == index
3124
+ r3 = instantiate_node(SyntaxNode,input, index...(index + 5))
3125
+ @index += 5
2675
3126
  else
2676
- terminal_parse_failure("f.")
2677
- r2 = nil
3127
+ terminal_parse_failure("f.sp.")
3128
+ r3 = nil
2678
3129
  end
2679
- if r2
2680
- r0 = r2
2681
- r0.extend(Rank0)
3130
+ if r3
3131
+ r1 = r3
3132
+ r1.extend(Rank0)
2682
3133
  else
2683
3134
  if input.index("B", index) == index
2684
- r3 = instantiate_node(SyntaxNode,input, index...(index + 1))
3135
+ r4 = instantiate_node(SyntaxNode,input, index...(index + 1))
2685
3136
  @index += 1
2686
3137
  else
2687
3138
  terminal_parse_failure("B")
2688
- r3 = nil
3139
+ r4 = nil
2689
3140
  end
2690
- if r3
2691
- r0 = r3
2692
- r0.extend(Rank0)
3141
+ if r4
3142
+ r1 = r4
3143
+ r1.extend(Rank0)
2693
3144
  else
2694
3145
  if input.index("ssp.", index) == index
2695
- r4 = instantiate_node(SyntaxNode,input, index...(index + 4))
3146
+ r5 = instantiate_node(SyntaxNode,input, index...(index + 4))
2696
3147
  @index += 4
2697
3148
  else
2698
3149
  terminal_parse_failure("ssp.")
2699
- r4 = nil
3150
+ r5 = nil
2700
3151
  end
2701
- if r4
2702
- r0 = r4
2703
- r0.extend(Rank0)
3152
+ if r5
3153
+ r1 = r5
3154
+ r1.extend(Rank0)
2704
3155
  else
2705
3156
  if input.index("mut.", index) == index
2706
- r5 = instantiate_node(SyntaxNode,input, index...(index + 4))
3157
+ r6 = instantiate_node(SyntaxNode,input, index...(index + 4))
2707
3158
  @index += 4
2708
3159
  else
2709
3160
  terminal_parse_failure("mut.")
2710
- r5 = nil
3161
+ r6 = nil
2711
3162
  end
2712
- if r5
2713
- r0 = r5
2714
- r0.extend(Rank0)
3163
+ if r6
3164
+ r1 = r6
3165
+ r1.extend(Rank0)
2715
3166
  else
2716
3167
  if input.index("pseudovar.", index) == index
2717
- r6 = instantiate_node(SyntaxNode,input, index...(index + 10))
3168
+ r7 = instantiate_node(SyntaxNode,input, index...(index + 10))
2718
3169
  @index += 10
2719
3170
  else
2720
3171
  terminal_parse_failure("pseudovar.")
2721
- r6 = nil
3172
+ r7 = nil
2722
3173
  end
2723
- if r6
2724
- r0 = r6
2725
- r0.extend(Rank0)
3174
+ if r7
3175
+ r1 = r7
3176
+ r1.extend(Rank0)
2726
3177
  else
2727
3178
  if input.index("sect.", index) == index
2728
- r7 = instantiate_node(SyntaxNode,input, index...(index + 5))
3179
+ r8 = instantiate_node(SyntaxNode,input, index...(index + 5))
2729
3180
  @index += 5
2730
3181
  else
2731
3182
  terminal_parse_failure("sect.")
2732
- r7 = nil
3183
+ r8 = nil
2733
3184
  end
2734
- if r7
2735
- r0 = r7
2736
- r0.extend(Rank0)
3185
+ if r8
3186
+ r1 = r8
3187
+ r1.extend(Rank0)
2737
3188
  else
2738
3189
  if input.index("ser.", index) == index
2739
- r8 = instantiate_node(SyntaxNode,input, index...(index + 4))
3190
+ r9 = instantiate_node(SyntaxNode,input, index...(index + 4))
2740
3191
  @index += 4
2741
3192
  else
2742
3193
  terminal_parse_failure("ser.")
2743
- r8 = nil
3194
+ r9 = nil
2744
3195
  end
2745
- if r8
2746
- r0 = r8
2747
- r0.extend(Rank0)
3196
+ if r9
3197
+ r1 = r9
3198
+ r1.extend(Rank0)
2748
3199
  else
2749
3200
  if input.index("var.", index) == index
2750
- r9 = instantiate_node(SyntaxNode,input, index...(index + 4))
3201
+ r10 = instantiate_node(SyntaxNode,input, index...(index + 4))
2751
3202
  @index += 4
2752
3203
  else
2753
3204
  terminal_parse_failure("var.")
2754
- r9 = nil
3205
+ r10 = nil
2755
3206
  end
2756
- if r9
2757
- r0 = r9
2758
- r0.extend(Rank0)
3207
+ if r10
3208
+ r1 = r10
3209
+ r1.extend(Rank0)
2759
3210
  else
2760
3211
  if input.index("subvar.", index) == index
2761
- r10 = instantiate_node(SyntaxNode,input, index...(index + 7))
3212
+ r11 = instantiate_node(SyntaxNode,input, index...(index + 7))
2762
3213
  @index += 7
2763
3214
  else
2764
3215
  terminal_parse_failure("subvar.")
2765
- r10 = nil
3216
+ r11 = nil
2766
3217
  end
2767
- if r10
2768
- r0 = r10
2769
- r0.extend(Rank0)
3218
+ if r11
3219
+ r1 = r11
3220
+ r1.extend(Rank0)
2770
3221
  else
2771
3222
  if input.index("[var.]", index) == index
2772
- r11 = instantiate_node(SyntaxNode,input, index...(index + 6))
3223
+ r12 = instantiate_node(SyntaxNode,input, index...(index + 6))
2773
3224
  @index += 6
2774
3225
  else
2775
3226
  terminal_parse_failure("[var.]")
2776
- r11 = nil
3227
+ r12 = nil
2777
3228
  end
2778
- if r11
2779
- r0 = r11
2780
- r0.extend(Rank0)
3229
+ if r12
3230
+ r1 = r12
3231
+ r1.extend(Rank0)
2781
3232
  else
2782
3233
  if input.index("subsp.", index) == index
2783
- r12 = instantiate_node(SyntaxNode,input, index...(index + 6))
3234
+ r13 = instantiate_node(SyntaxNode,input, index...(index + 6))
2784
3235
  @index += 6
2785
3236
  else
2786
3237
  terminal_parse_failure("subsp.")
2787
- r12 = nil
3238
+ r13 = nil
2788
3239
  end
2789
- if r12
2790
- r0 = r12
2791
- r0.extend(Rank0)
3240
+ if r13
3241
+ r1 = r13
3242
+ r1.extend(Rank0)
2792
3243
  else
2793
3244
  if input.index("subf.", index) == index
2794
- r13 = instantiate_node(SyntaxNode,input, index...(index + 5))
3245
+ r14 = instantiate_node(SyntaxNode,input, index...(index + 5))
2795
3246
  @index += 5
2796
3247
  else
2797
3248
  terminal_parse_failure("subf.")
2798
- r13 = nil
3249
+ r14 = nil
2799
3250
  end
2800
- if r13
2801
- r0 = r13
2802
- r0.extend(Rank0)
3251
+ if r14
3252
+ r1 = r14
3253
+ r1.extend(Rank0)
2803
3254
  else
2804
3255
  if input.index("race", index) == index
2805
- r14 = instantiate_node(SyntaxNode,input, index...(index + 4))
3256
+ r15 = instantiate_node(SyntaxNode,input, index...(index + 4))
2806
3257
  @index += 4
2807
3258
  else
2808
3259
  terminal_parse_failure("race")
2809
- r14 = nil
3260
+ r15 = nil
2810
3261
  end
2811
- if r14
2812
- r0 = r14
2813
- r0.extend(Rank0)
3262
+ if r15
3263
+ r1 = r15
3264
+ r1.extend(Rank0)
2814
3265
  else
2815
3266
  if input.index("α", index) == index
2816
- r15 = instantiate_node(SyntaxNode,input, index...(index + 1))
3267
+ r16 = instantiate_node(SyntaxNode,input, index...(index + 1))
2817
3268
  @index += 1
2818
3269
  else
2819
3270
  terminal_parse_failure("α")
2820
- r15 = nil
3271
+ r16 = nil
2821
3272
  end
2822
- if r15
2823
- r0 = r15
2824
- r0.extend(Rank0)
3273
+ if r16
3274
+ r1 = r16
3275
+ r1.extend(Rank0)
2825
3276
  else
2826
3277
  if input.index("ββ", index) == index
2827
- r16 = instantiate_node(SyntaxNode,input, index...(index + 2))
3278
+ r17 = instantiate_node(SyntaxNode,input, index...(index + 2))
2828
3279
  @index += 2
2829
3280
  else
2830
3281
  terminal_parse_failure("ββ")
2831
- r16 = nil
3282
+ r17 = nil
2832
3283
  end
2833
- if r16
2834
- r0 = r16
2835
- r0.extend(Rank0)
3284
+ if r17
3285
+ r1 = r17
3286
+ r1.extend(Rank0)
2836
3287
  else
2837
3288
  if input.index("β", index) == index
2838
- r17 = instantiate_node(SyntaxNode,input, index...(index + 1))
3289
+ r18 = instantiate_node(SyntaxNode,input, index...(index + 1))
2839
3290
  @index += 1
2840
3291
  else
2841
3292
  terminal_parse_failure("β")
2842
- r17 = nil
3293
+ r18 = nil
2843
3294
  end
2844
- if r17
2845
- r0 = r17
2846
- r0.extend(Rank0)
3295
+ if r18
3296
+ r1 = r18
3297
+ r1.extend(Rank0)
2847
3298
  else
2848
3299
  if input.index("γ", index) == index
2849
- r18 = instantiate_node(SyntaxNode,input, index...(index + 1))
3300
+ r19 = instantiate_node(SyntaxNode,input, index...(index + 1))
2850
3301
  @index += 1
2851
3302
  else
2852
3303
  terminal_parse_failure("γ")
2853
- r18 = nil
3304
+ r19 = nil
2854
3305
  end
2855
- if r18
2856
- r0 = r18
2857
- r0.extend(Rank0)
3306
+ if r19
3307
+ r1 = r19
3308
+ r1.extend(Rank0)
2858
3309
  else
2859
3310
  if input.index("δ", index) == index
2860
- r19 = instantiate_node(SyntaxNode,input, index...(index + 1))
3311
+ r20 = instantiate_node(SyntaxNode,input, index...(index + 1))
2861
3312
  @index += 1
2862
3313
  else
2863
3314
  terminal_parse_failure("δ")
2864
- r19 = nil
3315
+ r20 = nil
2865
3316
  end
2866
- if r19
2867
- r0 = r19
2868
- r0.extend(Rank0)
3317
+ if r20
3318
+ r1 = r20
3319
+ r1.extend(Rank0)
2869
3320
  else
2870
3321
  if input.index("ε", index) == index
2871
- r20 = instantiate_node(SyntaxNode,input, index...(index + 1))
3322
+ r21 = instantiate_node(SyntaxNode,input, index...(index + 1))
2872
3323
  @index += 1
2873
3324
  else
2874
3325
  terminal_parse_failure("ε")
2875
- r20 = nil
3326
+ r21 = nil
2876
3327
  end
2877
- if r20
2878
- r0 = r20
2879
- r0.extend(Rank0)
3328
+ if r21
3329
+ r1 = r21
3330
+ r1.extend(Rank0)
2880
3331
  else
2881
3332
  if input.index("φ", index) == index
2882
- r21 = instantiate_node(SyntaxNode,input, index...(index + 1))
3333
+ r22 = instantiate_node(SyntaxNode,input, index...(index + 1))
2883
3334
  @index += 1
2884
3335
  else
2885
3336
  terminal_parse_failure("φ")
2886
- r21 = nil
3337
+ r22 = nil
2887
3338
  end
2888
- if r21
2889
- r0 = r21
2890
- r0.extend(Rank0)
3339
+ if r22
3340
+ r1 = r22
3341
+ r1.extend(Rank0)
2891
3342
  else
2892
3343
  if input.index("θ", index) == index
2893
- r22 = instantiate_node(SyntaxNode,input, index...(index + 1))
3344
+ r23 = instantiate_node(SyntaxNode,input, index...(index + 1))
2894
3345
  @index += 1
2895
3346
  else
2896
3347
  terminal_parse_failure("θ")
2897
- r22 = nil
3348
+ r23 = nil
2898
3349
  end
2899
- if r22
2900
- r0 = r22
2901
- r0.extend(Rank0)
3350
+ if r23
3351
+ r1 = r23
3352
+ r1.extend(Rank0)
2902
3353
  else
2903
3354
  if input.index("μ", index) == index
2904
- r23 = instantiate_node(SyntaxNode,input, index...(index + 1))
3355
+ r24 = instantiate_node(SyntaxNode,input, index...(index + 1))
2905
3356
  @index += 1
2906
3357
  else
2907
3358
  terminal_parse_failure("μ")
2908
- r23 = nil
3359
+ r24 = nil
2909
3360
  end
2910
- if r23
2911
- r0 = r23
2912
- r0.extend(Rank0)
3361
+ if r24
3362
+ r1 = r24
3363
+ r1.extend(Rank0)
2913
3364
  else
2914
3365
  if input.index("a.", index) == index
2915
- r24 = instantiate_node(SyntaxNode,input, index...(index + 2))
3366
+ r25 = instantiate_node(SyntaxNode,input, index...(index + 2))
2916
3367
  @index += 2
2917
3368
  else
2918
3369
  terminal_parse_failure("a.")
2919
- r24 = nil
3370
+ r25 = nil
2920
3371
  end
2921
- if r24
2922
- r0 = r24
2923
- r0.extend(Rank0)
3372
+ if r25
3373
+ r1 = r25
3374
+ r1.extend(Rank0)
2924
3375
  else
2925
3376
  if input.index("b.", index) == index
2926
- r25 = instantiate_node(SyntaxNode,input, index...(index + 2))
3377
+ r26 = instantiate_node(SyntaxNode,input, index...(index + 2))
2927
3378
  @index += 2
2928
3379
  else
2929
3380
  terminal_parse_failure("b.")
2930
- r25 = nil
3381
+ r26 = nil
2931
3382
  end
2932
- if r25
2933
- r0 = r25
2934
- r0.extend(Rank0)
3383
+ if r26
3384
+ r1 = r26
3385
+ r1.extend(Rank0)
2935
3386
  else
2936
3387
  if input.index("c.", index) == index
2937
- r26 = instantiate_node(SyntaxNode,input, index...(index + 2))
3388
+ r27 = instantiate_node(SyntaxNode,input, index...(index + 2))
2938
3389
  @index += 2
2939
3390
  else
2940
3391
  terminal_parse_failure("c.")
2941
- r26 = nil
3392
+ r27 = nil
2942
3393
  end
2943
- if r26
2944
- r0 = r26
2945
- r0.extend(Rank0)
3394
+ if r27
3395
+ r1 = r27
3396
+ r1.extend(Rank0)
2946
3397
  else
2947
3398
  if input.index("d.", index) == index
2948
- r27 = instantiate_node(SyntaxNode,input, index...(index + 2))
3399
+ r28 = instantiate_node(SyntaxNode,input, index...(index + 2))
2949
3400
  @index += 2
2950
3401
  else
2951
3402
  terminal_parse_failure("d.")
2952
- r27 = nil
3403
+ r28 = nil
2953
3404
  end
2954
- if r27
2955
- r0 = r27
2956
- r0.extend(Rank0)
3405
+ if r28
3406
+ r1 = r28
3407
+ r1.extend(Rank0)
2957
3408
  else
2958
3409
  if input.index("e.", index) == index
2959
- r28 = instantiate_node(SyntaxNode,input, index...(index + 2))
3410
+ r29 = instantiate_node(SyntaxNode,input, index...(index + 2))
2960
3411
  @index += 2
2961
3412
  else
2962
3413
  terminal_parse_failure("e.")
2963
- r28 = nil
3414
+ r29 = nil
2964
3415
  end
2965
- if r28
2966
- r0 = r28
2967
- r0.extend(Rank0)
3416
+ if r29
3417
+ r1 = r29
3418
+ r1.extend(Rank0)
2968
3419
  else
2969
3420
  if input.index("g.", index) == index
2970
- r29 = instantiate_node(SyntaxNode,input, index...(index + 2))
3421
+ r30 = instantiate_node(SyntaxNode,input, index...(index + 2))
2971
3422
  @index += 2
2972
3423
  else
2973
3424
  terminal_parse_failure("g.")
2974
- r29 = nil
3425
+ r30 = nil
2975
3426
  end
2976
- if r29
2977
- r0 = r29
2978
- r0.extend(Rank0)
3427
+ if r30
3428
+ r1 = r30
3429
+ r1.extend(Rank0)
2979
3430
  else
2980
3431
  if input.index("k.", index) == index
2981
- r30 = instantiate_node(SyntaxNode,input, index...(index + 2))
3432
+ r31 = instantiate_node(SyntaxNode,input, index...(index + 2))
2982
3433
  @index += 2
2983
3434
  else
2984
3435
  terminal_parse_failure("k.")
2985
- r30 = nil
3436
+ r31 = nil
2986
3437
  end
2987
- if r30
2988
- r0 = r30
2989
- r0.extend(Rank0)
3438
+ if r31
3439
+ r1 = r31
3440
+ r1.extend(Rank0)
2990
3441
  else
2991
3442
  if input.index("****", index) == index
2992
- r31 = instantiate_node(SyntaxNode,input, index...(index + 4))
3443
+ r32 = instantiate_node(SyntaxNode,input, index...(index + 4))
2993
3444
  @index += 4
2994
3445
  else
2995
3446
  terminal_parse_failure("****")
2996
- r31 = nil
3447
+ r32 = nil
2997
3448
  end
2998
- if r31
2999
- r0 = r31
3000
- r0.extend(Rank0)
3449
+ if r32
3450
+ r1 = r32
3451
+ r1.extend(Rank0)
3001
3452
  else
3002
3453
  if input.index("**", index) == index
3003
- r32 = instantiate_node(SyntaxNode,input, index...(index + 2))
3454
+ r33 = instantiate_node(SyntaxNode,input, index...(index + 2))
3004
3455
  @index += 2
3005
3456
  else
3006
3457
  terminal_parse_failure("**")
3007
- r32 = nil
3458
+ r33 = nil
3008
3459
  end
3009
- if r32
3010
- r0 = r32
3011
- r0.extend(Rank0)
3460
+ if r33
3461
+ r1 = r33
3462
+ r1.extend(Rank0)
3012
3463
  else
3013
3464
  if input.index("*", index) == index
3014
- r33 = instantiate_node(SyntaxNode,input, index...(index + 1))
3465
+ r34 = instantiate_node(SyntaxNode,input, index...(index + 1))
3015
3466
  @index += 1
3016
3467
  else
3017
3468
  terminal_parse_failure("*")
3018
- r33 = nil
3469
+ r34 = nil
3019
3470
  end
3020
- if r33
3021
- r0 = r33
3022
- r0.extend(Rank0)
3471
+ if r34
3472
+ r1 = r34
3473
+ r1.extend(Rank0)
3023
3474
  else
3024
- self.index = i0
3025
- r0 = nil
3475
+ self.index = i1
3476
+ r1 = nil
3026
3477
  end
3027
3478
  end
3028
3479
  end
@@ -3056,61 +3507,152 @@ module ScientificName
3056
3507
  end
3057
3508
  end
3058
3509
  end
3510
+ if r1
3511
+ r0 = r1
3512
+ else
3513
+ r35 = _nt_rank_forma
3514
+ if r35
3515
+ r0 = r35
3516
+ else
3517
+ self.index = i0
3518
+ r0 = nil
3519
+ end
3520
+ end
3059
3521
 
3060
3522
  node_cache[:rank][start_index] = r0
3061
3523
 
3062
3524
  return r0
3063
3525
  end
3064
3526
 
3065
- module SpeciesName0
3066
- def hybrid_separator
3067
- elements[0]
3068
- end
3069
-
3070
- def space_hard
3071
- elements[1]
3072
- end
3073
-
3074
- def a
3075
- elements[2]
3076
- end
3077
-
3078
- def space_hard
3079
- elements[3]
3080
- end
3081
-
3082
- def b
3083
- elements[4]
3084
- end
3085
- end
3086
-
3087
- module SpeciesName1
3527
+ module RankForma0
3088
3528
  def value
3089
- "× " + a.value + " " + b.value
3529
+ "f."
3090
3530
  end
3091
- def canonical
3092
- a.value + " " + b.value
3531
+ def apply(a)
3532
+ " " + value + " " + a.value
3093
3533
  end
3094
- def details
3095
- {:genus => a.value, :species => b.value, :cross => 'before'}
3534
+ def canonical(a)
3535
+ " " + a.value
3096
3536
  end
3097
- end
3098
-
3099
- module SpeciesName2
3100
- def hybrid_separator
3101
- elements[0]
3537
+ def details(a = nil)
3538
+ {:subspecies => [{:rank => value, :value => (a.value rescue nil)}]}
3102
3539
  end
3540
+ end
3103
3541
 
3104
- def space_hard
3105
- elements[1]
3542
+ def _nt_rank_forma
3543
+ start_index = index
3544
+ if node_cache[:rank_forma].has_key?(index)
3545
+ cached = node_cache[:rank_forma][index]
3546
+ @index = cached.interval.end if cached
3547
+ return cached
3106
3548
  end
3107
3549
 
3108
- def a
3109
- elements[2]
3550
+ i0 = index
3551
+ if input.index("forma", index) == index
3552
+ r1 = instantiate_node(SyntaxNode,input, index...(index + 5))
3553
+ @index += 5
3554
+ else
3555
+ terminal_parse_failure("forma")
3556
+ r1 = nil
3110
3557
  end
3111
- end
3112
-
3113
- module SpeciesName3
3558
+ if r1
3559
+ r0 = r1
3560
+ r0.extend(RankForma0)
3561
+ else
3562
+ if input.index("form.", index) == index
3563
+ r2 = instantiate_node(SyntaxNode,input, index...(index + 5))
3564
+ @index += 5
3565
+ else
3566
+ terminal_parse_failure("form.")
3567
+ r2 = nil
3568
+ end
3569
+ if r2
3570
+ r0 = r2
3571
+ r0.extend(RankForma0)
3572
+ else
3573
+ if input.index("fo.", index) == index
3574
+ r3 = instantiate_node(SyntaxNode,input, index...(index + 3))
3575
+ @index += 3
3576
+ else
3577
+ terminal_parse_failure("fo.")
3578
+ r3 = nil
3579
+ end
3580
+ if r3
3581
+ r0 = r3
3582
+ r0.extend(RankForma0)
3583
+ else
3584
+ if input.index("f.", index) == index
3585
+ r4 = instantiate_node(SyntaxNode,input, index...(index + 2))
3586
+ @index += 2
3587
+ else
3588
+ terminal_parse_failure("f.")
3589
+ r4 = nil
3590
+ end
3591
+ if r4
3592
+ r0 = r4
3593
+ r0.extend(RankForma0)
3594
+ else
3595
+ self.index = i0
3596
+ r0 = nil
3597
+ end
3598
+ end
3599
+ end
3600
+ end
3601
+
3602
+ node_cache[:rank_forma][start_index] = r0
3603
+
3604
+ return r0
3605
+ end
3606
+
3607
+ module SpeciesName0
3608
+ def hybrid_separator
3609
+ elements[0]
3610
+ end
3611
+
3612
+ def space_hard
3613
+ elements[1]
3614
+ end
3615
+
3616
+ def a
3617
+ elements[2]
3618
+ end
3619
+
3620
+ def space_hard
3621
+ elements[3]
3622
+ end
3623
+
3624
+ def b
3625
+ elements[4]
3626
+ end
3627
+ end
3628
+
3629
+ module SpeciesName1
3630
+ def value
3631
+ "× " + a.value + " " + b.value
3632
+ end
3633
+ def canonical
3634
+ a.value + " " + b.value
3635
+ end
3636
+ def details
3637
+ {:genus => a.value, :species => b.value, :cross => 'before'}
3638
+ end
3639
+ end
3640
+
3641
+ module SpeciesName2
3642
+ def hybrid_separator
3643
+ elements[0]
3644
+ end
3645
+
3646
+ def space_hard
3647
+ elements[1]
3648
+ end
3649
+
3650
+ def a
3651
+ elements[2]
3652
+ end
3653
+ end
3654
+
3655
+ module SpeciesName3
3114
3656
  def value
3115
3657
  "× " + a.value
3116
3658
  end
@@ -3450,6 +3992,120 @@ module ScientificName
3450
3992
  return r0
3451
3993
  end
3452
3994
 
3995
+ module TaxonConceptRank0
3996
+ def value
3997
+ "sec."
3998
+ end
3999
+ def apply(a)
4000
+ " " + value + " " + a.value
4001
+ end
4002
+ def details(a = nil)
4003
+ {:taxon_concept => a.details}
4004
+ end
4005
+ end
4006
+
4007
+ def _nt_taxon_concept_rank
4008
+ start_index = index
4009
+ if node_cache[:taxon_concept_rank].has_key?(index)
4010
+ cached = node_cache[:taxon_concept_rank][index]
4011
+ @index = cached.interval.end if cached
4012
+ return cached
4013
+ end
4014
+
4015
+ if input.index("sec.", index) == index
4016
+ r0 = instantiate_node(SyntaxNode,input, index...(index + 4))
4017
+ r0.extend(TaxonConceptRank0)
4018
+ @index += 4
4019
+ else
4020
+ terminal_parse_failure("sec.")
4021
+ r0 = nil
4022
+ end
4023
+
4024
+ node_cache[:taxon_concept_rank][start_index] = r0
4025
+
4026
+ return r0
4027
+ end
4028
+
4029
+ module GenusRank0
4030
+ def value
4031
+ text_value.strip
4032
+ end
4033
+ def apply(a)
4034
+ " " + text_value + " " + a.value
4035
+ end
4036
+ def canonical(a)
4037
+ " " + a.value
4038
+ end
4039
+ def details(a = nil)
4040
+ {:subgenus => [{:rank => text_value, :value => (a.value rescue nil)}]}
4041
+ end
4042
+ end
4043
+
4044
+ def _nt_genus_rank
4045
+ start_index = index
4046
+ if node_cache[:genus_rank].has_key?(index)
4047
+ cached = node_cache[:genus_rank][index]
4048
+ @index = cached.interval.end if cached
4049
+ return cached
4050
+ end
4051
+
4052
+ i0 = index
4053
+ if input.index("subsect.", index) == index
4054
+ r1 = instantiate_node(SyntaxNode,input, index...(index + 8))
4055
+ @index += 8
4056
+ else
4057
+ terminal_parse_failure("subsect.")
4058
+ r1 = nil
4059
+ end
4060
+ if r1
4061
+ r0 = r1
4062
+ r0.extend(GenusRank0)
4063
+ else
4064
+ if input.index("subtrib.", index) == index
4065
+ r2 = instantiate_node(SyntaxNode,input, index...(index + 8))
4066
+ @index += 8
4067
+ else
4068
+ terminal_parse_failure("subtrib.")
4069
+ r2 = nil
4070
+ end
4071
+ if r2
4072
+ r0 = r2
4073
+ r0.extend(GenusRank0)
4074
+ else
4075
+ if input.index("subgen.", index) == index
4076
+ r3 = instantiate_node(SyntaxNode,input, index...(index + 7))
4077
+ @index += 7
4078
+ else
4079
+ terminal_parse_failure("subgen.")
4080
+ r3 = nil
4081
+ end
4082
+ if r3
4083
+ r0 = r3
4084
+ r0.extend(GenusRank0)
4085
+ else
4086
+ if input.index("trib.", index) == index
4087
+ r4 = instantiate_node(SyntaxNode,input, index...(index + 5))
4088
+ @index += 5
4089
+ else
4090
+ terminal_parse_failure("trib.")
4091
+ r4 = nil
4092
+ end
4093
+ if r4
4094
+ r0 = r4
4095
+ r0.extend(GenusRank0)
4096
+ else
4097
+ self.index = i0
4098
+ r0 = nil
4099
+ end
4100
+ end
4101
+ end
4102
+ end
4103
+
4104
+ node_cache[:genus_rank][start_index] = r0
4105
+
4106
+ return r0
4107
+ end
4108
+
3453
4109
  module CapLatinWord0
3454
4110
  def a
3455
4111
  elements[0]
@@ -3458,6 +4114,7 @@ module ScientificName
3458
4114
  def b
3459
4115
  elements[1]
3460
4116
  end
4117
+
3461
4118
  end
3462
4119
 
3463
4120
  module CapLatinWord1
@@ -3474,6 +4131,44 @@ module ScientificName
3474
4131
  end
3475
4132
  end
3476
4133
 
4134
+ module CapLatinWord2
4135
+ def a
4136
+ elements[0]
4137
+ end
4138
+
4139
+ def b
4140
+ elements[1]
4141
+ end
4142
+ end
4143
+
4144
+ module CapLatinWord3
4145
+ def value
4146
+ a.text_value + b.value
4147
+ end
4148
+
4149
+ def canonical
4150
+ value
4151
+ end
4152
+
4153
+ def details
4154
+ {:uninomial => value}
4155
+ end
4156
+ end
4157
+
4158
+ module CapLatinWord4
4159
+ def value
4160
+ text_value
4161
+ end
4162
+
4163
+ def canonical
4164
+ value
4165
+ end
4166
+
4167
+ def details
4168
+ {:uninomial => value}
4169
+ end
4170
+ end
4171
+
3477
4172
  def _nt_cap_latin_word
3478
4173
  start_index = index
3479
4174
  if node_cache[:cap_latin_word].has_key?(index)
@@ -3482,25 +4177,301 @@ module ScientificName
3482
4177
  return cached
3483
4178
  end
3484
4179
 
3485
- i0, s0 = index, []
3486
- if input.index(Regexp.new('[A-Z]'), index) == index
3487
- r1 = instantiate_node(SyntaxNode,input, index...(index + 1))
4180
+ i0 = index
4181
+ i1, s1 = index, []
4182
+ if input.index(Regexp.new('[A-Zή]'), index) == index
4183
+ r2 = instantiate_node(SyntaxNode,input, index...(index + 1))
3488
4184
  @index += 1
3489
4185
  else
4186
+ r2 = nil
4187
+ end
4188
+ s1 << r2
4189
+ if r2
4190
+ r3 = _nt_latin_word
4191
+ s1 << r3
4192
+ if r3
4193
+ if input.index("?", index) == index
4194
+ r4 = instantiate_node(SyntaxNode,input, index...(index + 1))
4195
+ @index += 1
4196
+ else
4197
+ terminal_parse_failure("?")
4198
+ r4 = nil
4199
+ end
4200
+ s1 << r4
4201
+ end
4202
+ end
4203
+ if s1.last
4204
+ r1 = instantiate_node(SyntaxNode,input, i1...index, s1)
4205
+ r1.extend(CapLatinWord0)
4206
+ r1.extend(CapLatinWord1)
4207
+ else
4208
+ self.index = i1
3490
4209
  r1 = nil
3491
4210
  end
3492
- s0 << r1
3493
4211
  if r1
3494
- r2 = _nt_latin_word
3495
- s0 << r2
3496
- end
3497
- if s0.last
3498
- r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
3499
- r0.extend(CapLatinWord0)
3500
- r0.extend(CapLatinWord1)
4212
+ r0 = r1
3501
4213
  else
3502
- self.index = i0
3503
- r0 = nil
4214
+ i5, s5 = index, []
4215
+ if input.index(Regexp.new('[A-Zή]'), index) == index
4216
+ r6 = instantiate_node(SyntaxNode,input, index...(index + 1))
4217
+ @index += 1
4218
+ else
4219
+ r6 = nil
4220
+ end
4221
+ s5 << r6
4222
+ if r6
4223
+ r7 = _nt_latin_word
4224
+ s5 << r7
4225
+ end
4226
+ if s5.last
4227
+ r5 = instantiate_node(SyntaxNode,input, i5...index, s5)
4228
+ r5.extend(CapLatinWord2)
4229
+ r5.extend(CapLatinWord3)
4230
+ else
4231
+ self.index = i5
4232
+ r5 = nil
4233
+ end
4234
+ if r5
4235
+ r0 = r5
4236
+ else
4237
+ i8 = index
4238
+ if input.index("Ca", index) == index
4239
+ r9 = instantiate_node(SyntaxNode,input, index...(index + 2))
4240
+ @index += 2
4241
+ else
4242
+ terminal_parse_failure("Ca")
4243
+ r9 = nil
4244
+ end
4245
+ if r9
4246
+ r8 = r9
4247
+ r8.extend(CapLatinWord4)
4248
+ else
4249
+ if input.index("Ea", index) == index
4250
+ r10 = instantiate_node(SyntaxNode,input, index...(index + 2))
4251
+ @index += 2
4252
+ else
4253
+ terminal_parse_failure("Ea")
4254
+ r10 = nil
4255
+ end
4256
+ if r10
4257
+ r8 = r10
4258
+ r8.extend(CapLatinWord4)
4259
+ else
4260
+ if input.index("Ge", index) == index
4261
+ r11 = instantiate_node(SyntaxNode,input, index...(index + 2))
4262
+ @index += 2
4263
+ else
4264
+ terminal_parse_failure("Ge")
4265
+ r11 = nil
4266
+ end
4267
+ if r11
4268
+ r8 = r11
4269
+ r8.extend(CapLatinWord4)
4270
+ else
4271
+ if input.index("Ia", index) == index
4272
+ r12 = instantiate_node(SyntaxNode,input, index...(index + 2))
4273
+ @index += 2
4274
+ else
4275
+ terminal_parse_failure("Ia")
4276
+ r12 = nil
4277
+ end
4278
+ if r12
4279
+ r8 = r12
4280
+ r8.extend(CapLatinWord4)
4281
+ else
4282
+ if input.index("Io", index) == index
4283
+ r13 = instantiate_node(SyntaxNode,input, index...(index + 2))
4284
+ @index += 2
4285
+ else
4286
+ terminal_parse_failure("Io")
4287
+ r13 = nil
4288
+ end
4289
+ if r13
4290
+ r8 = r13
4291
+ r8.extend(CapLatinWord4)
4292
+ else
4293
+ if input.index("Io", index) == index
4294
+ r14 = instantiate_node(SyntaxNode,input, index...(index + 2))
4295
+ @index += 2
4296
+ else
4297
+ terminal_parse_failure("Io")
4298
+ r14 = nil
4299
+ end
4300
+ if r14
4301
+ r8 = r14
4302
+ r8.extend(CapLatinWord4)
4303
+ else
4304
+ if input.index("Ix", index) == index
4305
+ r15 = instantiate_node(SyntaxNode,input, index...(index + 2))
4306
+ @index += 2
4307
+ else
4308
+ terminal_parse_failure("Ix")
4309
+ r15 = nil
4310
+ end
4311
+ if r15
4312
+ r8 = r15
4313
+ r8.extend(CapLatinWord4)
4314
+ else
4315
+ if input.index("Lo", index) == index
4316
+ r16 = instantiate_node(SyntaxNode,input, index...(index + 2))
4317
+ @index += 2
4318
+ else
4319
+ terminal_parse_failure("Lo")
4320
+ r16 = nil
4321
+ end
4322
+ if r16
4323
+ r8 = r16
4324
+ r8.extend(CapLatinWord4)
4325
+ else
4326
+ if input.index("Oa", index) == index
4327
+ r17 = instantiate_node(SyntaxNode,input, index...(index + 2))
4328
+ @index += 2
4329
+ else
4330
+ terminal_parse_failure("Oa")
4331
+ r17 = nil
4332
+ end
4333
+ if r17
4334
+ r8 = r17
4335
+ r8.extend(CapLatinWord4)
4336
+ else
4337
+ if input.index("Ra", index) == index
4338
+ r18 = instantiate_node(SyntaxNode,input, index...(index + 2))
4339
+ @index += 2
4340
+ else
4341
+ terminal_parse_failure("Ra")
4342
+ r18 = nil
4343
+ end
4344
+ if r18
4345
+ r8 = r18
4346
+ r8.extend(CapLatinWord4)
4347
+ else
4348
+ if input.index("Ty", index) == index
4349
+ r19 = instantiate_node(SyntaxNode,input, index...(index + 2))
4350
+ @index += 2
4351
+ else
4352
+ terminal_parse_failure("Ty")
4353
+ r19 = nil
4354
+ end
4355
+ if r19
4356
+ r8 = r19
4357
+ r8.extend(CapLatinWord4)
4358
+ else
4359
+ if input.index("Ua", index) == index
4360
+ r20 = instantiate_node(SyntaxNode,input, index...(index + 2))
4361
+ @index += 2
4362
+ else
4363
+ terminal_parse_failure("Ua")
4364
+ r20 = nil
4365
+ end
4366
+ if r20
4367
+ r8 = r20
4368
+ r8.extend(CapLatinWord4)
4369
+ else
4370
+ if input.index("Aa", index) == index
4371
+ r21 = instantiate_node(SyntaxNode,input, index...(index + 2))
4372
+ @index += 2
4373
+ else
4374
+ terminal_parse_failure("Aa")
4375
+ r21 = nil
4376
+ end
4377
+ if r21
4378
+ r8 = r21
4379
+ r8.extend(CapLatinWord4)
4380
+ else
4381
+ if input.index("Ja", index) == index
4382
+ r22 = instantiate_node(SyntaxNode,input, index...(index + 2))
4383
+ @index += 2
4384
+ else
4385
+ terminal_parse_failure("Ja")
4386
+ r22 = nil
4387
+ end
4388
+ if r22
4389
+ r8 = r22
4390
+ r8.extend(CapLatinWord4)
4391
+ else
4392
+ if input.index("Zu", index) == index
4393
+ r23 = instantiate_node(SyntaxNode,input, index...(index + 2))
4394
+ @index += 2
4395
+ else
4396
+ terminal_parse_failure("Zu")
4397
+ r23 = nil
4398
+ end
4399
+ if r23
4400
+ r8 = r23
4401
+ r8.extend(CapLatinWord4)
4402
+ else
4403
+ if input.index("La", index) == index
4404
+ r24 = instantiate_node(SyntaxNode,input, index...(index + 2))
4405
+ @index += 2
4406
+ else
4407
+ terminal_parse_failure("La")
4408
+ r24 = nil
4409
+ end
4410
+ if r24
4411
+ r8 = r24
4412
+ r8.extend(CapLatinWord4)
4413
+ else
4414
+ if input.index("Qu", index) == index
4415
+ r25 = instantiate_node(SyntaxNode,input, index...(index + 2))
4416
+ @index += 2
4417
+ else
4418
+ terminal_parse_failure("Qu")
4419
+ r25 = nil
4420
+ end
4421
+ if r25
4422
+ r8 = r25
4423
+ r8.extend(CapLatinWord4)
4424
+ else
4425
+ if input.index("As", index) == index
4426
+ r26 = instantiate_node(SyntaxNode,input, index...(index + 2))
4427
+ @index += 2
4428
+ else
4429
+ terminal_parse_failure("As")
4430
+ r26 = nil
4431
+ end
4432
+ if r26
4433
+ r8 = r26
4434
+ r8.extend(CapLatinWord4)
4435
+ else
4436
+ if input.index("Ba", index) == index
4437
+ r27 = instantiate_node(SyntaxNode,input, index...(index + 2))
4438
+ @index += 2
4439
+ else
4440
+ terminal_parse_failure("Ba")
4441
+ r27 = nil
4442
+ end
4443
+ if r27
4444
+ r8 = r27
4445
+ r8.extend(CapLatinWord4)
4446
+ else
4447
+ self.index = i8
4448
+ r8 = nil
4449
+ end
4450
+ end
4451
+ end
4452
+ end
4453
+ end
4454
+ end
4455
+ end
4456
+ end
4457
+ end
4458
+ end
4459
+ end
4460
+ end
4461
+ end
4462
+ end
4463
+ end
4464
+ end
4465
+ end
4466
+ end
4467
+ end
4468
+ if r8
4469
+ r0 = r8
4470
+ else
4471
+ self.index = i0
4472
+ r0 = nil
4473
+ end
4474
+ end
3504
4475
  end
3505
4476
 
3506
4477
  node_cache[:cap_latin_word][start_index] = r0
@@ -3556,7 +4527,7 @@ module ScientificName
3556
4527
 
3557
4528
  i0 = index
3558
4529
  i1, s1 = index, []
3559
- if input.index(Regexp.new('[a-]'), index) == index
4530
+ if input.index(Regexp.new('[a-zëüäöïé]'), index) == index
3560
4531
  r2 = instantiate_node(SyntaxNode,input, index...(index + 1))
3561
4532
  @index += 1
3562
4533
  else
@@ -3731,7 +4702,7 @@ module ScientificName
3731
4702
 
3732
4703
  s0, i0 = [], index
3733
4704
  loop do
3734
- if input.index(Regexp.new('[a-z\\-ëüäöï]'), index) == index
4705
+ if input.index(Regexp.new('[a-z\\-ëüäöïé]'), index) == index
3735
4706
  r1 = instantiate_node(SyntaxNode,input, index...(index + 1))
3736
4707
  @index += 1
3737
4708
  else
@@ -3994,6 +4965,98 @@ module ScientificName
3994
4965
  return r0
3995
4966
  end
3996
4967
 
4968
+ module LeftBracket0
4969
+ def value
4970
+ "("
4971
+ end
4972
+ end
4973
+
4974
+ def _nt_left_bracket
4975
+ start_index = index
4976
+ if node_cache[:left_bracket].has_key?(index)
4977
+ cached = node_cache[:left_bracket][index]
4978
+ @index = cached.interval.end if cached
4979
+ return cached
4980
+ end
4981
+
4982
+ i0 = index
4983
+ if input.index("( (", index) == index
4984
+ r1 = instantiate_node(SyntaxNode,input, index...(index + 3))
4985
+ @index += 3
4986
+ else
4987
+ terminal_parse_failure("( (")
4988
+ r1 = nil
4989
+ end
4990
+ if r1
4991
+ r0 = r1
4992
+ else
4993
+ if input.index("(", index) == index
4994
+ r2 = instantiate_node(SyntaxNode,input, index...(index + 1))
4995
+ r2.extend(LeftBracket0)
4996
+ @index += 1
4997
+ else
4998
+ terminal_parse_failure("(")
4999
+ r2 = nil
5000
+ end
5001
+ if r2
5002
+ r0 = r2
5003
+ else
5004
+ self.index = i0
5005
+ r0 = nil
5006
+ end
5007
+ end
5008
+
5009
+ node_cache[:left_bracket][start_index] = r0
5010
+
5011
+ return r0
5012
+ end
5013
+
5014
+ module RightBracket0
5015
+ def value
5016
+ ")"
5017
+ end
5018
+ end
5019
+
5020
+ def _nt_right_bracket
5021
+ start_index = index
5022
+ if node_cache[:right_bracket].has_key?(index)
5023
+ cached = node_cache[:right_bracket][index]
5024
+ @index = cached.interval.end if cached
5025
+ return cached
5026
+ end
5027
+
5028
+ i0 = index
5029
+ if input.index(") )", index) == index
5030
+ r1 = instantiate_node(SyntaxNode,input, index...(index + 3))
5031
+ @index += 3
5032
+ else
5033
+ terminal_parse_failure(") )")
5034
+ r1 = nil
5035
+ end
5036
+ if r1
5037
+ r0 = r1
5038
+ else
5039
+ if input.index(")", index) == index
5040
+ r2 = instantiate_node(SyntaxNode,input, index...(index + 1))
5041
+ r2.extend(RightBracket0)
5042
+ @index += 1
5043
+ else
5044
+ terminal_parse_failure(")")
5045
+ r2 = nil
5046
+ end
5047
+ if r2
5048
+ r0 = r2
5049
+ else
5050
+ self.index = i0
5051
+ r0 = nil
5052
+ end
5053
+ end
5054
+
5055
+ node_cache[:right_bracket][start_index] = r0
5056
+
5057
+ return r0
5058
+ end
5059
+
3997
5060
  module Space0
3998
5061
  def details
3999
5062
  {
@@ -4074,6 +5137,6 @@ module ScientificName
4074
5137
 
4075
5138
  end
4076
5139
 
4077
- class ScientificNameParser < Treetop::Runtime::CompiledParser
4078
- include ScientificName
5140
+ class ScientificNameCleanParser < Treetop::Runtime::CompiledParser
5141
+ include ScientificNameClean
4079
5142
  end