dimus-biodiversity 0.0.12 → 0.0.13

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