bel_parser 1.0.0.alpha.5 → 1.0.0.alpha.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (24) hide show
  1. checksums.yaml +4 -4
  2. data/VERSION +1 -1
  3. data/bin/bel2_validator +2 -2
  4. data/lib/bel_parser/expression/parser.rb +1 -1
  5. data/lib/bel_parser/expression/{term_validator.rb → validator.rb} +8 -3
  6. data/lib/bel_parser/language/expression_validator.rb +12 -36
  7. data/lib/bel_parser/language/semantics/signature_mapping.rb +10 -14
  8. data/lib/bel_parser/language/syntax/invalid_function.rb +11 -10
  9. data/lib/bel_parser/language/syntax/invalid_relationship.rb +42 -0
  10. data/lib/bel_parser/language/syntax/undefined_namespace.rb +12 -18
  11. data/lib/bel_parser/language/version1_0/return_types/molecular_activity.rb +1 -1
  12. data/lib/bel_parser/language/version2_0/functions/protein_abundance.rb +9 -19
  13. data/lib/bel_parser/parser.rb +1 -1
  14. data/lib/bel_parser/parsers/ast/node.rb +53 -7
  15. data/lib/bel_parser/parsers/expression/{statement_nested.rb → nested_statement.rb} +58 -58
  16. data/lib/bel_parser/parsers/expression/{statement_nested.rl → nested_statement.rl} +6 -6
  17. data/lib/bel_parser/parsers/expression/{statement_observed_term.rb → observed_term.rb} +14 -14
  18. data/lib/bel_parser/parsers/expression/{statement_observed_term.rl → observed_term.rl} +5 -5
  19. data/lib/bel_parser/parsers/expression/{statement_simple.rb → simple_statement.rb} +37 -37
  20. data/lib/bel_parser/parsers/expression/{statement_simple.rl → simple_statement.rl} +6 -6
  21. data/lib/bel_parser/parsers/expression.rb +3 -3
  22. data/lib/bel_parser/parsers/line_parser.rb +3 -3
  23. data/lib/bel_parser/script/parser.rb +1 -1
  24. metadata +9 -8
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 6ddb397fcf12e876d078e3a6a239479e0f3913d3
4
- data.tar.gz: 65b412663bfd2e0d19fe5a3e6224f9776881cb3a
3
+ metadata.gz: 31d99776d9e14c8680ec557fcc2e9e94136b90dc
4
+ data.tar.gz: 0764321e9c0d762d5a4186301f62c4f21b56431c
5
5
  SHA512:
6
- metadata.gz: d7156e7a60e8bd45615b8f8d8651071b08187c30bfea4c5726600ea277b0d47b8981ef255a023b0f086f4619f4096c622e9b1cc9bedd40e41321e1542f881cc0
7
- data.tar.gz: d16d66850d29718f589e772ed0a5fbc32221d3ce7157c103ca6e6969a0ffdbc51e559ad7bb1e31c7200a0dcf44160f9346c028760413eaa5a276a2fa32bef274
6
+ metadata.gz: 4d8915205e38ae41098e1c4468b7a54b7d07f23b20f6667d8ab17fbbd7371504402e369122d3e6a91d3adb1148d824578732328f457531956b729402b5401d1f
7
+ data.tar.gz: 528a2bad2581e21df25812804b56d7c366d23f1ee18524767aac5cf8e518b4d1d58952c75763e7893d760b66809b3e15d0d92b0091dda4b6a56bf6d28ebf1146
data/VERSION CHANGED
@@ -1 +1 @@
1
- 1.0.0.alpha.5
1
+ 1.0.0.alpha.6
data/bin/bel2_validator CHANGED
@@ -11,7 +11,7 @@ end
11
11
  namespaces = Hash[ARGV[1..-1].map { |ns| ns.split('=') }]
12
12
 
13
13
  require 'bel_parser'
14
- require 'bel_parser/expression/term_validator'
15
- BELParser::Expression::TermValidator.new(ARGV.first, namespaces).each($stdin) do |res|
14
+ require 'bel_parser/expression/validator'
15
+ BELParser::Expression::Validator.new(ARGV.first, namespaces).each($stdin) do |res|
16
16
  puts res.map { |r| "#{r}\n" }.join.each_line.map { |l| " #{l}" }.join
17
17
  end
@@ -14,7 +14,7 @@ module BELParser
14
14
  FILTER = BELParser::ASTFilter.new(
15
15
  :parameter,
16
16
  :term,
17
- :statement_simple,
17
+ :simple_statement,
18
18
  :observed_term,
19
19
  :nested_statement
20
20
  )
@@ -7,11 +7,16 @@ require_relative '../language/expression_validator'
7
7
  module BELParser
8
8
  module Expression
9
9
  # Parser for BEL Expression.
10
- class TermValidator
10
+ class Validator
11
11
  include BELParser::Parsers::Common
12
12
  include BELParser::Parsers::Expression
13
13
 
14
- FILTER = BELParser::ASTFilter.new(:term)
14
+ FILTER = BELParser::ASTFilter.new(
15
+ :parameter,
16
+ :term,
17
+ :observed_term,
18
+ :simple_statement,
19
+ :nested_statement)
15
20
 
16
21
  def initialize(specification_version, namespaces)
17
22
  @spec = BELParser::Language.specification(specification_version)
@@ -42,7 +47,7 @@ if __FILE__ == $PROGRAM_NAME
42
47
  exit 1
43
48
  end
44
49
  namespaces = Hash[ARGV[1..-1].map { |ns| ns.split('=') }]
45
- BELParser::Expression::TermValidator.new(ARGV.first, namespaces).each($stdin) do |res|
50
+ BELParser::Expression::Validator.new(ARGV.first, namespaces).each($stdin) do |res|
46
51
  res.each do |res|
47
52
  puts res.each_line.map { |l| " #{l}" }.join
48
53
  end
@@ -11,51 +11,27 @@ module BELParser
11
11
  @semantics_functions = Semantics.semantics_functions
12
12
  end
13
13
 
14
- def validate(term_ast)
15
- results = syntax(term_ast)
14
+ def validate(expression_node)
15
+ results = syntax(expression_node)
16
16
  if results.empty?
17
- results << Syntax::Valid.new(term_ast, @spec)
18
- results.concat(semantics(term_ast))
17
+ results << Syntax::Valid.new(expression_node, @spec)
18
+ results.concat(semantics(expression_node))
19
19
  end
20
20
  results
21
21
  end
22
22
 
23
23
  private
24
24
 
25
- def syntax(term_ast)
26
- syntax_results = syntax_term(term_ast).compact
25
+ def syntax(expression_node)
26
+ expression_node.traverse.flat_map do |node|
27
+ @syntax_functions.map { |func| func.map(node, @spec, @namespaces) }
28
+ end.compact
27
29
  end
28
30
 
29
- def semantics(term_ast)
30
- semantics_term(term_ast)
31
- end
32
-
33
- def syntax_term(term_ast)
34
- syntax_results = @syntax_functions.flat_map do |syntax_func|
35
- syntax_func.map(term_ast, @spec, @namespaces)
36
- end
37
-
38
- term_ast.arguments
39
- .select(&:has_term?)
40
- .map(&:child)
41
- .each do |child_term|
42
- syntax_results.concat(syntax_term(child_term))
43
- end
44
- syntax_results
45
- end
46
-
47
- def semantics_term(term_ast)
48
- semantics_results = @semantics_functions.flat_map do |semantics_func|
49
- semantics_func.map(term_ast, @spec, @namespaces)
50
- end
51
-
52
- term_ast.arguments
53
- .select(&:has_term?)
54
- .map(&:child)
55
- .each do |child_term|
56
- semantics_results.concat(semantics_term(child_term))
57
- end
58
- semantics_results
31
+ def semantics(expression_node)
32
+ expression_node.traverse.flat_map do |node|
33
+ @semantics_functions.map { |func| func.map(node, @spec, @namespaces) }
34
+ end.compact
59
35
  end
60
36
  end
61
37
  end
@@ -11,25 +11,21 @@ module BELParser
11
11
  # Map {BELParser::Parsers::AST::Term term} to BEL signatures defined
12
12
  # by a {BELParser::Language::Specification}. The mapping includes both
13
13
  # successful and failed signature matches.
14
- def self.map(term_ast, spec, namespaces)
15
- unless term_ast.is_a?(BELParser::Parsers::AST::Term)
16
- raise(
17
- ArgumentError,
18
- "term_ast: expected BELParser::Parsers::AST::Term")
19
- end
14
+ def self.map(term_node, spec, namespaces)
15
+ return nil unless term_node.is_a?(BELParser::Parsers::AST::Term)
20
16
 
21
- function_name = term_ast.function.identifier.string_literal
17
+ function_name = term_node.function.identifier.string_literal
22
18
  function = spec.function(function_name.to_sym)
23
19
  match = BELParser::Language::Semantics.method(:match)
24
20
 
25
21
  successes, failures = function.signatures
26
- .map { |sig| [sig, match.call(term_ast, sig.semantic_ast, spec)] }
22
+ .map { |sig| [sig, match.call(term_node, sig.semantic_ast, spec)] }
27
23
  .partition { |(sig, results)| results.all?(&:success?) }
28
24
 
29
25
  if successes.empty?
30
- SignatureMappingWarning.new(term_ast, spec, failures)
26
+ SignatureMappingWarning.new(term_node, spec, failures)
31
27
  else
32
- SignatureMappingSuccess.new(term_ast, spec, successes, failures)
28
+ SignatureMappingSuccess.new(term_node, spec, successes, failures)
33
29
  end
34
30
  end
35
31
  end
@@ -38,8 +34,8 @@ module BELParser
38
34
  attr_reader :success_signatures
39
35
  attr_reader :failure_signatures
40
36
 
41
- def initialize(expression_node, spec, successes, failures)
42
- super(expression_node, spec)
37
+ def initialize(term_node, spec, successes, failures)
38
+ super(term_node, spec)
43
39
  @success_signatures = successes
44
40
  @failure_signatures = failures
45
41
  end
@@ -58,8 +54,8 @@ module BELParser
58
54
  class SignatureMappingWarning < SemanticsWarning
59
55
  attr_reader :failure_signatures
60
56
 
61
- def initialize(expression_node, spec, failure_signatures)
62
- super(expression_node, spec)
57
+ def initialize(term_node, spec, failure_signatures)
58
+ super(term_node, spec)
63
59
  @failure_signatures = failure_signatures
64
60
  end
65
61
 
@@ -10,27 +10,28 @@ module BELParser
10
10
 
11
11
  private_class_method :new
12
12
 
13
- def self.map(term_node, spec, namespaces)
14
- function_name = term_node.function.identifier.string_literal
13
+ def self.map(func_node, spec, namespaces)
14
+ return nil unless func_node.is_a?(BELParser::Parsers::AST::Function)
15
+
16
+ function_name = func_node.identifier.string_literal
15
17
  unless spec.function(function_name.to_sym)
16
- InvalidFunctionSyntaxError.new(term_node, spec, function_name)
18
+ InvalidFunctionSyntaxError.new(func_node, spec, function_name)
17
19
  end
18
20
  end
19
21
  end
20
22
 
21
23
  # InvalidFunctionSyntaxError indicates a function name was invalid.
22
24
  class InvalidFunctionSyntaxError < SyntaxError
23
- # Gets the function literal that was invalid according to a
24
- # BEL specification.
25
- attr_reader :function
25
+ # Gets the invalid function literal.
26
+ attr_reader :invalid_function
26
27
 
27
- def initialize(term_node, spec, function)
28
- super(term_node, spec)
29
- @function = function
28
+ def initialize(function, spec, invalid_function)
29
+ super(function, spec)
30
+ @invalid_function = invalid_function
30
31
  end
31
32
 
32
33
  def msg
33
- %Q{Invalid function "#{function}".}
34
+ %Q{Invalid function "#{invalid_function}".}
34
35
  end
35
36
  end
36
37
  end
@@ -0,0 +1,42 @@
1
+ require 'bel_parser/parsers/ast/node'
2
+
3
+ module BELParser
4
+ module Language
5
+ module Syntax
6
+ # InvalidRelationship represents a syntax error with invalid
7
+ # relationship according to a BEL specification.
8
+ class InvalidRelationship
9
+ include SyntaxFunction
10
+
11
+ private_class_method :new
12
+
13
+ def self.map(stmt_node, spec, namespaces)
14
+ return nil unless stmt_node.is_a?(BELParser::Parsers::AST::Statement)
15
+
16
+ rel_name = stmt_node.relationship.string_literal
17
+ return nil if rel_name.nil?
18
+
19
+ unless spec.relationship(rel_name.to_sym)
20
+ InvalidRelationshipSyntaxError.new(stmt_node, spec, rel_name)
21
+ end
22
+ end
23
+ end
24
+
25
+ # InvalidRelationshipSyntaxError indicates a relationship was invalid.
26
+ class InvalidRelationshipSyntaxError < SyntaxError
27
+ # Gets the relationship literal that was invalid according to a
28
+ # BEL specification.
29
+ attr_reader :relationship
30
+
31
+ def initialize(stmt_node, spec, relationship)
32
+ super(stmt_node, spec)
33
+ @relationship = relationship
34
+ end
35
+
36
+ def msg
37
+ %Q{Invalid relationship "#{relationship}".}
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
@@ -10,22 +10,16 @@ module BELParser
10
10
 
11
11
  private_class_method :new
12
12
 
13
- def self.map(term_node, spec, namespaces)
14
- syntax_results = []
15
- term_node.arguments
16
- .select(&:has_parameter?)
17
- .map(&:child)
18
- .each do |child_parameter|
19
- prefix_identifier = child_parameter.prefix.identifier
20
- next if prefix_identifier.nil?
21
-
22
- namespace_prefix = prefix_identifier.string_literal
23
- unless namespaces[namespace_prefix]
24
- syntax_results << UndefinedNamespaceError.new(
25
- term_node, spec, namespace_prefix, namespaces)
26
- end
27
- end
28
- syntax_results
13
+ def self.map(prefix_node, spec, namespaces)
14
+ return nil unless prefix_node.is_a?(BELParser::Parsers::AST::Prefix)
15
+
16
+ prefix_identifier = prefix_node.identifier
17
+ return nil if prefix_identifier.nil?
18
+
19
+ prefix = prefix_identifier.string_literal
20
+ unless namespaces[prefix]
21
+ UndefinedNamespaceError.new(prefix_node, spec, prefix, namespaces)
22
+ end
29
23
  end
30
24
  end
31
25
 
@@ -37,8 +31,8 @@ module BELParser
37
31
  # Gets the defined namespaces.
38
32
  attr_reader :defined_namespaces
39
33
 
40
- def initialize(term_node, spec, invalid_prefix, defined_namespaces)
41
- super(term_node, spec)
34
+ def initialize(prefix_node, spec, invalid_prefix, defined_namespaces)
35
+ super(prefix_node, spec)
42
36
  @invalid_prefix = invalid_prefix
43
37
  @defined_namespaces = defined_namespaces.dup
44
38
  end
@@ -1,4 +1,4 @@
1
- require_relative 'molecular_activity'
1
+ require_relative 'any'
2
2
 
3
3
  module BELParser
4
4
  module Language
@@ -120,28 +120,18 @@ module BELParser
120
120
 
121
121
  AST = BELParser::Language::Semantics::Builder.build do
122
122
  term(
123
- function(
124
- identifier(
125
- function_of(ProteinAbundance))),
126
- argument(
127
- parameter(
128
- prefix(
129
- identifier(
130
- has_namespace,
131
- namespace_of(:*))),
132
- value(
133
- value_type(
134
- has_encoding,
135
- encoding_of(:ProteinAbundance))))),
136
- argument(
137
- term(
138
- function(
139
- identifier(
140
- return_type_of(BELParser::Language::Version2_0::ReturnTypes::Fusion))))))
123
+ function(
124
+ identifier(
125
+ function_of(ProteinAbundance))),
126
+ argument(
127
+ term(
128
+ function(
129
+ identifier(
130
+ return_type_of(BELParser::Language::Version2_0::ReturnTypes::Fusion))))))
141
131
  end
142
132
  private_constant :AST
143
133
 
144
- STRING_FORM = 'proteinAbundance(E:proteinAbundance,F:fusion)proteinAbundance'.freeze
134
+ STRING_FORM = 'proteinAbundance(F:fusion)proteinAbundance'.freeze
145
135
  private_constant :STRING_FORM
146
136
 
147
137
  def self.semantic_ast
@@ -22,7 +22,7 @@ module BELParser
22
22
  :term,
23
23
  :relationship,
24
24
  :observed_term,
25
- :statement_simple,
25
+ :simple_statement,
26
26
  :nested_statement,
27
27
  :define_annotation,
28
28
  :define_namespace,
@@ -377,6 +377,11 @@ module BELParser
377
377
  def initialize(children = [], properties = {})
378
378
  super(Relationship.ast_type, children, properties)
379
379
  end
380
+
381
+ # Get the string literal.
382
+ def string_literal
383
+ children[0]
384
+ end
380
385
  end
381
386
 
382
387
  # AST node representing a set.
@@ -420,7 +425,33 @@ module BELParser
420
425
 
421
426
  # Get the subject of the statement.
422
427
  def subject
423
- # TODO: access children for content
428
+ children[0]
429
+ end
430
+
431
+ def has_relationship?
432
+ children[1] && children[1].is_a?(Relationship)
433
+ end
434
+
435
+ # Get the relationship of the nested statement.
436
+ def relationship
437
+ has_relationship? ? children[1] : nil
438
+ end
439
+
440
+ def has_object?
441
+ children[2] && children[2].is_a?(Object)
442
+ end
443
+
444
+ # Get the object of the nested statement.
445
+ def object
446
+ has_object? ? children[2] : nil
447
+ end
448
+
449
+ def has_comment?
450
+ children[-1] && children[-1].is_a?(Comment)
451
+ end
452
+
453
+ def comment
454
+ has_comment? ? children[-1] : nil
424
455
  end
425
456
  end
426
457
 
@@ -438,14 +469,19 @@ module BELParser
438
469
  super(NestedStatement.ast_type, children, properties)
439
470
  end
440
471
 
472
+ # Get the subject of the statement.
473
+ def subject
474
+ children[0]
475
+ end
476
+
441
477
  # Get the relationship of the nested statement.
442
- def relatitonship
443
- # TODO: access children for content
478
+ def relationship
479
+ children[1]
444
480
  end
445
481
 
446
482
  # Get the object of the nested statement.
447
483
  def object
448
- # TODO: access children for content
484
+ children[2]
449
485
  end
450
486
  end
451
487
 
@@ -462,6 +498,11 @@ module BELParser
462
498
  def initialize(children = [], properties = {})
463
499
  super(ObservedTerm.ast_type, children, properties)
464
500
  end
501
+
502
+ # Get the subject of the statement.
503
+ def subject
504
+ children[0]
505
+ end
465
506
  end
466
507
 
467
508
  # AST node representing a simple statement.
@@ -478,14 +519,19 @@ module BELParser
478
519
  super(SimpleStatement.ast_type, children, properties)
479
520
  end
480
521
 
522
+ # Get the subject of the statement.
523
+ def subject
524
+ children[0]
525
+ end
526
+
481
527
  # Get the relationship of the nested statement.
482
- def relatitonship
483
- # TODO: access children for content
528
+ def relationship
529
+ children[1]
484
530
  end
485
531
 
486
532
  # Get the object of the nested statement.
487
533
  def object
488
- # TODO: access children for content
534
+ children[2]
489
535
  end
490
536
  end
491
537