bel_parser 1.0.0.alpha.12 → 1.0.0.alpha.13

Sign up to get free protection for your applications and to get access to all the features.
Files changed (92) hide show
  1. checksums.yaml +4 -4
  2. data/.gemspec +1 -1
  3. data/VERSION +1 -1
  4. data/bin/bel2_validator +35 -8
  5. data/lib/bel_parser/expression/validator.rb +3 -2
  6. data/lib/bel_parser/language/apply_namespace_encoding.rb +96 -0
  7. data/lib/bel_parser/language/base_specification.rb +82 -0
  8. data/lib/bel_parser/language/expression_validator.rb +6 -2
  9. data/lib/bel_parser/language/relationship.rb +1 -1
  10. data/lib/bel_parser/language/semantics/signature_mapping.rb +26 -32
  11. data/lib/bel_parser/language/semantics_ast.rb +285 -149
  12. data/lib/bel_parser/language/semantics_ast_warnings.rb +180 -0
  13. data/lib/bel_parser/language/semantics_result.rb +11 -2
  14. data/lib/bel_parser/language/semantics_type_warning.rb +22 -0
  15. data/lib/bel_parser/language/semantics_warning.rb +8 -0
  16. data/lib/bel_parser/language/specification.rb +38 -55
  17. data/lib/bel_parser/language/syntax/undefined_namespace_value.rb +43 -0
  18. data/lib/bel_parser/language/syntax_error.rb +8 -0
  19. data/lib/bel_parser/language/syntax_result.rb +8 -0
  20. data/lib/bel_parser/language/syntax_warning.rb +9 -4
  21. data/lib/bel_parser/language/version1_0/functions/abundance.rb +5 -6
  22. data/lib/bel_parser/language/version1_0/functions/biological_process.rb +5 -6
  23. data/lib/bel_parser/language/version1_0/functions/complex_abundance.rb +6 -7
  24. data/lib/bel_parser/language/version1_0/functions/fusion.rb +39 -60
  25. data/lib/bel_parser/language/version1_0/functions/gene_abundance.rb +9 -12
  26. data/lib/bel_parser/language/version1_0/functions/list.rb +5 -6
  27. data/lib/bel_parser/language/version1_0/functions/micro_rna_abundance.rb +5 -6
  28. data/lib/bel_parser/language/version1_0/functions/pathology.rb +5 -6
  29. data/lib/bel_parser/language/version1_0/functions/protein_abundance.rb +16 -30
  30. data/lib/bel_parser/language/version1_0/functions/protein_modification.rb +15 -27
  31. data/lib/bel_parser/language/version1_0/functions/rna_abundance.rb +8 -11
  32. data/lib/bel_parser/language/version1_0/functions/substitution.rb +6 -12
  33. data/lib/bel_parser/language/version1_0/functions/translocation.rb +9 -12
  34. data/lib/bel_parser/language/version1_0/functions/truncation.rb +2 -4
  35. data/lib/bel_parser/language/version1_0/value_encodings/abundance.rb +21 -0
  36. data/lib/bel_parser/language/version1_0/value_encodings/any.rb +74 -0
  37. data/lib/bel_parser/language/version1_0/value_encodings/biological_process.rb +21 -0
  38. data/lib/bel_parser/language/version1_0/value_encodings/complex_abundance.rb +21 -0
  39. data/lib/bel_parser/language/version1_0/value_encodings/gene_abundance.rb +21 -0
  40. data/lib/bel_parser/language/version1_0/value_encodings/micro_rna_abundance.rb +21 -0
  41. data/lib/bel_parser/language/version1_0/value_encodings/pathology.rb +21 -0
  42. data/lib/bel_parser/language/version1_0/value_encodings/protein_abundance.rb +21 -0
  43. data/lib/bel_parser/language/version1_0/value_encodings/rna_abundance.rb +21 -0
  44. data/lib/bel_parser/language/version1_0.rb +6 -87
  45. data/lib/bel_parser/language/version2_0/functions/abundance.rb +13 -18
  46. data/lib/bel_parser/language/version2_0/functions/biological_process.rb +5 -6
  47. data/lib/bel_parser/language/version2_0/functions/complex_abundance.rb +9 -12
  48. data/lib/bel_parser/language/version2_0/functions/fragment.rb +4 -9
  49. data/lib/bel_parser/language/version2_0/functions/from_location.rb +5 -6
  50. data/lib/bel_parser/language/version2_0/functions/fusion.rb +39 -66
  51. data/lib/bel_parser/language/version2_0/functions/gene_abundance.rb +13 -18
  52. data/lib/bel_parser/language/version2_0/functions/list.rb +5 -6
  53. data/lib/bel_parser/language/version2_0/functions/location.rb +5 -6
  54. data/lib/bel_parser/language/version2_0/functions/micro_rna_abundance.rb +13 -18
  55. data/lib/bel_parser/language/version2_0/functions/molecular_activity.rb +6 -5
  56. data/lib/bel_parser/language/version2_0/functions/pathology.rb +5 -6
  57. data/lib/bel_parser/language/version2_0/functions/protein_abundance.rb +21 -30
  58. data/lib/bel_parser/language/version2_0/functions/protein_modification.rb +11 -17
  59. data/lib/bel_parser/language/version2_0/functions/rna_abundance.rb +13 -18
  60. data/lib/bel_parser/language/version2_0/functions/to_location.rb +5 -6
  61. data/lib/bel_parser/language/version2_0/functions/variant.rb +1 -4
  62. data/lib/bel_parser/language/version2_0/value_encodings/abundance.rb +21 -0
  63. data/lib/bel_parser/language/version2_0/value_encodings/activity.rb +21 -0
  64. data/lib/bel_parser/language/version2_0/value_encodings/any.rb +74 -0
  65. data/lib/bel_parser/language/version2_0/value_encodings/biological_process.rb +21 -0
  66. data/lib/bel_parser/language/version2_0/value_encodings/complex_abundance.rb +21 -0
  67. data/lib/bel_parser/language/version2_0/value_encodings/gene_abundance.rb +21 -0
  68. data/lib/bel_parser/language/version2_0/value_encodings/location.rb +21 -0
  69. data/lib/bel_parser/language/version2_0/value_encodings/micro_rna_abundance.rb +21 -0
  70. data/lib/bel_parser/language/version2_0/value_encodings/pathology.rb +21 -0
  71. data/lib/bel_parser/language/version2_0/value_encodings/protein_abundance.rb +21 -0
  72. data/lib/bel_parser/language/version2_0/value_encodings/protein_modification.rb +21 -0
  73. data/lib/bel_parser/language/version2_0/value_encodings/rna_abundance.rb +21 -0
  74. data/lib/bel_parser/language/version2_0.rb +6 -60
  75. data/lib/bel_parser/language.rb +3 -4
  76. data/lib/bel_parser/parsers/ast/node.rb +14 -2
  77. data/lib/bel_parser/{language/quoting.rb → quoting.rb} +0 -56
  78. data/lib/bel_parser/resource/concept.rb +56 -0
  79. data/lib/bel_parser/resource/concept_scheme.rb +35 -0
  80. data/lib/bel_parser/resource/dataset.rb +34 -0
  81. data/lib/bel_parser/resource/eager_reader.rb +75 -0
  82. data/lib/bel_parser/resource/eager_sparql_reader.rb +51 -0
  83. data/lib/bel_parser/resource/http_cache.rb +71 -0
  84. data/lib/bel_parser/resource/jena_tdb_reader.rb +246 -0
  85. data/lib/bel_parser/resource/lru_cache.rb +111 -0
  86. data/lib/bel_parser/resource/lru_reader.rb +38 -0
  87. data/lib/bel_parser/resource/reader.rb +18 -0
  88. data/lib/bel_parser/resource/resource_file_reader.rb +134 -0
  89. data/lib/bel_parser/resource/sparql_reader.rb +178 -0
  90. data/lib/bel_parser/resource/value.rb +31 -0
  91. metadata +42 -4
  92. data/lib/bel_parser/language/version1_0/syntax/function.rb +0 -28
@@ -1,5 +1,7 @@
1
+ require 'bel_parser/quoting'
1
2
  require_relative 'semantics_match'
2
- require_relative 'quoting'
3
+ require_relative 'semantics_result'
4
+ require_relative 'semantics_ast_warnings'
3
5
  require_relative '../parsers/ast/node'
4
6
 
5
7
  module BELParser
@@ -109,16 +111,12 @@ module BELParser
109
111
  SemanticIdentifier.new(value_patterns, **properties)
110
112
  end
111
113
 
112
- def prefix(has_namespace, **properties)
113
- SemanticPrefix.new([has_namespace], **properties)
114
+ def prefix(*prefix_patterns, **properties)
115
+ SemanticPrefix.new(prefix_patterns, **properties)
114
116
  end
115
117
 
116
- def value(value_type, **properties)
117
- SemanticValue.new([value_type], **properties)
118
- end
119
-
120
- def value_type(*value_patterns, **properties)
121
- SemanticValueType.new(value_patterns, **properties)
118
+ def value(*value_patterns, **properties)
119
+ SemanticValue.new(value_patterns, **properties)
122
120
  end
123
121
 
124
122
  def any(**properties)
@@ -199,12 +197,64 @@ module BELParser
199
197
  end
200
198
  end
201
199
 
202
- def success(node)
203
- [SemanticMatch.new(true, node, self)]
200
+ def success(node, spec)
201
+ [SemanticsResult.new(node, spec)]
202
+ end
203
+
204
+ def nil_node_warning(node, spec, expected)
205
+ [SemanticsNilNodeWarning.new(node, spec, expected)]
206
+ end
207
+
208
+ def not_nil_node_warning(node, spec)
209
+ [SemanticsNotNilNodeWarning.new(node, spec)]
210
+ end
211
+
212
+ def type_warning(node, spec, expected, actual)
213
+ [SemanticsTypeWarning.new(node, spec, expected, actual)]
214
+ end
215
+
216
+ def argument_length_warning(node, spec, expected, actual)
217
+ [SemanticsArgumentLengthWarning.new(node, spec, expected, actual)]
218
+ end
219
+
220
+ def missing_namespace_warning(node, spec)
221
+ [SemanticsMissingNamespaceWarning.new(node, spec)]
222
+ end
223
+
224
+ def invalid_namespace(node, spec, expected)
225
+ [SemanticsInvalidNamespaceWarning.new(node, spec, expected)]
226
+ end
227
+
228
+ def missing_encoding_warning(node, spec)
229
+ [SemanticsMissingEncodingWarning.new(node, spec)]
230
+ end
231
+
232
+ def invalid_encoding_warning(node, spec, expected)
233
+ [SemanticsInvalidEncodingWarning.new(node, spec, expected)]
234
+ end
235
+
236
+ def invalid_function_warning(node, spec, expected)
237
+ [SemanticsInvalidFunctionWarning.new(node, spec, expected)]
238
+ end
239
+
240
+ def invalid_return_type_warning(node, spec, expected)
241
+ [SemanticsInvalidReturnTypeWarning.new(node, spec, expected)]
242
+ end
243
+
244
+ def invalid_protein_modification_warning(node, spec, expected)
245
+ [SemanticsInvalidProteinModificationWarning.new(node, spec, expected)]
246
+ end
247
+
248
+ def invalid_amino_acid_warning(node, spec, expected)
249
+ [SemanticsInvalidAminoAcidWarning.new(node, spec, expected)]
250
+ end
251
+
252
+ def invalid_amino_acid_range_warning(node, spec)
253
+ [SemanticsInvalidAminoAcidRangeWarning.new(node, spec)]
204
254
  end
205
255
 
206
- def failure(node)
207
- [SemanticMatch.new(false, node, self)]
256
+ def invalid_sequence_position_warning(node, spec)
257
+ [SemanticsInvalidSequencePositionWarning.new(node, spec)]
208
258
  end
209
259
  end
210
260
 
@@ -226,18 +276,29 @@ module BELParser
226
276
  children[1..-1]
227
277
  end
228
278
 
229
- def match(parse_node, _)
230
- return failure(nil) if parse_node.nil?
231
- return failure(parse_node) unless parse_node.type == type
279
+ def match(parse_node, spec)
280
+ return nil_node_warning(
281
+ parse_node,
282
+ spec,
283
+ BELParser::Parsers::AST::Term) if parse_node.nil?
284
+ return type_warning(
285
+ parse_node,
286
+ spec,
287
+ BELParser::Parsers::AST::Term,
288
+ parse_node) if parse_node.type != type
232
289
 
233
290
  # Return success if semantic AST does not supply argument patterns.
234
291
  if arguments.empty? || variadic_arguments?
235
- success(parse_node)
292
+ success(parse_node, spec)
236
293
  # Or, check argument length.
237
294
  elsif arguments.length == parse_node.arguments.length
238
- success(parse_node)
295
+ success(parse_node, spec)
239
296
  else
240
- failure(parse_node)
297
+ argument_length_warning(
298
+ parse_node,
299
+ spec,
300
+ self,
301
+ parse_node)
241
302
  end
242
303
  end
243
304
  end
@@ -248,8 +309,21 @@ module BELParser
248
309
  super(:statement, children, properties)
249
310
  end
250
311
 
251
- def match(parse_node, _)
252
- type == parse_node.type ? success(parse_node) : failure(parse_node)
312
+ def match(parse_node, spec)
313
+ return nil_node_warning(
314
+ parse_node,
315
+ spec,
316
+ BELParser::Parsers::AST::Statement) if parse_node.nil?
317
+
318
+ if parse_node.type == type
319
+ success(parse_node, spec)
320
+ else
321
+ type_warning(
322
+ parse_node,
323
+ spec,
324
+ BELParser::Parsers::AST::Statement,
325
+ parse_node)
326
+ end
253
327
  end
254
328
  end
255
329
 
@@ -259,8 +333,21 @@ module BELParser
259
333
  super(:parameter, children, properties)
260
334
  end
261
335
 
262
- def match(parse_node, _)
263
- type == parse_node.type ? success(parse_node) : failure(parse_node)
336
+ def match(parse_node, spec)
337
+ return nil_node_warning(
338
+ parse_node,
339
+ spec,
340
+ BELParser::Parsers::AST::Parameter) if parse_node.nil?
341
+
342
+ if parse_node.type == type
343
+ success(parse_node, spec)
344
+ else
345
+ type_warning(
346
+ parse_node,
347
+ spec,
348
+ BELParser::Parsers::AST::Parameter,
349
+ parse_node)
350
+ end
264
351
  end
265
352
  end
266
353
 
@@ -270,8 +357,21 @@ module BELParser
270
357
  super(:function, children, properties)
271
358
  end
272
359
 
273
- def match(parse_node, _)
274
- type == parse_node.type ? success(parse_node) : failure(parse_node)
360
+ def match(parse_node, spec)
361
+ return nil_node_warning(
362
+ parse_node,
363
+ spec,
364
+ BELParser::Parsers::AST::Function) if parse_node.nil?
365
+
366
+ if parse_node.type == type
367
+ success(parse_node, spec)
368
+ else
369
+ type_warning(
370
+ parse_node,
371
+ spec,
372
+ BELParser::Parsers::AST::Function,
373
+ parse_node)
374
+ end
275
375
  end
276
376
  end
277
377
 
@@ -281,9 +381,21 @@ module BELParser
281
381
  super(:argument, children, properties)
282
382
  end
283
383
 
284
- def match(parse_node, _)
285
- return failure(nil) if parse_node.nil?
286
- type == parse_node.type ? success(parse_node) : failure(parse_node)
384
+ def match(parse_node, spec)
385
+ return nil_node_warning(
386
+ parse_node,
387
+ spec,
388
+ BELParser::Parsers::AST::Argument) if parse_node.nil?
389
+
390
+ if parse_node.type == type
391
+ success(parse_node, spec)
392
+ else
393
+ type_warning(
394
+ parse_node,
395
+ spec,
396
+ BELParser::Parsers::AST::Argument,
397
+ parse_node)
398
+ end
287
399
  end
288
400
  end
289
401
 
@@ -293,11 +405,20 @@ module BELParser
293
405
  super(:variadic_arguments, children, properties)
294
406
  end
295
407
 
296
- def match(parse_node, _)
408
+ def match(parse_node, spec)
409
+ return nil_node_warning(
410
+ parse_node,
411
+ spec,
412
+ BELParser::Parsers::AST::Argument) if parse_node.nil?
413
+
297
414
  if parse_node.type == BELParser::Parsers::AST::Argument.ast_type
298
- success(parse_node)
415
+ success(parse_node, spec)
299
416
  else
300
- failure(parse_node)
417
+ type_warning(
418
+ parse_node,
419
+ spec,
420
+ BELParser::Parsers::AST::Argument,
421
+ parse_node)
301
422
  end
302
423
  end
303
424
  end
@@ -308,8 +429,31 @@ module BELParser
308
429
  super(:prefix, children, properties)
309
430
  end
310
431
 
311
- def match(parse_node, _)
312
- type == parse_node.type ? success(parse_node) : failure(parse_node)
432
+ def terminal?
433
+ true
434
+ end
435
+
436
+ def prefix_patterns
437
+ children
438
+ end
439
+
440
+ def match(parse_node, spec)
441
+ return nil_node_warning(
442
+ parse_node,
443
+ spec,
444
+ BELParser::Parsers::AST::Prefix) if parse_node.nil?
445
+
446
+ if parse_node.type != BELParser::Parsers::AST::Prefix.ast_type
447
+ return type_warning(
448
+ parse_node,
449
+ spec,
450
+ BELParser::Parsers::AST::Prefix,
451
+ parse_node)
452
+ end
453
+
454
+ prefix_patterns.map do |pattern|
455
+ pattern.match(parse_node, spec)
456
+ end
313
457
  end
314
458
  end
315
459
 
@@ -319,8 +463,31 @@ module BELParser
319
463
  super(:value, children, properties)
320
464
  end
321
465
 
322
- def match(parse_node, _)
323
- type == parse_node.type ? success(parse_node) : failure(parse_node)
466
+ def terminal?
467
+ true
468
+ end
469
+
470
+ def value_patterns
471
+ children
472
+ end
473
+
474
+ def match(parse_node, spec)
475
+ return nil_node_warning(
476
+ parse_node,
477
+ spec,
478
+ BELParser::Parsers::AST::Value) if parse_node.nil?
479
+
480
+ if parse_node.type != BELParser::Parsers::AST::Value.ast_type
481
+ return type_warning(
482
+ parse_node,
483
+ spec,
484
+ BELParser::Parsers::AST::Value,
485
+ parse_node)
486
+ end
487
+
488
+ value_patterns.map do |pattern|
489
+ pattern.match(parse_node, spec)
490
+ end
324
491
  end
325
492
  end
326
493
 
@@ -334,8 +501,12 @@ module BELParser
334
501
  true
335
502
  end
336
503
 
337
- def match(parse_node, _)
338
- parse_node.nil? ? success(parse_node) : failure(nil)
504
+ def match(parse_node, spec)
505
+ if parse_node.nil?
506
+ success(parse_node, spec)
507
+ else
508
+ not_nil_node_warning(parse_node, spec)
509
+ end
339
510
  end
340
511
  end
341
512
 
@@ -354,22 +525,19 @@ module BELParser
354
525
  end
355
526
 
356
527
  def match(identifier, spec)
357
- return failure(nil) if identifier.nil?
358
- return failure(identifier) if type != identifier.type
359
-
360
- value_results = match_value_patterns(identifier, spec)
361
- failure_result = value_results.flatten.find(&:failure?)
362
-
363
- if failure_result
364
- [failure(identifier), failure_result]
365
- else
366
- value_results.unshift(success(identifier))
528
+ return nil_node_warning(
529
+ identifier,
530
+ spec,
531
+ BELParser::Parsers::AST::Identifier) if identifier.nil?
532
+
533
+ if identifier.type != BELParser::Parsers::AST::Identifier.ast_type
534
+ return type_warning(
535
+ identifier,
536
+ spec,
537
+ BELParser::Parsers::AST::Identifier,
538
+ identifier)
367
539
  end
368
- end
369
-
370
- private
371
540
 
372
- def match_value_patterns(identifier, spec)
373
541
  value_patterns.map { |pattern| pattern.match(identifier, spec) }
374
542
  end
375
543
  end
@@ -380,8 +548,8 @@ module BELParser
380
548
  super(:any, [], properties)
381
549
  end
382
550
 
383
- def match(parse_node, _)
384
- success(parse_node)
551
+ def match(parse_node, spec)
552
+ success(parse_node, spec)
385
553
  end
386
554
  end
387
555
 
@@ -391,13 +559,11 @@ module BELParser
391
559
  super(:has_namespace, [], properties)
392
560
  end
393
561
 
394
- def match(identifier, _)
395
- # FIXME: Implement :namespace property assignment to AST.
396
- return success(identifier)
397
- if identifier.respond_to?(:namespace)
398
- success(identifier)
562
+ def match(prefix, spec)
563
+ if prefix.respond_to?(:namespace) && prefix.namespace
564
+ success(prefix, spec)
399
565
  else
400
- failure(identifier)
566
+ missing_namespace_warning(prefix, spec)
401
567
  end
402
568
  end
403
569
  end
@@ -408,18 +574,19 @@ module BELParser
408
574
  super(:namespace_of, namespaces, properties)
409
575
  end
410
576
 
411
- def match(identifier, _)
412
- # FIXME: Implement :namespace property assignment to AST.
413
- return success(identifier)
414
- return failure(identifier) unless identifier.respond_to?(:namespace)
415
- input_namespace = identifier.namespace
416
- return failure(identifier) if input_namespace.nil?
577
+ def namespaces
578
+ children
579
+ end
417
580
 
418
- namespace_set = children
419
- if namespace_set.any? { |i| i == :* || i == input_namespace }
420
- success(identifier)
581
+ def match(prefix_node, spec)
582
+ unless prefix_node.respond_to?(:namespace) && prefix_node.namespace
583
+ return invalid_namespace(prefix_node, spec, namespaces)
584
+ end
585
+
586
+ if namespaces.any? { |i| i == :* || i == input_namespace }
587
+ success(prefix_node, spec)
421
588
  else
422
- failure(identifier)
589
+ invalid_namespace(prefix_node, spec, namespaces)
423
590
  end
424
591
  end
425
592
  end
@@ -430,13 +597,11 @@ module BELParser
430
597
  super(:has_encoding, [], properties)
431
598
  end
432
599
 
433
- def match(value_type, _)
434
- # FIXME: Implement :encoding property assignment to AST.
435
- return success(value_type)
436
- if value_type.respond_to?(:encoding)
437
- success(value_type)
600
+ def match(value_node, spec)
601
+ if value_node.respond_to?(:encoding) && value_node.encoding
602
+ success(value_node, spec)
438
603
  else
439
- failure(value_type)
604
+ missing_encoding_warning(value_node, spec)
440
605
  end
441
606
  end
442
607
  end
@@ -447,21 +612,25 @@ module BELParser
447
612
  super(:encoding_of, encodings, properties)
448
613
  end
449
614
 
450
- def match(value_type, _)
451
- # FIXME: Implement :encoding property assignment to AST.
452
- return success(value_type)
453
- encoding_set = children
454
- return success(value_type) if encoding_set.include?(:*)
615
+ def match_encoding
616
+ children
617
+ end
455
618
 
456
- return failure(value_type) unless value_type.respond_to?(:encoding)
619
+ def match(value_node, spec)
620
+ unless value_node.respond_to?(:encoding) && value_node.encoding
621
+ return invalid_encoding_warning(value_node, spec, match_encoding)
622
+ end
457
623
 
458
- input_encoding = value_type.encoding
459
- return failure(value_type) if input_encoding.nil?
624
+ input = value_node.encoding
625
+ match = match_encoding
626
+ enc_match = input.product(match).any? do |(value_enc, match_enc)|
627
+ value_enc.subtype_of?(match_enc)
628
+ end
460
629
 
461
- if encoding_set.include?(input_encoding)
462
- success(value_type)
630
+ if enc_match
631
+ success(value_node, spec)
463
632
  else
464
- failure(value_type)
633
+ invalid_encoding_warning(value_node, spec, match_encoding)
465
634
  end
466
635
  end
467
636
  end
@@ -477,13 +646,13 @@ module BELParser
477
646
  end
478
647
 
479
648
  def match(identifier, spec)
480
- return success(identifier) if functions.include?(:*)
649
+ return success(identifier, spec) if functions.include?(:*)
481
650
 
482
- function = spec.function(identifier.children[0].to_sym)
651
+ function = spec.function(identifier.string_literal.to_sym)
483
652
  if functions.include?(function)
484
- success(identifier)
653
+ success(identifier, spec)
485
654
  else
486
- failure(identifier)
655
+ invalid_function_warning(identifier, spec, functions)
487
656
  end
488
657
  end
489
658
  end
@@ -499,49 +668,13 @@ module BELParser
499
668
  end
500
669
 
501
670
  def match(identifier, spec)
502
- return success(identifier) if return_types.include?(:*)
503
-
504
- fx_return = spec.function(identifier.children[0].to_sym).return_type
505
- if return_types.any? { |rt| fx_return <= rt }
506
- success(identifier)
507
- else
508
- failure(identifier)
509
- end
510
- end
511
- end
512
-
513
- # AST node for ValueType is a semantic AST.
514
- class SemanticValueType < SemanticASTNode
515
- TYPES = [
516
- BELParser::Parsers::AST::Identifier.ast_type,
517
- BELParser::Parsers::AST::String.ast_type
518
- ].freeze
519
-
520
- def initialize(children = [], **properties)
521
- super(:value_type, children, properties)
522
- end
523
-
524
- def terminal?
525
- true
526
- end
527
-
528
- def value_patterns
529
- children
530
- end
531
-
532
- def match(value_type, spec)
533
- return failure(value_type) unless TYPES.include?(value_type.type)
534
-
535
- value_results = value_patterns.map do |pattern|
536
- pattern.match(value_type, spec)
537
- end
538
-
539
- failure_result = value_results.flatten.find(&:failure?)
671
+ return success(identifier, spec) if return_types.include?(:*)
540
672
 
541
- if failure_result
542
- [failure(value_type), failure_result]
673
+ fxret = spec.function(identifier.string_literal.to_sym).return_type
674
+ if return_types.any? { |rt| fxret <= rt }
675
+ success(identifier, spec)
543
676
  else
544
- value_results.unshift(success(value_type))
677
+ invalid_return_type_warning(identifier, spec, return_types)
545
678
  end
546
679
  end
547
680
  end
@@ -557,14 +690,17 @@ module BELParser
557
690
  children
558
691
  end
559
692
 
560
- def match(value_type, _)
561
- string_literal_sym = value_type.children[0].to_sym
562
- return success(value_type) if @hashed[:*]
693
+ def match(value_node, spec)
694
+ string_literal_sym = value_node.children[0].string_literal.to_sym
695
+ return success(value_node, spec) if @hashed[:*]
563
696
 
564
697
  if @hashed.key?(string_literal_sym)
565
- success(value_type)
698
+ success(value_node, spec)
566
699
  else
567
- failure(value_type)
700
+ invalid_protein_modification_warning(
701
+ value_node,
702
+ spec,
703
+ @hashed.keys)
568
704
  end
569
705
  end
570
706
  end
@@ -580,14 +716,14 @@ module BELParser
580
716
  children
581
717
  end
582
718
 
583
- def match(value_type, _)
584
- string_literal_sym = value_type.children[0].to_sym
585
- return success(value_type) if @hashed[:*]
719
+ def match(value_node, spec)
720
+ string_literal_sym = value_node.children[0].to_sym
721
+ return success(value_node, spec) if @hashed[:*]
586
722
 
587
723
  if @hashed.key?(string_literal_sym)
588
- success(value_type)
724
+ success(value_node, spec)
589
725
  else
590
- failure(value_type)
726
+ invalid_amino_acid_warning(value_node, spec, @hashed.keys)
591
727
  end
592
728
  end
593
729
  end
@@ -604,13 +740,13 @@ module BELParser
604
740
  super(:is_amino_acid_range, [], properties)
605
741
  end
606
742
 
607
- def match(value_type, _)
608
- string_literal = unquote(value_type.children[0])
743
+ def match(value_node, spec)
744
+ string_literal = unquote(value_node.children[0])
609
745
  case string_literal
610
746
  when START_STOP, UNDETERMINED, UNKNOWN_START_STOP
611
- success(value_type)
747
+ success(value_node, spec)
612
748
  else
613
- failure(value_type)
749
+ invalid_amino_acid_range_warning(value_node, spec)
614
750
  end
615
751
  end
616
752
  end
@@ -623,8 +759,8 @@ module BELParser
623
759
  super(:is_sequence_position, [], properties)
624
760
  end
625
761
 
626
- def match(value_type, _)
627
- string_literal = unquote(value_type.string_literal)
762
+ def match(value_node, spec)
763
+ string_literal = unquote(value_node.string_literal)
628
764
  integer_position =
629
765
  begin
630
766
  Integer(string_literal)
@@ -632,9 +768,9 @@ module BELParser
632
768
  nil
633
769
  end
634
770
  if integer_position && integer_position > 0
635
- success(value_type)
771
+ success(value_node, spec)
636
772
  else
637
- failure(value_type)
773
+ invalid_sequence_position_warning(value_node, spec)
638
774
  end
639
775
  end
640
776
  end