bel_parser 1.0.0.alpha.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (182) hide show
  1. checksums.yaml +7 -0
  2. data/.gemspec +28 -0
  3. data/CHANGELOG.md +10 -0
  4. data/LICENSE +191 -0
  5. data/README.md +9 -0
  6. data/VERSION +1 -0
  7. data/bin/bel2_termcheck +39 -0
  8. data/lib/bel_parser.rb +17 -0
  9. data/lib/bel_parser/ast_filter.rb +27 -0
  10. data/lib/bel_parser/ast_generator.rb +86 -0
  11. data/lib/bel_parser/ast_validator.rb +40 -0
  12. data/lib/bel_parser/expression/parser.rb +42 -0
  13. data/lib/bel_parser/expression/term_semantics.rb +36 -0
  14. data/lib/bel_parser/language.rb +7 -0
  15. data/lib/bel_parser/language/function.rb +59 -0
  16. data/lib/bel_parser/language/quoting.rb +236 -0
  17. data/lib/bel_parser/language/semantic_ast.rb +604 -0
  18. data/lib/bel_parser/language/semantics/analyzer.rb +59 -0
  19. data/lib/bel_parser/language/signature.rb +39 -0
  20. data/lib/bel_parser/language/specification.rb +49 -0
  21. data/lib/bel_parser/language/syntax/expression/incomplete_node.rb +14 -0
  22. data/lib/bel_parser/language/syntax/expression/invalid_term_function.rb +22 -0
  23. data/lib/bel_parser/language/version1.rb +50 -0
  24. data/lib/bel_parser/language/version1/functions/abundance.rb +85 -0
  25. data/lib/bel_parser/language/version1/functions/biological_process.rb +85 -0
  26. data/lib/bel_parser/language/version1/functions/catalytic_activity.rb +110 -0
  27. data/lib/bel_parser/language/version1/functions/cell_secretion.rb +80 -0
  28. data/lib/bel_parser/language/version1/functions/cell_surface_expression.rb +80 -0
  29. data/lib/bel_parser/language/version1/functions/chaperone_activity.rb +110 -0
  30. data/lib/bel_parser/language/version1/functions/complex_abundance.rb +115 -0
  31. data/lib/bel_parser/language/version1/functions/composite_abundance.rb +80 -0
  32. data/lib/bel_parser/language/version1/functions/degradation.rb +80 -0
  33. data/lib/bel_parser/language/version1/functions/fusion.rb +302 -0
  34. data/lib/bel_parser/language/version1/functions/gene_abundance.rb +125 -0
  35. data/lib/bel_parser/language/version1/functions/gtp_bound_activity.rb +110 -0
  36. data/lib/bel_parser/language/version1/functions/kinase_activity.rb +110 -0
  37. data/lib/bel_parser/language/version1/functions/list.rb +115 -0
  38. data/lib/bel_parser/language/version1/functions/micro_rna_abundance.rb +85 -0
  39. data/lib/bel_parser/language/version1/functions/molecular_activity.rb +80 -0
  40. data/lib/bel_parser/language/version1/functions/pathology.rb +85 -0
  41. data/lib/bel_parser/language/version1/functions/peptidase_activity.rb +110 -0
  42. data/lib/bel_parser/language/version1/functions/phosphatase_activity.rb +110 -0
  43. data/lib/bel_parser/language/version1/functions/products.rb +80 -0
  44. data/lib/bel_parser/language/version1/functions/protein_abundance.rb +245 -0
  45. data/lib/bel_parser/language/version1/functions/protein_modification.rb +167 -0
  46. data/lib/bel_parser/language/version1/functions/reactants.rb +80 -0
  47. data/lib/bel_parser/language/version1/functions/reaction.rb +85 -0
  48. data/lib/bel_parser/language/version1/functions/ribosylation_activity.rb +110 -0
  49. data/lib/bel_parser/language/version1/functions/rna_abundance.rb +125 -0
  50. data/lib/bel_parser/language/version1/functions/substitution.rb +96 -0
  51. data/lib/bel_parser/language/version1/functions/transcriptional_activity.rb +110 -0
  52. data/lib/bel_parser/language/version1/functions/translocation.rb +100 -0
  53. data/lib/bel_parser/language/version1/functions/transport_activity.rb +110 -0
  54. data/lib/bel_parser/language/version1/functions/truncation.rb +82 -0
  55. data/lib/bel_parser/language/version1/return_types/abundance.rb +20 -0
  56. data/lib/bel_parser/language/version1/return_types/any.rb +74 -0
  57. data/lib/bel_parser/language/version1/return_types/biological_process.rb +17 -0
  58. data/lib/bel_parser/language/version1/return_types/catalytic_activity.rb +20 -0
  59. data/lib/bel_parser/language/version1/return_types/chaperone_activity.rb +20 -0
  60. data/lib/bel_parser/language/version1/return_types/complex_abundance.rb +17 -0
  61. data/lib/bel_parser/language/version1/return_types/fusion.rb +17 -0
  62. data/lib/bel_parser/language/version1/return_types/gene_abundance.rb +17 -0
  63. data/lib/bel_parser/language/version1/return_types/gtp_bound_activity.rb +20 -0
  64. data/lib/bel_parser/language/version1/return_types/kinase_activity.rb +20 -0
  65. data/lib/bel_parser/language/version1/return_types/list.rb +17 -0
  66. data/lib/bel_parser/language/version1/return_types/micro_rna_abundance.rb +17 -0
  67. data/lib/bel_parser/language/version1/return_types/molecular_activity.rb +20 -0
  68. data/lib/bel_parser/language/version1/return_types/pathology.rb +17 -0
  69. data/lib/bel_parser/language/version1/return_types/peptidase_activity.rb +20 -0
  70. data/lib/bel_parser/language/version1/return_types/phosphatase_activity.rb +20 -0
  71. data/lib/bel_parser/language/version1/return_types/products.rb +17 -0
  72. data/lib/bel_parser/language/version1/return_types/protein_abundance.rb +17 -0
  73. data/lib/bel_parser/language/version1/return_types/protein_modification.rb +17 -0
  74. data/lib/bel_parser/language/version1/return_types/reactants.rb +17 -0
  75. data/lib/bel_parser/language/version1/return_types/ribosylation_activity.rb +20 -0
  76. data/lib/bel_parser/language/version1/return_types/rna_abundance.rb +17 -0
  77. data/lib/bel_parser/language/version1/return_types/substitution.rb +17 -0
  78. data/lib/bel_parser/language/version1/return_types/transcriptional_activity.rb +20 -0
  79. data/lib/bel_parser/language/version1/return_types/transport_activity.rb +20 -0
  80. data/lib/bel_parser/language/version1/return_types/truncation.rb +17 -0
  81. data/lib/bel_parser/language/version2.rb +50 -0
  82. data/lib/bel_parser/language/version2/functions/abundance.rb +165 -0
  83. data/lib/bel_parser/language/version2/functions/activity.rb +115 -0
  84. data/lib/bel_parser/language/version2/functions/biological_process.rb +85 -0
  85. data/lib/bel_parser/language/version2/functions/cell_secretion.rb +80 -0
  86. data/lib/bel_parser/language/version2/functions/cell_surface_expression.rb +80 -0
  87. data/lib/bel_parser/language/version2/functions/complex_abundance.rb +190 -0
  88. data/lib/bel_parser/language/version2/functions/composite_abundance.rb +80 -0
  89. data/lib/bel_parser/language/version2/functions/degradation.rb +80 -0
  90. data/lib/bel_parser/language/version2/functions/fragment.rb +119 -0
  91. data/lib/bel_parser/language/version2/functions/from_location.rb +85 -0
  92. data/lib/bel_parser/language/version2/functions/fusion.rb +227 -0
  93. data/lib/bel_parser/language/version2/functions/gene_abundance.rb +195 -0
  94. data/lib/bel_parser/language/version2/functions/list.rb +115 -0
  95. data/lib/bel_parser/language/version2/functions/location.rb +85 -0
  96. data/lib/bel_parser/language/version2/functions/micro_rna_abundance.rb +165 -0
  97. data/lib/bel_parser/language/version2/functions/molecular_activity.rb +83 -0
  98. data/lib/bel_parser/language/version2/functions/pathology.rb +85 -0
  99. data/lib/bel_parser/language/version2/functions/products.rb +80 -0
  100. data/lib/bel_parser/language/version2/functions/protein_abundance.rb +285 -0
  101. data/lib/bel_parser/language/version2/functions/protein_modification.rb +167 -0
  102. data/lib/bel_parser/language/version2/functions/reactants.rb +80 -0
  103. data/lib/bel_parser/language/version2/functions/reaction.rb +85 -0
  104. data/lib/bel_parser/language/version2/functions/rna_abundance.rb +195 -0
  105. data/lib/bel_parser/language/version2/functions/to_location.rb +85 -0
  106. data/lib/bel_parser/language/version2/functions/translocation.rb +90 -0
  107. data/lib/bel_parser/language/version2/functions/variant.rb +83 -0
  108. data/lib/bel_parser/language/version2/return_types/abundance.rb +20 -0
  109. data/lib/bel_parser/language/version2/return_types/activity.rb +20 -0
  110. data/lib/bel_parser/language/version2/return_types/any.rb +74 -0
  111. data/lib/bel_parser/language/version2/return_types/biological_process.rb +17 -0
  112. data/lib/bel_parser/language/version2/return_types/complex_abundance.rb +17 -0
  113. data/lib/bel_parser/language/version2/return_types/fragment.rb +20 -0
  114. data/lib/bel_parser/language/version2/return_types/from_location.rb +20 -0
  115. data/lib/bel_parser/language/version2/return_types/fusion.rb +17 -0
  116. data/lib/bel_parser/language/version2/return_types/gene_abundance.rb +17 -0
  117. data/lib/bel_parser/language/version2/return_types/list.rb +17 -0
  118. data/lib/bel_parser/language/version2/return_types/location.rb +20 -0
  119. data/lib/bel_parser/language/version2/return_types/micro_rna_abundance.rb +17 -0
  120. data/lib/bel_parser/language/version2/return_types/molecular_activity.rb +20 -0
  121. data/lib/bel_parser/language/version2/return_types/pathology.rb +17 -0
  122. data/lib/bel_parser/language/version2/return_types/products.rb +17 -0
  123. data/lib/bel_parser/language/version2/return_types/protein_abundance.rb +17 -0
  124. data/lib/bel_parser/language/version2/return_types/protein_modification.rb +17 -0
  125. data/lib/bel_parser/language/version2/return_types/reactants.rb +17 -0
  126. data/lib/bel_parser/language/version2/return_types/rna_abundance.rb +17 -0
  127. data/lib/bel_parser/language/version2/return_types/to_location.rb +20 -0
  128. data/lib/bel_parser/language/version2/return_types/variant.rb +20 -0
  129. data/lib/bel_parser/mixin/line_continuator.rb +15 -0
  130. data/lib/bel_parser/mixin/line_mapping.rb +14 -0
  131. data/lib/bel_parser/parser.rb +54 -0
  132. data/lib/bel_parser/parsers/ast/mapped_traversal.rb +36 -0
  133. data/lib/bel_parser/parsers/ast/node.rb +705 -0
  134. data/lib/bel_parser/parsers/ast/sexp.rb +8 -0
  135. data/lib/bel_parser/parsers/ast/traversal.rb +21 -0
  136. data/lib/bel_parser/parsers/bel_script.rb +4 -0
  137. data/lib/bel_parser/parsers/bel_script/define_annotation.rb +5476 -0
  138. data/lib/bel_parser/parsers/bel_script/define_annotation.rl +141 -0
  139. data/lib/bel_parser/parsers/bel_script/define_namespace.rb +1780 -0
  140. data/lib/bel_parser/parsers/bel_script/define_namespace.rl +121 -0
  141. data/lib/bel_parser/parsers/bel_script/set.rb +4556 -0
  142. data/lib/bel_parser/parsers/bel_script/set.rl +116 -0
  143. data/lib/bel_parser/parsers/bel_script/unset.rb +706 -0
  144. data/lib/bel_parser/parsers/bel_script/unset.rl +95 -0
  145. data/lib/bel_parser/parsers/common.rb +5 -0
  146. data/lib/bel_parser/parsers/common/blank_line.rb +211 -0
  147. data/lib/bel_parser/parsers/common/blank_line.rl +81 -0
  148. data/lib/bel_parser/parsers/common/comment_line.rb +245 -0
  149. data/lib/bel_parser/parsers/common/comment_line.rl +97 -0
  150. data/lib/bel_parser/parsers/common/common.rb +7 -0
  151. data/lib/bel_parser/parsers/common/common.rl +13 -0
  152. data/lib/bel_parser/parsers/common/identifier.rb +289 -0
  153. data/lib/bel_parser/parsers/common/identifier.rl +106 -0
  154. data/lib/bel_parser/parsers/common/list.rb +2142 -0
  155. data/lib/bel_parser/parsers/common/list.rl +144 -0
  156. data/lib/bel_parser/parsers/common/string.rb +271 -0
  157. data/lib/bel_parser/parsers/common/string.rl +107 -0
  158. data/lib/bel_parser/parsers/expression.rb +7 -0
  159. data/lib/bel_parser/parsers/expression/comment.rb +239 -0
  160. data/lib/bel_parser/parsers/expression/comment.rl +97 -0
  161. data/lib/bel_parser/parsers/expression/parameter.rb +1506 -0
  162. data/lib/bel_parser/parsers/expression/parameter.rl +97 -0
  163. data/lib/bel_parser/parsers/expression/relationship.rb +254 -0
  164. data/lib/bel_parser/parsers/expression/relationship.rl +98 -0
  165. data/lib/bel_parser/parsers/expression/statement_nested.rb +17802 -0
  166. data/lib/bel_parser/parsers/expression/statement_nested.rl +141 -0
  167. data/lib/bel_parser/parsers/expression/statement_observed_term.rb +7291 -0
  168. data/lib/bel_parser/parsers/expression/statement_observed_term.rl +92 -0
  169. data/lib/bel_parser/parsers/expression/statement_simple.rb +10475 -0
  170. data/lib/bel_parser/parsers/expression/statement_simple.rl +112 -0
  171. data/lib/bel_parser/parsers/expression/term.rb +3989 -0
  172. data/lib/bel_parser/parsers/expression/term.rl +157 -0
  173. data/lib/bel_parser/parsers/line_parser.rb +92 -0
  174. data/lib/bel_parser/parsers/mixin/buffer.rb +10 -0
  175. data/lib/bel_parser/parsers/nonblocking_io_wrapper.rb +50 -0
  176. data/lib/bel_parser/script/parser.rb +49 -0
  177. data/lib/bel_parser/vendor/ast.rb +17 -0
  178. data/lib/bel_parser/vendor/ast/node.rb +254 -0
  179. data/lib/bel_parser/vendor/ast/processor.rb +12 -0
  180. data/lib/bel_parser/vendor/ast/processor/mixin.rb +282 -0
  181. data/lib/bel_parser/vendor/ast/sexp.rb +30 -0
  182. metadata +226 -0
@@ -0,0 +1,12 @@
1
+ module AST
2
+ # This class includes {AST::Processor::Mixin}; however, it is
3
+ # deprecated, since the module defines all of the behaviors that
4
+ # the processor includes. Any new libraries should use
5
+ # {AST::Processor::Mixin} instead of subclassing this.
6
+ #
7
+ # @deprecated Use {AST::Processor::Mixin} instead.
8
+ class Processor
9
+ require_relative 'processor/mixin'
10
+ include Mixin
11
+ end
12
+ end
@@ -0,0 +1,282 @@
1
+ module AST
2
+ class Processor
3
+ # The processor module is a module which helps transforming one
4
+ # AST into another. In a nutshell, the {#process} method accepts
5
+ # a {Node} and dispatches it to a handler corresponding to its
6
+ # type, and returns a (possibly) updated variant of the node.
7
+ #
8
+ # The processor module has a set of associated design patterns.
9
+ # They are best explained with a concrete example. Let's define a
10
+ # simple arithmetic language and an AST format for it:
11
+ #
12
+ # Terminals (AST nodes which do not have other AST nodes inside):
13
+ #
14
+ # * `(integer <int-literal>)`,
15
+ #
16
+ # Nonterminals (AST nodes with other nodes as children):
17
+ #
18
+ # * `(add <node> <node>)`,
19
+ # * `(multiply <node> <node>)`,
20
+ # * `(divide <node> <node>)`,
21
+ # * `(negate <node>)`,
22
+ # * `(store <node> <string-literal>)`: stores value of `<node>`
23
+ # into a variable named `<string-literal>`,
24
+ # * `(load <string-literal>)`: loads value of a variable named
25
+ # `<string-literal>`,
26
+ # * `(each <node> ...): computes each of the `<node>`s and
27
+ # prints the result.
28
+ #
29
+ # All AST nodes have the same Ruby class, and therefore they don't
30
+ # know how to traverse themselves. (A solution which dynamically
31
+ # checks the type of children is possible, but is slow and
32
+ # error-prone.) So, a class including the module which knows how
33
+ # to traverse the entire tree should be defined. Such classes
34
+ # have a handler for each nonterminal node which recursively
35
+ # processes children nodes:
36
+ #
37
+ # require 'ast'
38
+ #
39
+ # class ArithmeticsProcessor
40
+ # include AST::Processor::Module
41
+ # # This method traverses any binary operators such as (add)
42
+ # # or (multiply).
43
+ # def process_binary_op(node)
44
+ # # Children aren't decomposed automatically; it is
45
+ # # suggested to use Ruby multiple assignment expansion,
46
+ # # as it is very convenient here.
47
+ # left_expr, right_expr = *node
48
+ #
49
+ # # AST::Node#updated won't change node type if nil is
50
+ # # passed as a first argument, which allows to reuse the
51
+ # # same handler for multiple node types using `alias'
52
+ # # (below).
53
+ # node.updated(nil, [
54
+ # process(left_expr),
55
+ # process(right_expr)
56
+ # ])
57
+ # end
58
+ # alias_method :on_add, :process_binary_op
59
+ # alias_method :on_multiply, :process_binary_op
60
+ # alias_method :on_divide, :process_binary_op
61
+ #
62
+ # def on_negate(node)
63
+ # # It is also possible to use #process_all for more
64
+ # # compact code if every child is a Node.
65
+ # node.updated(nil, process_all(node))
66
+ # end
67
+ #
68
+ # def on_store(node)
69
+ # expr, variable_name = *node
70
+ #
71
+ # # Note that variable_name is not a Node and thus isn't
72
+ # # passed to #process.
73
+ # node.updated(nil, [
74
+ # process(expr),
75
+ # variable_name
76
+ # ])
77
+ # end
78
+ #
79
+ # # (load) is effectively a terminal node, and so it does
80
+ # # not need an explicit handler, as the following is the
81
+ # # default behavior. Essentially, for any nodes that don't
82
+ # # have a defined handler, the node remains unchanged.
83
+ # def on_load(node)
84
+ # nil
85
+ # end
86
+ #
87
+ # def on_each(node)
88
+ # node.updated(nil, process_all(node))
89
+ # end
90
+ # end
91
+ #
92
+ # Let's test our ArithmeticsProcessor:
93
+ #
94
+ # include AST::Sexp
95
+ # expr = s(:add, s(:integer, 2), s(:integer, 2))
96
+ #
97
+ # p ArithmeticsProcessor.new.process(expr) == expr # => true
98
+ #
99
+ # As expected, it does not change anything at all. This isn't
100
+ # actually very useful, so let's now define a Calculator, which
101
+ # will compute the expression values:
102
+ #
103
+ # # This Processor folds nonterminal nodes and returns an
104
+ # # (integer) terminal node.
105
+ # class ArithmeticsCalculator < ArithmeticsProcessor
106
+ # def compute_op(node)
107
+ # # First, node children are processed and then unpacked
108
+ # # to local variables.
109
+ # nodes = process_all(node)
110
+ #
111
+ # if nodes.all? { |node| node.type == :integer }
112
+ # # If each of those nodes represents a literal, we can
113
+ # # fold this node!
114
+ # values = nodes.map { |node| node.children.first }
115
+ # AST::Node.new(:integer, [
116
+ # yield(values)
117
+ # ])
118
+ # else
119
+ # # Otherwise, we can just leave the current node in the
120
+ # # tree and only update it with processed children
121
+ # # nodes, which can be partially folded.
122
+ # node.updated(nil, nodes)
123
+ # end
124
+ # end
125
+ #
126
+ # def on_add(node)
127
+ # compute_op(node) { |left, right| left + right }
128
+ # end
129
+ #
130
+ # def on_multiply(node)
131
+ # compute_op(node) { |left, right| left * right }
132
+ # end
133
+ # end
134
+ #
135
+ # Let's check:
136
+ #
137
+ # p ArithmeticsCalculator.new.process(expr) # => (integer 4)
138
+ #
139
+ # Excellent, the calculator works! Now, a careful reader could
140
+ # notice that the ArithmeticsCalculator does not know how to
141
+ # divide numbers. What if we pass an expression with division to
142
+ # it?
143
+ #
144
+ # expr_with_division = \
145
+ # s(:add,
146
+ # s(:integer, 1),
147
+ # s(:divide,
148
+ # s(:add, s(:integer, 8), s(:integer, 4)),
149
+ # s(:integer, 3))) # 1 + (8 + 4) / 3
150
+ #
151
+ # folded_expr_with_division = ArithmeticsCalculator.new.process(expr_with_division)
152
+ # p folded_expr_with_division
153
+ # # => (add
154
+ # # (integer 1)
155
+ # # (divide
156
+ # # (integer 12)
157
+ # # (integer 3)))
158
+ #
159
+ # As you can see, the expression was folded _partially_: the inner
160
+ # `(add)` node which could be computed was folded to
161
+ # `(integer 12)`, the `(divide)` node is left as-is because there
162
+ # is no computing handler for it, and the root `(add)` node was
163
+ # also left as it is because some of its children were not
164
+ # literals.
165
+ #
166
+ # Note that this partial folding is only possible because the
167
+ # _data_ format, i.e. the format in which the computed values of
168
+ # the nodes are represented, is the same as the AST itself. # # Let's extend our ArithmeticsCalculator class further. # # class ArithmeticsCalculator # def on_divide(node) # compute_op(node) { |left, right| left / right }
169
+ # end
170
+ #
171
+ # def on_negate(node)
172
+ # # Note how #compute_op works regardless of the operator
173
+ # # arity.
174
+ # compute_op(node) { |value| -value }
175
+ # end
176
+ # end
177
+ #
178
+ # Now, let's apply our renewed ArithmeticsCalculator to a partial
179
+ # result of previous evaluation:
180
+ #
181
+ # p ArithmeticsCalculator.new.process(expr_with_division) # => (integer 5)
182
+ #
183
+ # Five! Excellent. This is also pretty much how CRuby 1.8 executed
184
+ # its programs.
185
+ #
186
+ # Now, let's do some automated bug searching. Division by zero is
187
+ # an error, right? So if we could detect that someone has divided
188
+ # by zero before the program is even run, that could save some
189
+ # debugging time.
190
+ #
191
+ # class DivisionByZeroVerifier < ArithmeticsProcessor
192
+ # class VerificationFailure < Exception; end
193
+ #
194
+ # def on_divide(node)
195
+ # # You need to process the children to handle nested divisions
196
+ # # such as:
197
+ # # (divide
198
+ # # (integer 1)
199
+ # # (divide (integer 1) (integer 0))
200
+ # left, right = process_all(node)
201
+ #
202
+ # if right.type == :integer &&
203
+ # right.children.first == 0
204
+ # raise VerificationFailure, "Ouch! This code divides by zero."
205
+ # end
206
+ # end
207
+ #
208
+ # def divides_by_zero?(ast)
209
+ # process(ast)
210
+ # false
211
+ # rescue VerificationFailure
212
+ # true
213
+ # end
214
+ # end
215
+ #
216
+ # nice_expr = \
217
+ # s(:divide,
218
+ # s(:add, s(:integer, 10), s(:integer, 2)),
219
+ # s(:integer, 4))
220
+ #
221
+ # p DivisionByZeroVerifier.new.divides_by_zero?(nice_expr)
222
+ # # => false. Good.
223
+ #
224
+ # bad_expr = \
225
+ # s(:add, s(:integer, 10),
226
+ # s(:divide, s(:integer, 1), s(:integer, 0)))
227
+ #
228
+ # p DivisionByZeroVerifier.new.divides_by_zero?(bad_expr)
229
+ # # => true. WHOOPS. DO NOT RUN THIS.
230
+ #
231
+ # Of course, this won't detect more complex cases... unless you
232
+ # use some partial evaluation before! The possibilites are
233
+ # endless. Have fun.
234
+ module Mixin
235
+ # Dispatches `node`. If a node has type `:foo`, then a handler
236
+ # named `on_foo` is invoked with one argument, the `node`; if
237
+ # there isn't such a handler, {#handler_missing} is invoked
238
+ # with the same argument.
239
+ #
240
+ # If the handler returns `nil`, `node` is returned; otherwise,
241
+ # the return value of the handler is passed along.
242
+ #
243
+ # @param [AST::Node, nil] node
244
+ # @return [AST::Node, nil]
245
+ def process(node)
246
+ return if node.nil?
247
+
248
+ node = node.to_ast
249
+
250
+ # Invoke a specific handler
251
+ on_handler = :"on_#{node.type}"
252
+ if respond_to? on_handler
253
+ new_node = send on_handler, node
254
+ else
255
+ new_node = handler_missing(node)
256
+ end
257
+
258
+ node = new_node if new_node
259
+
260
+ node
261
+ end
262
+
263
+ # {#process}es each node from `nodes` and returns an array of
264
+ # results.
265
+ #
266
+ # @param [Array<AST::Node>] nodes
267
+ # @return [Array<AST::Node>]
268
+ def process_all(nodes)
269
+ nodes.to_a.map do |node|
270
+ process node
271
+ end
272
+ end
273
+
274
+ # Default handler. Does nothing.
275
+ #
276
+ # @param [AST::Node] node
277
+ # @return [AST::Node, nil]
278
+ def handler_missing(node)
279
+ end
280
+ end
281
+ end
282
+ end
@@ -0,0 +1,30 @@
1
+ module AST
2
+ # This simple module is very useful in the cases where one needs
3
+ # to define deeply nested ASTs from Ruby code, for example, in
4
+ # tests. It should be used like this:
5
+ #
6
+ # describe YourLanguage::AST do
7
+ # include Sexp
8
+ #
9
+ # it "should correctly parse expressions" do
10
+ # YourLanguage.parse("1 + 2 * 3").should ==
11
+ # s(:add,
12
+ # s(:integer, 1),
13
+ # s(:multiply,
14
+ # s(:integer, 2),
15
+ # s(:integer, 3)))
16
+ # end
17
+ # end
18
+ #
19
+ # This way the amount of boilerplate code is greatly reduced.
20
+ module Sexp
21
+ # Creates a {Node} with type `type` and children `children`.
22
+ # Note that the resulting node is of the type AST::Node and not a
23
+ # subclass.
24
+ # This would not pose a problem with comparisons, as {Node#==}
25
+ # ignores metadata.
26
+ def s(type, *children)
27
+ Node.new(type, children)
28
+ end
29
+ end
30
+ end
metadata ADDED
@@ -0,0 +1,226 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: bel_parser
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0.alpha.1
5
+ platform: ruby
6
+ authors:
7
+ - Anthony Bargnesi
8
+ - Nick Bargnesi
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2016-04-05 00:00:00.000000000 Z
13
+ dependencies: []
14
+ description: Implements language versions 1.0 and 2.0.
15
+ email: abargnesi@selventa.com
16
+ executables:
17
+ - bel2_termcheck
18
+ extensions: []
19
+ extra_rdoc_files: []
20
+ files:
21
+ - ".gemspec"
22
+ - CHANGELOG.md
23
+ - LICENSE
24
+ - README.md
25
+ - VERSION
26
+ - bin/bel2_termcheck
27
+ - lib/bel_parser.rb
28
+ - lib/bel_parser/ast_filter.rb
29
+ - lib/bel_parser/ast_generator.rb
30
+ - lib/bel_parser/ast_validator.rb
31
+ - lib/bel_parser/expression/parser.rb
32
+ - lib/bel_parser/expression/term_semantics.rb
33
+ - lib/bel_parser/language.rb
34
+ - lib/bel_parser/language/function.rb
35
+ - lib/bel_parser/language/quoting.rb
36
+ - lib/bel_parser/language/semantic_ast.rb
37
+ - lib/bel_parser/language/semantics/analyzer.rb
38
+ - lib/bel_parser/language/signature.rb
39
+ - lib/bel_parser/language/specification.rb
40
+ - lib/bel_parser/language/syntax/expression/incomplete_node.rb
41
+ - lib/bel_parser/language/syntax/expression/invalid_term_function.rb
42
+ - lib/bel_parser/language/version1.rb
43
+ - lib/bel_parser/language/version1/functions/abundance.rb
44
+ - lib/bel_parser/language/version1/functions/biological_process.rb
45
+ - lib/bel_parser/language/version1/functions/catalytic_activity.rb
46
+ - lib/bel_parser/language/version1/functions/cell_secretion.rb
47
+ - lib/bel_parser/language/version1/functions/cell_surface_expression.rb
48
+ - lib/bel_parser/language/version1/functions/chaperone_activity.rb
49
+ - lib/bel_parser/language/version1/functions/complex_abundance.rb
50
+ - lib/bel_parser/language/version1/functions/composite_abundance.rb
51
+ - lib/bel_parser/language/version1/functions/degradation.rb
52
+ - lib/bel_parser/language/version1/functions/fusion.rb
53
+ - lib/bel_parser/language/version1/functions/gene_abundance.rb
54
+ - lib/bel_parser/language/version1/functions/gtp_bound_activity.rb
55
+ - lib/bel_parser/language/version1/functions/kinase_activity.rb
56
+ - lib/bel_parser/language/version1/functions/list.rb
57
+ - lib/bel_parser/language/version1/functions/micro_rna_abundance.rb
58
+ - lib/bel_parser/language/version1/functions/molecular_activity.rb
59
+ - lib/bel_parser/language/version1/functions/pathology.rb
60
+ - lib/bel_parser/language/version1/functions/peptidase_activity.rb
61
+ - lib/bel_parser/language/version1/functions/phosphatase_activity.rb
62
+ - lib/bel_parser/language/version1/functions/products.rb
63
+ - lib/bel_parser/language/version1/functions/protein_abundance.rb
64
+ - lib/bel_parser/language/version1/functions/protein_modification.rb
65
+ - lib/bel_parser/language/version1/functions/reactants.rb
66
+ - lib/bel_parser/language/version1/functions/reaction.rb
67
+ - lib/bel_parser/language/version1/functions/ribosylation_activity.rb
68
+ - lib/bel_parser/language/version1/functions/rna_abundance.rb
69
+ - lib/bel_parser/language/version1/functions/substitution.rb
70
+ - lib/bel_parser/language/version1/functions/transcriptional_activity.rb
71
+ - lib/bel_parser/language/version1/functions/translocation.rb
72
+ - lib/bel_parser/language/version1/functions/transport_activity.rb
73
+ - lib/bel_parser/language/version1/functions/truncation.rb
74
+ - lib/bel_parser/language/version1/return_types/abundance.rb
75
+ - lib/bel_parser/language/version1/return_types/any.rb
76
+ - lib/bel_parser/language/version1/return_types/biological_process.rb
77
+ - lib/bel_parser/language/version1/return_types/catalytic_activity.rb
78
+ - lib/bel_parser/language/version1/return_types/chaperone_activity.rb
79
+ - lib/bel_parser/language/version1/return_types/complex_abundance.rb
80
+ - lib/bel_parser/language/version1/return_types/fusion.rb
81
+ - lib/bel_parser/language/version1/return_types/gene_abundance.rb
82
+ - lib/bel_parser/language/version1/return_types/gtp_bound_activity.rb
83
+ - lib/bel_parser/language/version1/return_types/kinase_activity.rb
84
+ - lib/bel_parser/language/version1/return_types/list.rb
85
+ - lib/bel_parser/language/version1/return_types/micro_rna_abundance.rb
86
+ - lib/bel_parser/language/version1/return_types/molecular_activity.rb
87
+ - lib/bel_parser/language/version1/return_types/pathology.rb
88
+ - lib/bel_parser/language/version1/return_types/peptidase_activity.rb
89
+ - lib/bel_parser/language/version1/return_types/phosphatase_activity.rb
90
+ - lib/bel_parser/language/version1/return_types/products.rb
91
+ - lib/bel_parser/language/version1/return_types/protein_abundance.rb
92
+ - lib/bel_parser/language/version1/return_types/protein_modification.rb
93
+ - lib/bel_parser/language/version1/return_types/reactants.rb
94
+ - lib/bel_parser/language/version1/return_types/ribosylation_activity.rb
95
+ - lib/bel_parser/language/version1/return_types/rna_abundance.rb
96
+ - lib/bel_parser/language/version1/return_types/substitution.rb
97
+ - lib/bel_parser/language/version1/return_types/transcriptional_activity.rb
98
+ - lib/bel_parser/language/version1/return_types/transport_activity.rb
99
+ - lib/bel_parser/language/version1/return_types/truncation.rb
100
+ - lib/bel_parser/language/version2.rb
101
+ - lib/bel_parser/language/version2/functions/abundance.rb
102
+ - lib/bel_parser/language/version2/functions/activity.rb
103
+ - lib/bel_parser/language/version2/functions/biological_process.rb
104
+ - lib/bel_parser/language/version2/functions/cell_secretion.rb
105
+ - lib/bel_parser/language/version2/functions/cell_surface_expression.rb
106
+ - lib/bel_parser/language/version2/functions/complex_abundance.rb
107
+ - lib/bel_parser/language/version2/functions/composite_abundance.rb
108
+ - lib/bel_parser/language/version2/functions/degradation.rb
109
+ - lib/bel_parser/language/version2/functions/fragment.rb
110
+ - lib/bel_parser/language/version2/functions/from_location.rb
111
+ - lib/bel_parser/language/version2/functions/fusion.rb
112
+ - lib/bel_parser/language/version2/functions/gene_abundance.rb
113
+ - lib/bel_parser/language/version2/functions/list.rb
114
+ - lib/bel_parser/language/version2/functions/location.rb
115
+ - lib/bel_parser/language/version2/functions/micro_rna_abundance.rb
116
+ - lib/bel_parser/language/version2/functions/molecular_activity.rb
117
+ - lib/bel_parser/language/version2/functions/pathology.rb
118
+ - lib/bel_parser/language/version2/functions/products.rb
119
+ - lib/bel_parser/language/version2/functions/protein_abundance.rb
120
+ - lib/bel_parser/language/version2/functions/protein_modification.rb
121
+ - lib/bel_parser/language/version2/functions/reactants.rb
122
+ - lib/bel_parser/language/version2/functions/reaction.rb
123
+ - lib/bel_parser/language/version2/functions/rna_abundance.rb
124
+ - lib/bel_parser/language/version2/functions/to_location.rb
125
+ - lib/bel_parser/language/version2/functions/translocation.rb
126
+ - lib/bel_parser/language/version2/functions/variant.rb
127
+ - lib/bel_parser/language/version2/return_types/abundance.rb
128
+ - lib/bel_parser/language/version2/return_types/activity.rb
129
+ - lib/bel_parser/language/version2/return_types/any.rb
130
+ - lib/bel_parser/language/version2/return_types/biological_process.rb
131
+ - lib/bel_parser/language/version2/return_types/complex_abundance.rb
132
+ - lib/bel_parser/language/version2/return_types/fragment.rb
133
+ - lib/bel_parser/language/version2/return_types/from_location.rb
134
+ - lib/bel_parser/language/version2/return_types/fusion.rb
135
+ - lib/bel_parser/language/version2/return_types/gene_abundance.rb
136
+ - lib/bel_parser/language/version2/return_types/list.rb
137
+ - lib/bel_parser/language/version2/return_types/location.rb
138
+ - lib/bel_parser/language/version2/return_types/micro_rna_abundance.rb
139
+ - lib/bel_parser/language/version2/return_types/molecular_activity.rb
140
+ - lib/bel_parser/language/version2/return_types/pathology.rb
141
+ - lib/bel_parser/language/version2/return_types/products.rb
142
+ - lib/bel_parser/language/version2/return_types/protein_abundance.rb
143
+ - lib/bel_parser/language/version2/return_types/protein_modification.rb
144
+ - lib/bel_parser/language/version2/return_types/reactants.rb
145
+ - lib/bel_parser/language/version2/return_types/rna_abundance.rb
146
+ - lib/bel_parser/language/version2/return_types/to_location.rb
147
+ - lib/bel_parser/language/version2/return_types/variant.rb
148
+ - lib/bel_parser/mixin/line_continuator.rb
149
+ - lib/bel_parser/mixin/line_mapping.rb
150
+ - lib/bel_parser/parser.rb
151
+ - lib/bel_parser/parsers/ast/mapped_traversal.rb
152
+ - lib/bel_parser/parsers/ast/node.rb
153
+ - lib/bel_parser/parsers/ast/sexp.rb
154
+ - lib/bel_parser/parsers/ast/traversal.rb
155
+ - lib/bel_parser/parsers/bel_script.rb
156
+ - lib/bel_parser/parsers/bel_script/define_annotation.rb
157
+ - lib/bel_parser/parsers/bel_script/define_annotation.rl
158
+ - lib/bel_parser/parsers/bel_script/define_namespace.rb
159
+ - lib/bel_parser/parsers/bel_script/define_namespace.rl
160
+ - lib/bel_parser/parsers/bel_script/set.rb
161
+ - lib/bel_parser/parsers/bel_script/set.rl
162
+ - lib/bel_parser/parsers/bel_script/unset.rb
163
+ - lib/bel_parser/parsers/bel_script/unset.rl
164
+ - lib/bel_parser/parsers/common.rb
165
+ - lib/bel_parser/parsers/common/blank_line.rb
166
+ - lib/bel_parser/parsers/common/blank_line.rl
167
+ - lib/bel_parser/parsers/common/comment_line.rb
168
+ - lib/bel_parser/parsers/common/comment_line.rl
169
+ - lib/bel_parser/parsers/common/common.rb
170
+ - lib/bel_parser/parsers/common/common.rl
171
+ - lib/bel_parser/parsers/common/identifier.rb
172
+ - lib/bel_parser/parsers/common/identifier.rl
173
+ - lib/bel_parser/parsers/common/list.rb
174
+ - lib/bel_parser/parsers/common/list.rl
175
+ - lib/bel_parser/parsers/common/string.rb
176
+ - lib/bel_parser/parsers/common/string.rl
177
+ - lib/bel_parser/parsers/expression.rb
178
+ - lib/bel_parser/parsers/expression/comment.rb
179
+ - lib/bel_parser/parsers/expression/comment.rl
180
+ - lib/bel_parser/parsers/expression/parameter.rb
181
+ - lib/bel_parser/parsers/expression/parameter.rl
182
+ - lib/bel_parser/parsers/expression/relationship.rb
183
+ - lib/bel_parser/parsers/expression/relationship.rl
184
+ - lib/bel_parser/parsers/expression/statement_nested.rb
185
+ - lib/bel_parser/parsers/expression/statement_nested.rl
186
+ - lib/bel_parser/parsers/expression/statement_observed_term.rb
187
+ - lib/bel_parser/parsers/expression/statement_observed_term.rl
188
+ - lib/bel_parser/parsers/expression/statement_simple.rb
189
+ - lib/bel_parser/parsers/expression/statement_simple.rl
190
+ - lib/bel_parser/parsers/expression/term.rb
191
+ - lib/bel_parser/parsers/expression/term.rl
192
+ - lib/bel_parser/parsers/line_parser.rb
193
+ - lib/bel_parser/parsers/mixin/buffer.rb
194
+ - lib/bel_parser/parsers/nonblocking_io_wrapper.rb
195
+ - lib/bel_parser/script/parser.rb
196
+ - lib/bel_parser/vendor/ast.rb
197
+ - lib/bel_parser/vendor/ast/node.rb
198
+ - lib/bel_parser/vendor/ast/processor.rb
199
+ - lib/bel_parser/vendor/ast/processor/mixin.rb
200
+ - lib/bel_parser/vendor/ast/sexp.rb
201
+ homepage: https://github.com/OpenBEL/bel_parser
202
+ licenses:
203
+ - Apache-2.0
204
+ metadata: {}
205
+ post_install_message:
206
+ rdoc_options: []
207
+ require_paths:
208
+ - lib
209
+ required_ruby_version: !ruby/object:Gem::Requirement
210
+ requirements:
211
+ - - ">="
212
+ - !ruby/object:Gem::Version
213
+ version: 2.0.0
214
+ required_rubygems_version: !ruby/object:Gem::Requirement
215
+ requirements:
216
+ - - ">"
217
+ - !ruby/object:Gem::Version
218
+ version: 1.3.1
219
+ requirements: []
220
+ rubyforge_project:
221
+ rubygems_version: 2.5.1
222
+ signing_key:
223
+ specification_version: 4
224
+ summary: Parser for Biolgical Expression Language.
225
+ test_files: []
226
+ has_rdoc: