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,97 @@
1
+ # begin: ragel
2
+ =begin
3
+ %%{
4
+ machine bel;
5
+
6
+ include 'common.rl';
7
+
8
+ action start_comment_line {
9
+ @buffers[:comment_line] = []
10
+ }
11
+
12
+ action append_comment_line {
13
+ @buffers[:comment_line] << fc
14
+ }
15
+
16
+ action finish_comment_line {
17
+ @buffers[:comment_line] = comment_line(
18
+ utf8_string(@buffers[:comment_line]))
19
+ }
20
+
21
+ action yield_comment_line {
22
+ yield @buffers[:comment_line]
23
+ }
24
+
25
+ COMMENT_LINE =
26
+ SP*
27
+ NUMBER_SIGN
28
+ (any - NL)* >start_comment_line $append_comment_line %finish_comment_line;
29
+
30
+ comment_line := COMMENT_LINE %yield_comment_line NL;
31
+ }%%
32
+ =end
33
+ # end: ragel
34
+
35
+ require_relative '../ast/node'
36
+ require_relative '../mixin/buffer'
37
+ require_relative '../nonblocking_io_wrapper'
38
+
39
+ module BELParser
40
+ module Parsers
41
+ module Common
42
+ module CommentLine
43
+
44
+ class << self
45
+
46
+ MAX_LENGTH = 1024 * 128 # 128K
47
+
48
+ def parse(content)
49
+ return nil unless content
50
+
51
+ Parser.new(content).each do |obj|
52
+ yield obj
53
+ end
54
+ end
55
+ end
56
+
57
+ private
58
+
59
+ class Parser
60
+ include Enumerable
61
+ include BELParser::Parsers::Buffer
62
+ include BELParser::Parsers::AST::Sexp
63
+
64
+ def initialize(content)
65
+ @content = content
66
+ # begin: ragel
67
+ %% write data;
68
+ # end: ragel
69
+ end
70
+
71
+ def each
72
+ @buffers = {}
73
+ data = @content.unpack('C*')
74
+ p = 0
75
+ pe = data.length
76
+
77
+ # begin: ragel
78
+ %% write init;
79
+ %% write exec;
80
+ # end: ragel
81
+ end
82
+ end
83
+ end
84
+ end
85
+ end
86
+ end
87
+
88
+ if __FILE__ == $0
89
+ $stdin.each_line do |line|
90
+ BELParser::Parsers::Common::CommentLine.parse(line) { |obj|
91
+ puts obj.inspect
92
+ }
93
+ end
94
+ end
95
+
96
+ # vim: ft=ruby ts=2 sw=2:
97
+ # encoding: utf-8
@@ -0,0 +1,7 @@
1
+
2
+ =begin
3
+
4
+
5
+ =end
6
+ # vim: ts=2 sw=2 ft=ragel:
7
+ # encoding: utf-8
@@ -0,0 +1,13 @@
1
+ =begin
2
+ %%{
3
+ machine bel;
4
+
5
+ NL = '\n';
6
+ SP = ' ' | '\t';
7
+ EQL = '=';
8
+ NUMBER_SIGN = '#';
9
+
10
+ }%%
11
+ =end
12
+ # vim: ts=2 sw=2 ft=ragel:
13
+ # encoding: utf-8
@@ -0,0 +1,289 @@
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 Identifier
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, 48, 122, 10, 122,
48
+ 0, 0, 0
49
+ ]
50
+
51
+ class << self
52
+ attr_accessor :_bel_key_spans
53
+ private :_bel_key_spans, :_bel_key_spans=
54
+ end
55
+ self._bel_key_spans = [
56
+ 0, 75, 113, 0
57
+ ]
58
+
59
+ class << self
60
+ attr_accessor :_bel_index_offsets
61
+ private :_bel_index_offsets, :_bel_index_offsets=
62
+ end
63
+ self._bel_index_offsets = [
64
+ 0, 0, 76, 190
65
+ ]
66
+
67
+ class << self
68
+ attr_accessor :_bel_indicies
69
+ private :_bel_indicies, :_bel_indicies=
70
+ end
71
+ self._bel_indicies = [
72
+ 1, 1, 1, 1, 1, 1, 1, 1,
73
+ 1, 1, 0, 0, 0, 0, 0, 0,
74
+ 0, 1, 1, 1, 1, 1, 1, 1,
75
+ 1, 1, 1, 1, 1, 1, 1, 1,
76
+ 1, 1, 1, 1, 1, 1, 1, 1,
77
+ 1, 1, 1, 0, 0, 0, 0, 1,
78
+ 0, 1, 1, 1, 1, 1, 1, 1,
79
+ 1, 1, 1, 1, 1, 1, 1, 1,
80
+ 1, 1, 1, 1, 1, 1, 1, 1,
81
+ 1, 1, 1, 0, 2, 0, 0, 0,
82
+ 0, 0, 0, 0, 0, 0, 0, 0,
83
+ 0, 0, 0, 0, 0, 0, 0, 0,
84
+ 0, 0, 0, 0, 0, 0, 0, 0,
85
+ 0, 0, 0, 0, 0, 0, 0, 0,
86
+ 0, 0, 3, 3, 3, 3, 3, 3,
87
+ 3, 3, 3, 3, 0, 0, 0, 0,
88
+ 0, 0, 0, 3, 3, 3, 3, 3,
89
+ 3, 3, 3, 3, 3, 3, 3, 3,
90
+ 3, 3, 3, 3, 3, 3, 3, 3,
91
+ 3, 3, 3, 3, 3, 0, 0, 0,
92
+ 0, 3, 0, 3, 3, 3, 3, 3,
93
+ 3, 3, 3, 3, 3, 3, 3, 3,
94
+ 3, 3, 3, 3, 3, 3, 3, 3,
95
+ 3, 3, 3, 3, 3, 0, 4, 0
96
+ ]
97
+
98
+ class << self
99
+ attr_accessor :_bel_trans_targs
100
+ private :_bel_trans_targs, :_bel_trans_targs=
101
+ end
102
+ self._bel_trans_targs = [
103
+ 0, 2, 3, 2, 0
104
+ ]
105
+
106
+ class << self
107
+ attr_accessor :_bel_trans_actions
108
+ private :_bel_trans_actions, :_bel_trans_actions=
109
+ end
110
+ self._bel_trans_actions = [
111
+ 1, 2, 3, 4, 0
112
+ ]
113
+
114
+ class << self
115
+ attr_accessor :_bel_eof_actions
116
+ private :_bel_eof_actions, :_bel_eof_actions=
117
+ end
118
+ self._bel_eof_actions = [
119
+ 0, 1, 1, 0
120
+ ]
121
+
122
+ class << self
123
+ attr_accessor :bel_start
124
+ end
125
+ self.bel_start = 1;
126
+ class << self
127
+ attr_accessor :bel_first_final
128
+ end
129
+ self.bel_first_final = 3;
130
+ class << self
131
+ attr_accessor :bel_error
132
+ end
133
+ self.bel_error = 0;
134
+
135
+ class << self
136
+ attr_accessor :bel_en_ident
137
+ end
138
+ self.bel_en_ident = 1;
139
+
140
+
141
+ # end: ragel
142
+ end
143
+
144
+ def each
145
+ @buffers = {}
146
+ data = @content.unpack('C*')
147
+ p = 0
148
+ pe = data.length
149
+ eof = data.length
150
+
151
+ # begin: ragel
152
+
153
+ begin
154
+ p ||= 0
155
+ pe ||= data.length
156
+ cs = bel_start
157
+ end
158
+
159
+
160
+ begin
161
+ testEof = false
162
+ _slen, _trans, _keys, _inds, _acts, _nacts = nil
163
+ _goto_level = 0
164
+ _resume = 10
165
+ _eof_trans = 15
166
+ _again = 20
167
+ _test_eof = 30
168
+ _out = 40
169
+ while true
170
+ if _goto_level <= 0
171
+ if p == pe
172
+ _goto_level = _test_eof
173
+ next
174
+ end
175
+ if cs == 0
176
+ _goto_level = _out
177
+ next
178
+ end
179
+ end
180
+ if _goto_level <= _resume
181
+ _keys = cs << 1
182
+ _inds = _bel_index_offsets[cs]
183
+ _slen = _bel_key_spans[cs]
184
+ _wide = data[p].ord
185
+ _trans = if ( _slen > 0 &&
186
+ _bel_trans_keys[_keys] <= _wide &&
187
+ _wide <= _bel_trans_keys[_keys + 1]
188
+ ) then
189
+ _bel_indicies[ _inds + _wide - _bel_trans_keys[_keys] ]
190
+ else
191
+ _bel_indicies[ _inds + _slen ]
192
+ end
193
+ cs = _bel_trans_targs[_trans]
194
+ if _bel_trans_actions[_trans] != 0
195
+ case _bel_trans_actions[_trans]
196
+ when 4 then
197
+ begin
198
+
199
+ (@buffers[:ident] ||= []) << data[p].ord
200
+ end
201
+ when 2 then
202
+ begin
203
+
204
+ @buffers[:ident] = []
205
+ end
206
+ begin
207
+
208
+ (@buffers[:ident] ||= []) << data[p].ord
209
+ end
210
+ when 3 then
211
+ begin
212
+
213
+ @buffers[:ident] = identifier(utf8_string(@buffers[:ident]))
214
+ end
215
+ begin
216
+
217
+ yield @buffers[:ident]
218
+ end
219
+ when 1 then
220
+ begin
221
+
222
+ unless @buffers[:ident].is_a?(::AST::Node)
223
+ @buffers[:ident] ||= []
224
+ @buffers[:ident] = identifier(utf8_string(@buffers[:ident]).sub(/\n$/, ''))
225
+ end
226
+ end
227
+ begin
228
+
229
+ @buffers[:ident] ||= []
230
+ yield @buffers[:ident]
231
+ end
232
+ end
233
+ end
234
+ end
235
+ if _goto_level <= _again
236
+ if cs == 0
237
+ _goto_level = _out
238
+ next
239
+ end
240
+ p += 1
241
+ if p != pe
242
+ _goto_level = _resume
243
+ next
244
+ end
245
+ end
246
+ if _goto_level <= _test_eof
247
+ if p == eof
248
+ case _bel_eof_actions[cs]
249
+ when 1 then
250
+ begin
251
+
252
+ unless @buffers[:ident].is_a?(::AST::Node)
253
+ @buffers[:ident] ||= []
254
+ @buffers[:ident] = identifier(utf8_string(@buffers[:ident]).sub(/\n$/, ''))
255
+ end
256
+ end
257
+ begin
258
+
259
+ @buffers[:ident] ||= []
260
+ yield @buffers[:ident]
261
+ end
262
+ end
263
+ end
264
+
265
+ end
266
+ if _goto_level <= _out
267
+ break
268
+ end
269
+ end
270
+ end
271
+
272
+ # end: ragel
273
+ end
274
+ end
275
+ end
276
+ end
277
+ end
278
+ end
279
+
280
+ if __FILE__ == $0
281
+ $stdin.each_line do |line|
282
+ BELParser::Parsers::Common::Identifier.parse(line) { |obj|
283
+ puts obj.inspect
284
+ }
285
+ end
286
+ end
287
+
288
+ # vim: ft=ruby ts=2 sw=2:
289
+ # encoding: utf-8
@@ -0,0 +1,106 @@
1
+ # begin: ragel
2
+ =begin
3
+ %%{
4
+ machine bel;
5
+
6
+ include 'common.rl';
7
+
8
+ action start_ident {
9
+ @buffers[:ident] = []
10
+ }
11
+
12
+ action append_ident {
13
+ (@buffers[:ident] ||= []) << fc
14
+ }
15
+
16
+ action finish_ident {
17
+ @buffers[:ident] = identifier(utf8_string(@buffers[:ident]))
18
+ }
19
+
20
+ action yield_complete_ident {
21
+ yield @buffers[:ident]
22
+ }
23
+
24
+ action error_ident {
25
+ unless @buffers[:ident].is_a?(::AST::Node)
26
+ @buffers[:ident] ||= []
27
+ @buffers[:ident] = identifier(utf8_string(@buffers[:ident]).sub(/\n$/, ''))
28
+ end
29
+ }
30
+
31
+ action yield_error_ident {
32
+ @buffers[:ident] ||= []
33
+ yield @buffers[:ident]
34
+ }
35
+
36
+ IDENT = [a-zA-Z0-9_]+ >start_ident $append_ident %finish_ident $err(error_ident);
37
+
38
+ ident := IDENT $err(yield_error_ident) %yield_complete_ident NL;
39
+ }%%
40
+ =end
41
+ # end: ragel
42
+
43
+ require_relative '../ast/node'
44
+ require_relative '../mixin/buffer'
45
+ require_relative '../nonblocking_io_wrapper'
46
+
47
+ module BELParser
48
+ module Parsers
49
+ module Common
50
+ module Identifier
51
+
52
+ class << self
53
+
54
+ MAX_LENGTH = 1024 * 128 # 128K
55
+
56
+ def parse(content)
57
+ return nil unless content
58
+
59
+ Parser.new(content).each do |obj|
60
+ yield obj
61
+ end
62
+ end
63
+ end
64
+
65
+ private
66
+
67
+ class Parser
68
+ include Enumerable
69
+ include BELParser::Parsers::Buffer
70
+ include BELParser::Parsers::AST::Sexp
71
+
72
+ def initialize(content)
73
+ @content = content
74
+ # begin: ragel
75
+ %% write data;
76
+ # end: ragel
77
+ end
78
+
79
+ def each
80
+ @buffers = {}
81
+ data = @content.unpack('C*')
82
+ p = 0
83
+ pe = data.length
84
+ eof = data.length
85
+
86
+ # begin: ragel
87
+ %% write init;
88
+ %% write exec;
89
+ # end: ragel
90
+ end
91
+ end
92
+ end
93
+ end
94
+ end
95
+ end
96
+
97
+ if __FILE__ == $0
98
+ $stdin.each_line do |line|
99
+ BELParser::Parsers::Common::Identifier.parse(line) { |obj|
100
+ puts obj.inspect
101
+ }
102
+ end
103
+ end
104
+
105
+ # vim: ft=ruby ts=2 sw=2:
106
+ # encoding: utf-8