bel_parser 1.0.0.alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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,144 @@
1
+ # begin: ragel
2
+ =begin
3
+ %%{
4
+ machine bel;
5
+
6
+ include 'identifier.rl';
7
+ include 'string.rl';
8
+
9
+ action clear {
10
+ @buffers.delete(:string)
11
+ @buffers.delete(:ident)
12
+ }
13
+
14
+ action string {
15
+ @buffers[:list_arg] = list_item(@buffers[:string])
16
+ }
17
+
18
+ action ident {
19
+ @buffers[:list_arg] = list_item(@buffers[:ident])
20
+ }
21
+
22
+ action start_list {
23
+ @buffers[:list] = list()
24
+ }
25
+
26
+ action append_list {
27
+ # Append list argument if its value is not empty.
28
+ list_arg_value = @buffers[:list_arg].children[0].children[0]
29
+ if list_arg_value != ''
30
+ @buffers[:list] <<= @buffers[:list_arg]
31
+ end
32
+ }
33
+
34
+ action finish_list {
35
+ #TODO: Mark @buffers[:list] as complete.
36
+ }
37
+
38
+ action error_list_string {
39
+ #TODO: Mark @buffers[:list_arg] string as error.
40
+ @buffers[:list_arg] = list_item(@buffers[:string])
41
+ }
42
+
43
+ action error_list_ident {
44
+ #TODO: Mark @buffers[:list_arg] identifier as error.
45
+ @buffers[:list_arg] = list_item(@buffers[:ident])
46
+ }
47
+
48
+ action yield_complete_list {
49
+ yield @buffers[:list]
50
+ }
51
+
52
+ action yield_error_list {
53
+ @buffers[:list] ||= list()
54
+ yield @buffers[:list]
55
+ }
56
+
57
+ LIST =
58
+ '{' @start_list
59
+ SP*
60
+ (
61
+ STRING %string $err(error_list_string) |
62
+ IDENT %ident $err(error_list_ident)
63
+ ) $err(append_list) %append_list
64
+ SP*
65
+ (
66
+ ',' @clear
67
+ SP*
68
+ (
69
+ STRING %string $err(error_list_string) |
70
+ IDENT %ident $err(error_list_ident)
71
+ ) $err(append_list) %append_list
72
+ SP*
73
+ )*
74
+ '}' @finish_list;
75
+
76
+ list := LIST $err(yield_error_list) %yield_complete_list NL;
77
+ }%%
78
+ =end
79
+ # end: ragel
80
+
81
+ require_relative '../ast/node'
82
+ require_relative '../mixin/buffer'
83
+ require_relative '../nonblocking_io_wrapper'
84
+
85
+ module BELParser
86
+ module Parsers
87
+ module Common
88
+ module List
89
+
90
+ class << self
91
+
92
+ MAX_LENGTH = 1024 * 128 # 128K
93
+
94
+ def parse(content)
95
+ return nil unless content
96
+
97
+ Parser.new(content).each do |obj|
98
+ yield obj
99
+ end
100
+ end
101
+ end
102
+
103
+ private
104
+
105
+ class Parser
106
+ include Enumerable
107
+ include BELParser::Parsers::Buffer
108
+ include BELParser::Parsers::AST::Sexp
109
+
110
+ def initialize(content)
111
+ @content = content
112
+ # begin: ragel
113
+ %% write data;
114
+ # end: ragel
115
+ end
116
+
117
+ def each
118
+ @buffers = {}
119
+ data = @content.unpack('C*')
120
+ p = 0
121
+ pe = data.length
122
+ eof = data.length
123
+
124
+ # begin: ragel
125
+ %% write init;
126
+ %% write exec;
127
+ # end: ragel
128
+ end
129
+ end
130
+ end
131
+ end
132
+ end
133
+ end
134
+
135
+ if __FILE__ == $0
136
+ $stdin.each_line do |line|
137
+ BELParser::Parsers::Common::List.parse(line) { |obj|
138
+ puts obj.inspect
139
+ }
140
+ end
141
+ end
142
+
143
+ # vim: ft=ruby ts=2 sw=2:
144
+ # encoding: utf-8
@@ -0,0 +1,271 @@
1
+
2
+ # begin: ragel
3
+ =begin
4
+
5
+
6
+ =end
7
+ # end: ragel
8
+
9
+ require_relative '../ast/node'
10
+ require_relative '../mixin/buffer'
11
+ require_relative '../nonblocking_io_wrapper'
12
+
13
+ module BELParser
14
+ module Parsers
15
+ module Common
16
+ module String
17
+
18
+ class << self
19
+
20
+ MAX_LENGTH = 1024 * 128 # 128K
21
+
22
+ def parse(content)
23
+ return nil unless content
24
+
25
+ Parser.new(content).each do |obj|
26
+ yield obj
27
+ end
28
+ end
29
+ end
30
+
31
+ private
32
+
33
+ class Parser
34
+ include Enumerable
35
+ include BELParser::Parsers::Buffer
36
+ include BELParser::Parsers::AST::Sexp
37
+
38
+ def initialize(content)
39
+ @content = content
40
+ # begin: ragel
41
+
42
+ class << self
43
+ attr_accessor :_bel_trans_keys
44
+ private :_bel_trans_keys, :_bel_trans_keys=
45
+ end
46
+ self._bel_trans_keys = [
47
+ 0, 0, 34, 34, 34, 92,
48
+ 10, 10, 92, 92, 0,
49
+ 0, 0
50
+ ]
51
+
52
+ class << self
53
+ attr_accessor :_bel_key_spans
54
+ private :_bel_key_spans, :_bel_key_spans=
55
+ end
56
+ self._bel_key_spans = [
57
+ 0, 1, 59, 1, 1, 0
58
+ ]
59
+
60
+ class << self
61
+ attr_accessor :_bel_index_offsets
62
+ private :_bel_index_offsets, :_bel_index_offsets=
63
+ end
64
+ self._bel_index_offsets = [
65
+ 0, 0, 2, 62, 64, 66
66
+ ]
67
+
68
+ class << self
69
+ attr_accessor :_bel_indicies
70
+ private :_bel_indicies, :_bel_indicies=
71
+ end
72
+ self._bel_indicies = [
73
+ 1, 0, 3, 2, 2, 2, 2, 2,
74
+ 2, 2, 2, 2, 2, 2, 2, 2,
75
+ 2, 2, 2, 2, 2, 2, 2, 2,
76
+ 2, 2, 2, 2, 2, 2, 2, 2,
77
+ 2, 2, 2, 2, 2, 2, 2, 2,
78
+ 2, 2, 2, 2, 2, 2, 2, 2,
79
+ 2, 2, 2, 2, 2, 2, 2, 2,
80
+ 2, 2, 2, 2, 4, 2, 5, 0,
81
+ 4, 2, 6, 0
82
+ ]
83
+
84
+ class << self
85
+ attr_accessor :_bel_trans_targs
86
+ private :_bel_trans_targs, :_bel_trans_targs=
87
+ end
88
+ self._bel_trans_targs = [
89
+ 0, 2, 2, 3, 4, 5, 0
90
+ ]
91
+
92
+ class << self
93
+ attr_accessor :_bel_trans_actions
94
+ private :_bel_trans_actions, :_bel_trans_actions=
95
+ end
96
+ self._bel_trans_actions = [
97
+ 1, 2, 3, 3, 3, 4, 0
98
+ ]
99
+
100
+ class << self
101
+ attr_accessor :_bel_eof_actions
102
+ private :_bel_eof_actions, :_bel_eof_actions=
103
+ end
104
+ self._bel_eof_actions = [
105
+ 0, 1, 1, 1, 1, 0
106
+ ]
107
+
108
+ class << self
109
+ attr_accessor :bel_start
110
+ end
111
+ self.bel_start = 1;
112
+ class << self
113
+ attr_accessor :bel_first_final
114
+ end
115
+ self.bel_first_final = 5;
116
+ class << self
117
+ attr_accessor :bel_error
118
+ end
119
+ self.bel_error = 0;
120
+
121
+ class << self
122
+ attr_accessor :bel_en_string
123
+ end
124
+ self.bel_en_string = 1;
125
+
126
+
127
+ # end: ragel
128
+ end
129
+
130
+ def each
131
+ @buffers = {}
132
+ data = @content.unpack('C*')
133
+ p = 0
134
+ pe = data.length
135
+ eof = data.length
136
+
137
+ # begin: ragel
138
+
139
+ begin
140
+ p ||= 0
141
+ pe ||= data.length
142
+ cs = bel_start
143
+ end
144
+
145
+
146
+ begin
147
+ testEof = false
148
+ _slen, _trans, _keys, _inds, _acts, _nacts = nil
149
+ _goto_level = 0
150
+ _resume = 10
151
+ _eof_trans = 15
152
+ _again = 20
153
+ _test_eof = 30
154
+ _out = 40
155
+ while true
156
+ if _goto_level <= 0
157
+ if p == pe
158
+ _goto_level = _test_eof
159
+ next
160
+ end
161
+ if cs == 0
162
+ _goto_level = _out
163
+ next
164
+ end
165
+ end
166
+ if _goto_level <= _resume
167
+ _keys = cs << 1
168
+ _inds = _bel_index_offsets[cs]
169
+ _slen = _bel_key_spans[cs]
170
+ _wide = data[p].ord
171
+ _trans = if ( _slen > 0 &&
172
+ _bel_trans_keys[_keys] <= _wide &&
173
+ _wide <= _bel_trans_keys[_keys + 1]
174
+ ) then
175
+ _bel_indicies[ _inds + _wide - _bel_trans_keys[_keys] ]
176
+ else
177
+ _bel_indicies[ _inds + _slen ]
178
+ end
179
+ cs = _bel_trans_targs[_trans]
180
+ if _bel_trans_actions[_trans] != 0
181
+ case _bel_trans_actions[_trans]
182
+ when 3 then
183
+ begin
184
+
185
+ (@buffers[:string] ||= []) << data[p].ord
186
+ end
187
+ when 2 then
188
+ begin
189
+
190
+ @buffers[:string] = []
191
+ end
192
+ begin
193
+
194
+ (@buffers[:string] ||= []) << data[p].ord
195
+ end
196
+ when 4 then
197
+ begin
198
+
199
+ @buffers[:string] = string(utf8_string(@buffers[:string]))
200
+ end
201
+ begin
202
+
203
+ yield @buffers[:string]
204
+ end
205
+ when 1 then
206
+ begin
207
+
208
+ @buffers[:string] ||= []
209
+ @buffers[:string] = string(utf8_string(@buffers[:string]).sub(/\n$/, ''))
210
+ end
211
+ begin
212
+
213
+ @buffers[:string] ||= []
214
+ yield @buffers[:string]
215
+ end
216
+ end
217
+ end
218
+ end
219
+ if _goto_level <= _again
220
+ if cs == 0
221
+ _goto_level = _out
222
+ next
223
+ end
224
+ p += 1
225
+ if p != pe
226
+ _goto_level = _resume
227
+ next
228
+ end
229
+ end
230
+ if _goto_level <= _test_eof
231
+ if p == eof
232
+ case _bel_eof_actions[cs]
233
+ when 1 then
234
+ begin
235
+
236
+ @buffers[:string] ||= []
237
+ @buffers[:string] = string(utf8_string(@buffers[:string]).sub(/\n$/, ''))
238
+ end
239
+ begin
240
+
241
+ @buffers[:string] ||= []
242
+ yield @buffers[:string]
243
+ end
244
+ end
245
+ end
246
+
247
+ end
248
+ if _goto_level <= _out
249
+ break
250
+ end
251
+ end
252
+ end
253
+
254
+ # end: ragel
255
+ end
256
+ end
257
+ end
258
+ end
259
+ end
260
+ end
261
+
262
+ if __FILE__ == $0
263
+ $stdin.each_line do |line|
264
+ BELParser::Parsers::Common::String.parse(line) { |obj|
265
+ puts obj.inspect
266
+ }
267
+ end
268
+ end
269
+
270
+ # vim: ft=ruby ts=2 sw=2:
271
+ # encoding: utf-8
@@ -0,0 +1,107 @@
1
+ # begin: ragel
2
+ =begin
3
+ %%{
4
+ machine bel;
5
+
6
+ include 'common.rl';
7
+
8
+ action start_string {
9
+ @buffers[:string] = []
10
+ }
11
+
12
+ action append_string {
13
+ (@buffers[:string] ||= []) << fc
14
+ }
15
+
16
+ action finish_string {
17
+ @buffers[:string] = string(utf8_string(@buffers[:string]))
18
+ }
19
+
20
+ action error_string {
21
+ @buffers[:string] ||= []
22
+ @buffers[:string] = string(utf8_string(@buffers[:string]).sub(/\n$/, ''))
23
+ }
24
+
25
+ action yield_complete_string {
26
+ yield @buffers[:string]
27
+ }
28
+
29
+ action yield_error_string {
30
+ @buffers[:string] ||= []
31
+ yield @buffers[:string]
32
+ }
33
+
34
+ STRING =
35
+ ('"' ('\\\"' | [^"])** '"') >start_string $append_string %finish_string $err(error_string);
36
+
37
+ string :=
38
+ STRING $err(yield_error_string) %yield_complete_string
39
+ NL;
40
+ }%%
41
+ =end
42
+ # end: ragel
43
+
44
+ require_relative '../ast/node'
45
+ require_relative '../mixin/buffer'
46
+ require_relative '../nonblocking_io_wrapper'
47
+
48
+ module BELParser
49
+ module Parsers
50
+ module Common
51
+ module String
52
+
53
+ class << self
54
+
55
+ MAX_LENGTH = 1024 * 128 # 128K
56
+
57
+ def parse(content)
58
+ return nil unless content
59
+
60
+ Parser.new(content).each do |obj|
61
+ yield obj
62
+ end
63
+ end
64
+ end
65
+
66
+ private
67
+
68
+ class Parser
69
+ include Enumerable
70
+ include BELParser::Parsers::Buffer
71
+ include BELParser::Parsers::AST::Sexp
72
+
73
+ def initialize(content)
74
+ @content = content
75
+ # begin: ragel
76
+ %% write data;
77
+ # end: ragel
78
+ end
79
+
80
+ def each
81
+ @buffers = {}
82
+ data = @content.unpack('C*')
83
+ p = 0
84
+ pe = data.length
85
+ eof = data.length
86
+
87
+ # begin: ragel
88
+ %% write init;
89
+ %% write exec;
90
+ # end: ragel
91
+ end
92
+ end
93
+ end
94
+ end
95
+ end
96
+ end
97
+
98
+ if __FILE__ == $0
99
+ $stdin.each_line do |line|
100
+ BELParser::Parsers::Common::String.parse(line) { |obj|
101
+ puts obj.inspect
102
+ }
103
+ end
104
+ end
105
+
106
+ # vim: ft=ruby ts=2 sw=2:
107
+ # encoding: utf-8