bel_parser 1.0.8-java → 1.1.1-java

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 (112) hide show
  1. checksums.yaml +4 -4
  2. data/{.gemspec-java → .gemspec} +11 -4
  3. data/VERSION +1 -1
  4. data/bin/bel2_compatibility +12 -9
  5. data/bin/bel2_upgrade +18 -6
  6. data/bin/bel2_validator +6 -3
  7. data/bin/bel_script_reader +1 -0
  8. data/lib/bel_parser/completion.rb +984 -0
  9. data/lib/bel_parser/language/apply_namespace_encoding.rb +14 -3
  10. data/lib/bel_parser/language/expression_validator.rb +1 -2
  11. data/lib/bel_parser/language/function.rb +4 -0
  12. data/lib/bel_parser/language/relationship.rb +4 -0
  13. data/lib/bel_parser/language/semantics/function_deprecation.rb +1 -0
  14. data/lib/bel_parser/language/semantics/list_function_subject.rb +2 -0
  15. data/lib/bel_parser/language/semantics/multiple_subject_object.rb +4 -1
  16. data/lib/bel_parser/language/semantics/nested_statement_without_object.rb +43 -0
  17. data/lib/bel_parser/language/semantics/non_object_list.rb +3 -0
  18. data/lib/bel_parser/language/semantics/relationship_not_listable.rb +2 -0
  19. data/lib/bel_parser/language/semantics/signature_mapping.rb +2 -0
  20. data/lib/bel_parser/language/semantics_ast.rb +0 -7
  21. data/lib/bel_parser/language/syntax/invalid_function.rb +6 -1
  22. data/lib/bel_parser/language/syntax/invalid_relationship.rb +1 -0
  23. data/lib/bel_parser/language/version1_0/relationships/acts_in.rb +9 -9
  24. data/lib/bel_parser/language/version1_0/relationships/analogous.rb +6 -4
  25. data/lib/bel_parser/language/version1_0/relationships/association.rb +8 -7
  26. data/lib/bel_parser/language/version1_0/relationships/biomarker_for.rb +6 -5
  27. data/lib/bel_parser/language/version1_0/relationships/causes_no_change.rb +8 -7
  28. data/lib/bel_parser/language/version1_0/relationships/decreases.rb +13 -12
  29. data/lib/bel_parser/language/version1_0/relationships/directly_decreases.rb +8 -6
  30. data/lib/bel_parser/language/version1_0/relationships/directly_increases.rb +8 -6
  31. data/lib/bel_parser/language/version1_0/relationships/has_component.rb +14 -14
  32. data/lib/bel_parser/language/version1_0/relationships/has_components.rb +12 -11
  33. data/lib/bel_parser/language/version1_0/relationships/has_member.rb +10 -8
  34. data/lib/bel_parser/language/version1_0/relationships/has_members.rb +12 -11
  35. data/lib/bel_parser/language/version1_0/relationships/has_modification.rb +9 -7
  36. data/lib/bel_parser/language/version1_0/relationships/has_product.rb +10 -8
  37. data/lib/bel_parser/language/version1_0/relationships/has_variant.rb +9 -7
  38. data/lib/bel_parser/language/version1_0/relationships/includes.rb +11 -10
  39. data/lib/bel_parser/language/version1_0/relationships/increases.rb +12 -13
  40. data/lib/bel_parser/language/version1_0/relationships/is_a.rb +10 -8
  41. data/lib/bel_parser/language/version1_0/relationships/negative_correlation.rb +9 -7
  42. data/lib/bel_parser/language/version1_0/relationships/orthologous.rb +9 -8
  43. data/lib/bel_parser/language/version1_0/relationships/positive_correlation.rb +8 -5
  44. data/lib/bel_parser/language/version1_0/relationships/prognostic_biomarker_for.rb +8 -6
  45. data/lib/bel_parser/language/version1_0/relationships/rate_limiting_step_of.rb +10 -9
  46. data/lib/bel_parser/language/version1_0/relationships/reactant_in.rb +10 -8
  47. data/lib/bel_parser/language/version1_0/relationships/sub_process_of.rb +13 -12
  48. data/lib/bel_parser/language/version1_0/relationships/transcribed_to.rb +8 -7
  49. data/lib/bel_parser/language/version1_0/relationships/translated_to.rb +9 -7
  50. data/lib/bel_parser/language/version1_0/relationships/translocates.rb +10 -9
  51. data/lib/bel_parser/language/version2_0/functions/protein_modification.rb +1 -2
  52. data/lib/bel_parser/language/version2_0/functions/translocation.rb +1 -2
  53. data/lib/bel_parser/language/version2_0/functions/variant.rb +1 -2
  54. data/lib/bel_parser/language/version2_0/relationships/acts_in.rb +10 -9
  55. data/lib/bel_parser/language/version2_0/relationships/biomarker_for.rb +7 -5
  56. data/lib/bel_parser/language/version2_0/relationships/causes_no_change.rb +9 -7
  57. data/lib/bel_parser/language/version2_0/relationships/decreases.rb +13 -12
  58. data/lib/bel_parser/language/version2_0/relationships/directly_decreases.rb +8 -6
  59. data/lib/bel_parser/language/version2_0/relationships/directly_increases.rb +8 -6
  60. data/lib/bel_parser/language/version2_0/relationships/has_component.rb +15 -14
  61. data/lib/bel_parser/language/version2_0/relationships/has_components.rb +12 -11
  62. data/lib/bel_parser/language/version2_0/relationships/has_member.rb +9 -8
  63. data/lib/bel_parser/language/version2_0/relationships/has_members.rb +12 -11
  64. data/lib/bel_parser/language/version2_0/relationships/has_modification.rb +9 -7
  65. data/lib/bel_parser/language/version2_0/relationships/has_product.rb +10 -8
  66. data/lib/bel_parser/language/version2_0/relationships/has_variant.rb +9 -7
  67. data/lib/bel_parser/language/version2_0/relationships/includes.rb +11 -10
  68. data/lib/bel_parser/language/version2_0/relationships/increases.rb +13 -12
  69. data/lib/bel_parser/language/version2_0/relationships/is_a.rb +10 -8
  70. data/lib/bel_parser/language/version2_0/relationships/negative_correlation.rb +9 -7
  71. data/lib/bel_parser/language/version2_0/relationships/orthologous.rb +10 -8
  72. data/lib/bel_parser/language/version2_0/relationships/positive_correlation.rb +7 -5
  73. data/lib/bel_parser/language/version2_0/relationships/prognostic_biomarker_for.rb +8 -6
  74. data/lib/bel_parser/language/version2_0/relationships/rate_limiting_step_of.rb +10 -9
  75. data/lib/bel_parser/language/version2_0/relationships/reactant_in.rb +10 -8
  76. data/lib/bel_parser/language/version2_0/relationships/regulates.rb +9 -8
  77. data/lib/bel_parser/language/version2_0/relationships/sub_process_of.rb +13 -12
  78. data/lib/bel_parser/language/version2_0/relationships/transcribed_to.rb +8 -7
  79. data/lib/bel_parser/language/version2_0/relationships/translated_to.rb +9 -7
  80. data/lib/bel_parser/language/version2_0/relationships/translocates.rb +10 -9
  81. data/lib/bel_parser/mixin/levenshtein.rb +20 -0
  82. data/lib/bel_parser/parsers/ast/node.rb +49 -2
  83. data/lib/bel_parser/parsers/bel_script/define_annotation.rb +156 -156
  84. data/lib/bel_parser/parsers/bel_script/define_namespace.rb +60 -60
  85. data/lib/bel_parser/parsers/bel_script/set.rb +200 -200
  86. data/lib/bel_parser/parsers/bel_script/set_document.rb +188 -188
  87. data/lib/bel_parser/parsers/bel_script/unset.rb +14 -14
  88. data/lib/bel_parser/parsers/common/common.rl +1 -0
  89. data/lib/bel_parser/parsers/common/function.rb +8 -8
  90. data/lib/bel_parser/parsers/common/function.rl +6 -6
  91. data/lib/bel_parser/parsers/common/identifier.rb +3 -3
  92. data/lib/bel_parser/parsers/common/identifier.rl +4 -4
  93. data/lib/bel_parser/parsers/common/list.rb +78 -78
  94. data/lib/bel_parser/parsers/common/multi_identifier.rb +275 -0
  95. data/lib/bel_parser/parsers/common/multi_identifier.rl +141 -0
  96. data/lib/bel_parser/parsers/common/string.rb +6 -6
  97. data/lib/bel_parser/parsers/common/string.rl +4 -4
  98. data/lib/bel_parser/parsers/common.rb +1 -0
  99. data/lib/bel_parser/parsers/expression/nested_statement.rb +30180 -29055
  100. data/lib/bel_parser/parsers/expression/observed_term.rb +1456 -1099
  101. data/lib/bel_parser/parsers/expression/parameter.rb +192 -111
  102. data/lib/bel_parser/parsers/expression/parameter.rl +6 -3
  103. data/lib/bel_parser/parsers/expression/relationship.rb +43 -19
  104. data/lib/bel_parser/parsers/expression/relationship.rl +1 -0
  105. data/lib/bel_parser/parsers/expression/simple_statement.rb +17805 -17093
  106. data/lib/bel_parser/parsers/expression/statement_autocomplete.rb +1035 -0
  107. data/lib/bel_parser/parsers/expression/statement_autocomplete.rl +736 -0
  108. data/lib/bel_parser/parsers/expression/term.rb +960 -705
  109. data/lib/bel_parser/parsers/serializer.rb +8 -4
  110. data/lib/bel_parser/version.rb +33 -0
  111. data/lib/bel_parser.rb +3 -0
  112. metadata +26 -4
@@ -0,0 +1,736 @@
1
+ =begin
2
+ %%{
3
+ machine statement_autocomplete;
4
+
5
+ O_PAREN = '(';
6
+ C_PAREN = ')';
7
+
8
+ SPACES = [ \t]+;
9
+ COLON = ':';
10
+ COMMA = ',';
11
+
12
+ IDENT = [a-zA-Z0-9_]+;
13
+ STRING = '"' ('\\\"' | [^"\n])* '"'?;
14
+ RELATIONSHIP = ('!'..'~')+;
15
+
16
+ action IDENT {
17
+ # begin ruby
18
+ trace('IDENT')
19
+ @last_state = :IDENT
20
+
21
+ @value =
22
+ identifier(
23
+ utf8_string(data[ts...te]),
24
+ character_range: [ts, te])
25
+ if !@prefix.nil?
26
+ @param =
27
+ parameter(
28
+ @prefix,
29
+ value(
30
+ @value,
31
+ character_range: @value.character_range),
32
+ character_range: [@prefix.range_start, @value.range_end])
33
+ @value = nil
34
+ end
35
+ # end ruby
36
+ }
37
+
38
+ action RELATIONSHIP {
39
+ # begin ruby
40
+ trace('RELATIONSHIP')
41
+ @last_state = :RELATIONSHIP
42
+
43
+ @relationship =
44
+ relationship(
45
+ utf8_string(data[ts...te]),
46
+ character_range: [ts, te])
47
+
48
+ range_end =
49
+ if @statement_stack[-1].object?
50
+ @statement_stack[-1].object.range_end
51
+ else
52
+ @relationship.range_end
53
+ end
54
+
55
+ @statement_stack[-1] =
56
+ statement(
57
+ @statement_stack[-1].subject,
58
+ @relationship,
59
+ @statement_stack[-1].object,
60
+ character_range: [@statement_stack[-1].range_start, range_end])
61
+
62
+ # return to term scanner
63
+ fret;
64
+
65
+ # end ruby
66
+ }
67
+
68
+ action EOF_RELATIONSHIP {
69
+ # begin ruby
70
+ trace('EOF_RELATIONSHIP')
71
+
72
+ @relationship =
73
+ relationship(
74
+ nil,
75
+ character_range: [ts, ts])
76
+
77
+ range_end =
78
+ if @statement_stack[-1].object?
79
+ @statement_stack[-1].object.range_end
80
+ else
81
+ @relationship.range_end
82
+ end
83
+
84
+ @statement_stack[-1] =
85
+ statement(
86
+ @statement_stack[-1].subject,
87
+ @relationship,
88
+ @statement_stack[-1].object,
89
+ character_range: [@statement_stack[-1].range_start, range_end])
90
+
91
+ # go back one char to force EOF on return to term scanner
92
+ p -= 1
93
+
94
+ # return to term scanner
95
+ fret;
96
+ # end ruby
97
+ }
98
+
99
+ action STRING {
100
+ # begin ruby
101
+ trace('STRING')
102
+ @last_state = :STRING
103
+
104
+ @value =
105
+ string(
106
+ utf8_string(data[ts...te]),
107
+ character_range: [ts, te])
108
+ if !@prefix.nil?
109
+ @param =
110
+ parameter(
111
+ @prefix,
112
+ value(
113
+ @value,
114
+ character_range: @value.character_range),
115
+ character_range: [@prefix.range_start, @value.range_end])
116
+ @value = nil
117
+ end
118
+ # end ruby
119
+ }
120
+
121
+ action O_PAREN {
122
+ # begin ruby
123
+ trace('O_PAREN')
124
+
125
+ case @last_state
126
+ when :RELATIONSHIP
127
+ @statement_stack << @statement_stack[-1]
128
+ @statement_stack[-1] = statement(nil, nil, nil)
129
+ @relationship = nil
130
+
131
+ @term_stack <<
132
+ term(
133
+ function(
134
+ nil,
135
+ character_range: [ts, ts]),
136
+ character_range: [ts, te])
137
+ else
138
+ term =
139
+ if @value == nil
140
+ term(
141
+ function(
142
+ nil,
143
+ character_range: [ts, ts]),
144
+ character_range: [ts, te])
145
+ else
146
+ term(
147
+ function(
148
+ @value,
149
+ character_range: @value.character_range),
150
+ character_range: [@value.range_start, @value.range_end + 1])
151
+ end
152
+
153
+ @term_stack << term
154
+ @value = nil
155
+ end
156
+
157
+ @paren_counter += 1
158
+ @last_state = :O_PAREN
159
+ # end ruby
160
+ }
161
+
162
+ action C_PAREN {
163
+ # begin ruby
164
+ trace('C_PAREN')
165
+ @paren_counter -= 1
166
+
167
+ case @last_state
168
+ when :COMMA, :O_PAREN
169
+ function, *arguments = @term_stack[-1].children
170
+ empty_argument =
171
+ argument(
172
+ nil,
173
+ character_range: [ts, ts])
174
+ @term_stack[-1] =
175
+ term(
176
+ *[function, arguments, empty_argument].flatten.compact,
177
+ character_range: [function.range_start, te])
178
+ else
179
+ if !@param.nil?
180
+ function, *arguments = @term_stack[-1].children
181
+ arg_from_param =
182
+ argument(
183
+ @param,
184
+ character_range: @param.character_range)
185
+ @term_stack[-1] =
186
+ term(
187
+ *[function, arguments, arg_from_param].flatten.compact,
188
+ character_range: [function.range_start, te])
189
+ @param = nil
190
+ @prefix = nil
191
+ elsif !@value.nil?
192
+ function, *arguments = @term_stack[-1].children
193
+ arg_from_value =
194
+ argument(
195
+ parameter(
196
+ nil,
197
+ value(
198
+ @value,
199
+ character_range: @value.character_range),
200
+ character_range: @value.character_range),
201
+ character_range: @value.character_range)
202
+ @term_stack[-1] =
203
+ term(
204
+ *[function, arguments, arg_from_value].flatten.compact,
205
+ character_range: [function.range_start, @value.range_end + 1])
206
+ @value = nil
207
+ elsif !@prefix.nil?
208
+ function, *arguments = @term_stack[-1].children
209
+ arg_from_prefix =
210
+ argument(
211
+ parameter(
212
+ @prefix,
213
+ value(
214
+ identifier(
215
+ '',
216
+ character_range: [@prefix.range_end + 1, @prefix.range_end + 1]),
217
+ character_range: [@prefix.range_end + 1, @prefix.range_end + 1]),
218
+ character_range: @prefix.character_range),
219
+ character_range: @prefix.character_range)
220
+ @term_stack[-1] =
221
+ term(
222
+ *[function, arguments, arg_from_prefix].flatten.compact,
223
+ character_range: [function.range_start, @prefix.range_end + 1])
224
+ @prefix = nil
225
+ else
226
+ term = @term_stack[-1]
227
+ term.character_range = [term.range_start, term.range_end + 1]
228
+ end
229
+ end
230
+
231
+ if @term_stack.length > 1
232
+ # pop stack
233
+ inner = @term_stack.pop
234
+ outer = @term_stack[-1]
235
+
236
+ # reconstruct previous term on stack
237
+ @term_stack[-1] =
238
+ term(
239
+ outer.function,
240
+ *(outer.arguments << argument(inner, character_range: inner.character_range)),
241
+ character_range: [outer.range_start, inner.range_end + 1])
242
+ end
243
+
244
+ trace("C_PAREN: @term_stack is\n#{@term_stack}")
245
+ if @term_stack.length == 1
246
+ @bel_part = :relationship
247
+ trace("set @bel_part to #{@bel_part}")
248
+ end
249
+
250
+ @last_state = :C_PAREN
251
+ # end ruby
252
+ }
253
+
254
+ action COLON {
255
+ # begin ruby
256
+ trace('COLON')
257
+ @last_state = :COLON
258
+
259
+ if !@value.nil?
260
+ @prefix =
261
+ prefix(
262
+ @value,
263
+ character_range: @value.character_range)
264
+ @value = nil
265
+ else
266
+ @prefix =
267
+ prefix(
268
+ nil,
269
+ character_range: [ts, ts])
270
+ end
271
+ # end ruby
272
+ }
273
+
274
+ action COMMA {
275
+ # begin ruby
276
+ trace('COMMA')
277
+ @last_state = :COMMA
278
+
279
+ if !@term_stack.empty?
280
+ if !@param.nil?
281
+ function, *arguments = @term_stack[-1].children
282
+ arg_from_param =
283
+ argument(
284
+ @param,
285
+ character_range: @param.character_range)
286
+ @term_stack[-1] =
287
+ term(
288
+ *([function, arguments, arg_from_param].flatten.compact),
289
+ character_range: [function.range_start, @param.range_end + 1])
290
+ elsif !@value.nil?
291
+ function, *arguments = @term_stack[-1].children
292
+ arg_from_value =
293
+ argument(
294
+ parameter(
295
+ nil,
296
+ value(
297
+ @value,
298
+ character_range: @value.character_range),
299
+ character_range: @value.character_range),
300
+ character_range: @value.character_range)
301
+ @term_stack[-1] =
302
+ term(
303
+ *[function, arguments, arg_from_value].flatten.compact,
304
+ character_range: [function.range_start, arg_from_value.range_end + 1])
305
+ end
306
+ end
307
+
308
+ @param = nil
309
+ @prefix = nil
310
+ @value = nil
311
+ # end ruby
312
+ }
313
+
314
+ action SPACES {
315
+ # begin ruby
316
+ spaces = te-ts
317
+ trace("SPACES (#{spaces})")
318
+
319
+ case @bel_part
320
+ when :relationship
321
+ if @relationship
322
+ spaces -= 1
323
+ @bel_part = :term
324
+
325
+ # remove spaces and adjust pointers by the number of spaces removed
326
+ data.slice!(ts, spaces)
327
+ p -= spaces
328
+ pe -= spaces
329
+ eof -= spaces
330
+
331
+ if @original_caret > ts
332
+ if @original_caret < te
333
+ @space_adjusted_caret_position -= (@original_caret - ts)
334
+ else
335
+ @space_adjusted_caret_position -= spaces
336
+ end
337
+ end
338
+ else
339
+ spaces -= 1
340
+ # remove spaces and adjust pointers by the number of spaces removed
341
+ data.slice!(ts, spaces)
342
+ p -= spaces
343
+ pe -= spaces
344
+ eof -= spaces
345
+
346
+ if @original_caret > ts
347
+ if @original_caret < te
348
+ @space_adjusted_caret_position -= (@original_caret - ts)
349
+ else
350
+ @space_adjusted_caret_position -= spaces
351
+ end
352
+ end
353
+
354
+ # pop off term; add to statement_ast
355
+ completed_term = @term_stack[-1]
356
+ if @statement_stack[-1].subject.nil?
357
+ @statement_stack[-1] =
358
+ statement(
359
+ subject(
360
+ completed_term,
361
+ character_range: completed_term.character_range),
362
+ nil,
363
+ nil,
364
+ character_range: completed_term.character_range)
365
+ elsif @statement_stack[-1].object.nil?
366
+ object_node =
367
+ object(
368
+ completed_term,
369
+ character_range: completed_term.character_range)
370
+ @statement_stack[-1] =
371
+ statement(
372
+ @statement_stack[-1].subject,
373
+ @statement_stack[-1].relationship,
374
+ object_node,
375
+ character_range: [@statement_stack[-1].range_start, object_node.range_end])
376
+ end
377
+
378
+ @term_stack = []
379
+
380
+ # push the target state, jump to relationship scanner
381
+ # ...eventually to return
382
+ @relationship = nil
383
+ fcall relationship;
384
+ end
385
+ when :term
386
+ if @last_state == :COMMA
387
+ spaces -= 1
388
+ end
389
+
390
+ # remove spaces and adjust pointers by the number of spaces removed
391
+ data.slice!(ts, spaces)
392
+ p -= spaces
393
+ pe -= spaces
394
+ eof -= spaces
395
+
396
+ if @original_caret > ts
397
+ if @original_caret < te
398
+ @space_adjusted_caret_position -= (@original_caret - ts)
399
+ else
400
+ @space_adjusted_caret_position -= spaces
401
+ end
402
+ end
403
+ end
404
+ # end ruby
405
+ }
406
+
407
+ action EOF {
408
+ # begin ruby
409
+ trace('EOF')
410
+
411
+ if @term_stack.empty?
412
+ # coerce what has been completed into a term
413
+ if !@param.nil?
414
+ @term_stack[0] =
415
+ term(
416
+ nil,
417
+ argument(
418
+ @param,
419
+ character_range: @param.character_range),
420
+ character_range: @param.character_range)
421
+ elsif !@prefix.nil?
422
+ range = [@prefix.range_start, @prefix.range_end + 1]
423
+ @term_stack[0] =
424
+ term(
425
+ nil,
426
+ argument(
427
+ parameter(
428
+ @prefix,
429
+ nil,
430
+ character_range: range),
431
+ character_range: range),
432
+ character_range: range)
433
+ elsif !@value.nil?
434
+ @term_stack[0] =
435
+ term(
436
+ nil,
437
+ argument(
438
+ parameter(
439
+ nil,
440
+ value(
441
+ @value,
442
+ character_range: @value.character_range),
443
+ character_range: @value.character_range),
444
+ character_range: @value.character_range),
445
+ character_range: @value.character_range)
446
+ end
447
+ else
448
+ case @last_state
449
+ when :IDENT
450
+ if !@param.nil?
451
+ function, *arguments = @term_stack[-1].children
452
+ arg_from_param =
453
+ argument(
454
+ @param,
455
+ character_range: @param.character_range)
456
+ @term_stack[-1] =
457
+ term(
458
+ *[function, arguments, arg_from_param].flatten.compact,
459
+ character_range: [function.range_start, arg_from_param.range_end])
460
+ elsif !@value.nil?
461
+ function, *arguments = @term_stack[-1].children
462
+ arg_from_value =
463
+ argument(
464
+ parameter(
465
+ nil,
466
+ value(
467
+ @value,
468
+ character_range: @value.character_range),
469
+ character_range: @value.character_range),
470
+ character_range: @value.character_range)
471
+ @term_stack[-1] =
472
+ term(
473
+ *[function, arguments, arg_from_value].flatten.compact,
474
+ character_range: [function.range_start, @value.range_end])
475
+ end
476
+ when :STRING
477
+ if !@param.nil?
478
+ function, *arguments = @term_stack[-1].children
479
+ arg_from_param =
480
+ argument(
481
+ @param,
482
+ character_range: @param.character_range)
483
+ @term_stack[-1] =
484
+ term(
485
+ *[function, arguments, arg_from_param].flatten.compact,
486
+ character_range: [function.range_start, arg_from_param.range_end])
487
+ elsif !@value.nil?
488
+ function, *arguments = @term_stack[-1].children
489
+ arg_from_value =
490
+ argument(
491
+ parameter(
492
+ nil,
493
+ value(
494
+ @value,
495
+ character_range: @value.character_range),
496
+ character_range: @value.character_range),
497
+ character_range: @value.character_range)
498
+ @term_stack[-1] =
499
+ term(
500
+ *[function, *arguments, arg_from_value],
501
+ character_range: [function.range_start, arg_from_value.range_end])
502
+ end
503
+ when :COMMA, :O_PAREN
504
+ function, *arguments = @term_stack[-1].children
505
+ empty_argument =
506
+ argument(
507
+ nil,
508
+ character_range: [te - 1, te - 1])
509
+ @term_stack[-1] =
510
+ term(
511
+ *[function, *arguments, empty_argument],
512
+ character_range: [function.range_start, empty_argument.range_end])
513
+ when :COLON
514
+ function, *arguments = @term_stack[-1].children
515
+ empty_argument =
516
+ argument(
517
+ parameter(
518
+ @prefix,
519
+ nil,
520
+ character_range: [@prefix.range_start, @prefix.range_end + 1]),
521
+ character_range: [@prefix.range_start, @prefix.range_end + 1])
522
+ @term_stack[-1] =
523
+ term(
524
+ *[function, *arguments, empty_argument].flatten.compact,
525
+ character_range: [function.range_start, empty_argument.range_end])
526
+ end
527
+ end
528
+
529
+ # iff we have completed any term-related node
530
+ if !@term_stack.empty?
531
+ # combine terms
532
+ while @term_stack.length > 1
533
+ # pop stack
534
+ inner = @term_stack.pop
535
+ outer = @term_stack[-1]
536
+
537
+ # reconstruct previous term on stack
538
+ @term_stack[-1] =
539
+ term(
540
+ outer.function,
541
+ *(outer.arguments << argument(inner, character_range: inner.character_range)),
542
+ character_range: [outer.range_start, inner.range_end + 1])
543
+ end
544
+
545
+ # add to statement_ast
546
+ completed_term = @term_stack[-1]
547
+ if @statement_stack[-1].subject.nil?
548
+ @statement_stack[-1] =
549
+ statement(
550
+ subject(
551
+ completed_term,
552
+ character_range: completed_term.character_range),
553
+ nil,
554
+ nil,
555
+ character_range: completed_term.character_range)
556
+ elsif @statement_stack[-1].object.nil?
557
+ object_node =
558
+ object(
559
+ completed_term,
560
+ character_range: completed_term.character_range)
561
+ @statement_stack[-1] =
562
+ statement(
563
+ @statement_stack[-1].subject,
564
+ @statement_stack[-1].relationship,
565
+ object_node,
566
+ character_range: [@statement_stack[-1].range_start, object_node.range_end])
567
+ end
568
+ end
569
+
570
+ # yield statement
571
+ while @statement_stack.length > 1
572
+ # pop stack
573
+ nested = @statement_stack.pop
574
+ outer = @statement_stack[-1]
575
+
576
+ # reconstruct previous statement on stack
577
+ @statement_stack[-1] =
578
+ statement(
579
+ outer.subject,
580
+ outer.relationship,
581
+ object(
582
+ nested,
583
+ character_range: nested.character_range),
584
+ character_range: [outer.range_start, nested.range_end + 1])
585
+ end
586
+ yield @statement_stack.pop
587
+ # end ruby
588
+ }
589
+
590
+ relationship := |*
591
+ RELATIONSHIP => RELATIONSHIP;
592
+ any => EOF_RELATIONSHIP;
593
+ *|;
594
+
595
+ term := |*
596
+ IDENT => IDENT;
597
+ STRING => STRING;
598
+ O_PAREN => O_PAREN;
599
+ C_PAREN => C_PAREN;
600
+ COLON => COLON;
601
+ COMMA => COMMA;
602
+ SPACES => SPACES;
603
+ any => EOF;
604
+ *|;
605
+ }%%
606
+ =end
607
+
608
+ # begin ruby
609
+ require_relative '../../vendor/ast/processor/mixin'
610
+ require_relative '../ast/node'
611
+ require_relative '../mixin/buffer'
612
+ require_relative '../nonblocking_io_wrapper'
613
+ require_relative '../tracer'
614
+
615
+ module BELParser
616
+ module Parsers
617
+ module Expression
618
+ module StatementAutocomplete
619
+
620
+ class << self
621
+
622
+ MAX_LENGTH = 1024 * 128 # 128K
623
+
624
+ def parse(content, caret_position)
625
+ return nil unless content
626
+
627
+ if !content.end_with?("\n")
628
+ content = "#{content}\n"
629
+ end
630
+
631
+ parser = Parser.new(content, caret_position)
632
+ parser.each do |ast|
633
+ return [ast, parser.space_adjusted_caret_position]
634
+ end
635
+ end
636
+ end
637
+
638
+ private
639
+
640
+ class Parser
641
+ include Enumerable
642
+ include BELParser::Parsers::Buffer
643
+ include BELParser::Parsers::AST
644
+ include BELParser::Parsers::AST::Sexp
645
+ include BELParser::Parsers::Tracer
646
+
647
+ attr_reader :space_adjusted_caret_position
648
+
649
+ def initialize(content, caret_position)
650
+ @content = content
651
+ @original_caret = caret_position
652
+ @space_adjusted_caret_position = caret_position
653
+ %% write data;
654
+ end
655
+
656
+ def each
657
+ @last_state = nil
658
+ @spaces = 0
659
+ @value = nil
660
+ @prefix = nil
661
+ @param = nil
662
+ @term_stack = []
663
+ @statement_stack = [statement(nil, nil, nil)]
664
+ @paren_counter = 0
665
+ @relationship = nil
666
+ @bel_part = :term
667
+
668
+ stack = []
669
+ data = @content.unpack('C*')
670
+ p = 0
671
+ pe = data.length
672
+ eof = data.length
673
+
674
+ # begin: ragel
675
+ %% write init;
676
+ %% write exec;
677
+ # end: ragel
678
+ end
679
+ end
680
+ end
681
+ end
682
+ end
683
+ end
684
+
685
+ if __FILE__ == $0
686
+ require 'bel_parser/parsers/serializer'
687
+ class ::AST::Node
688
+ include BELParser::Parsers
689
+
690
+ def _metadata
691
+ ivars = instance_variables - [:@type, :@children, :@hash]
692
+ ivars.map { |iv| [iv, instance_variable_get(iv)] }.to_s
693
+ end
694
+ private :_metadata
695
+
696
+ def to_sexp(indent=0)
697
+ indented = " " * indent
698
+ sexp = "#{indented}(#{fancy_type} #{_metadata}"
699
+
700
+ first_node_child = children.index do |child|
701
+ child.is_a?(::AST::Node) || child.is_a?(Array)
702
+ end || children.count
703
+
704
+ children.each_with_index do |child, idx|
705
+ if child.is_a?(::AST::Node) && idx >= first_node_child
706
+ sexp << "\n#{child.to_sexp(indent + 1)}"
707
+ else
708
+ sexp << " #{child.inspect}"
709
+ end
710
+ end
711
+
712
+ sexp << ")"
713
+
714
+ sexp
715
+ end
716
+
717
+ def to_bel
718
+ serialize(self)
719
+ end
720
+ end
721
+
722
+ $stdin.each_line do |line|
723
+ ast, caret = BELParser::Parsers::Expression::StatementAutocomplete.parse(
724
+ line,
725
+ line.length-1 # adjust for newline
726
+ )
727
+ puts ast.to_sexp(1)
728
+ puts ast.to_bel
729
+ puts "#{' ' * caret}|"
730
+ puts "caret: #{caret}"
731
+ end
732
+ end
733
+ # end ruby
734
+
735
+ # vim: ft=ragel ts=2 sw=2 expandtab:
736
+ # encoding: utf-8