expressir 2.2.1 → 2.3.0

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 (190) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +1 -1
  3. data/.rubocop_todo.yml +253 -81
  4. data/Gemfile +4 -1
  5. data/README.adoc +63 -26
  6. data/benchmark/srl_benchmark.rb +386 -0
  7. data/benchmark/srl_native_benchmark.rb +142 -0
  8. data/benchmark/srl_ruby_benchmark.rb +130 -0
  9. data/expressir.gemspec +3 -2
  10. data/lib/expressir/benchmark.rb +1 -1
  11. data/lib/expressir/changes/item_change.rb +0 -1
  12. data/lib/expressir/changes/mapping_change.rb +0 -1
  13. data/lib/expressir/changes/schema_change.rb +0 -2
  14. data/lib/expressir/changes/version_change.rb +0 -3
  15. data/lib/expressir/changes.rb +5 -6
  16. data/lib/expressir/cli.rb +10 -24
  17. data/lib/expressir/commands/changes.rb +0 -2
  18. data/lib/expressir/commands/changes_import_eengine.rb +0 -3
  19. data/lib/expressir/commands/changes_validate.rb +0 -2
  20. data/lib/expressir/commands/format.rb +1 -1
  21. data/lib/expressir/commands/manifest.rb +0 -7
  22. data/lib/expressir/commands/package.rb +16 -29
  23. data/lib/expressir/commands/validate.rb +0 -2
  24. data/lib/expressir/commands/validate_load.rb +1 -1
  25. data/lib/expressir/commands.rb +20 -0
  26. data/lib/expressir/config.rb +0 -2
  27. data/lib/expressir/coverage.rb +11 -4
  28. data/lib/expressir/eengine/arm_compare_report.rb +1 -4
  29. data/lib/expressir/eengine/changes_section.rb +1 -3
  30. data/lib/expressir/eengine/compare_report.rb +1 -13
  31. data/lib/expressir/eengine/mim_compare_report.rb +1 -4
  32. data/lib/expressir/eengine/modified_object.rb +1 -2
  33. data/lib/expressir/eengine.rb +9 -0
  34. data/lib/expressir/errors.rb +3 -5
  35. data/lib/expressir/express/builder.rb +22 -7
  36. data/lib/expressir/express/builder_registry.rb +411 -0
  37. data/lib/expressir/express/builders/attribute_decl_builder.rb +0 -6
  38. data/lib/expressir/express/builders/built_in_builder.rb +1 -16
  39. data/lib/expressir/express/builders/constant_builder.rb +4 -19
  40. data/lib/expressir/express/builders/declaration_builder.rb +0 -4
  41. data/lib/expressir/express/builders/derive_clause_builder.rb +0 -2
  42. data/lib/expressir/express/builders/derived_attr_builder.rb +0 -2
  43. data/lib/expressir/express/builders/domain_rule_builder.rb +0 -2
  44. data/lib/expressir/express/builders/entity_decl_builder.rb +7 -13
  45. data/lib/expressir/express/builders/explicit_attr_builder.rb +5 -8
  46. data/lib/expressir/express/builders/expression_builder.rb +31 -67
  47. data/lib/expressir/express/builders/function_decl_builder.rb +20 -18
  48. data/lib/expressir/express/builders/interface_builder.rb +0 -20
  49. data/lib/expressir/express/builders/inverse_attr_builder.rb +0 -2
  50. data/lib/expressir/express/builders/inverse_attr_type_builder.rb +0 -6
  51. data/lib/expressir/express/builders/inverse_clause_builder.rb +0 -2
  52. data/lib/expressir/express/builders/literal_builder.rb +1 -15
  53. data/lib/expressir/express/builders/procedure_decl_builder.rb +20 -19
  54. data/lib/expressir/express/builders/qualifier_builder.rb +0 -27
  55. data/lib/expressir/express/builders/reference_builder.rb +1 -10
  56. data/lib/expressir/express/builders/rule_decl_builder.rb +21 -19
  57. data/lib/expressir/express/builders/schema_body_decl_builder.rb +0 -4
  58. data/lib/expressir/express/builders/schema_decl_builder.rb +7 -13
  59. data/lib/expressir/express/builders/schema_version_builder.rb +0 -6
  60. data/lib/expressir/express/builders/simple_id_builder.rb +1 -10
  61. data/lib/expressir/express/builders/statement_builder.rb +4 -32
  62. data/lib/expressir/express/builders/subtype_constraint_builder.rb +6 -30
  63. data/lib/expressir/express/builders/syntax_builder.rb +60 -7
  64. data/lib/expressir/express/builders/type_builder.rb +3 -45
  65. data/lib/expressir/express/builders/type_decl_builder.rb +1 -7
  66. data/lib/expressir/express/builders/unique_clause_builder.rb +1 -3
  67. data/lib/expressir/express/builders/unique_rule_builder.rb +0 -2
  68. data/lib/expressir/express/builders/where_clause_builder.rb +1 -3
  69. data/lib/expressir/express/builders.rb +47 -35
  70. data/lib/expressir/express/error.rb +0 -3
  71. data/lib/expressir/express/formatter.rb +17 -19
  72. data/lib/expressir/express/formatters/data_types_formatter.rb +295 -293
  73. data/lib/expressir/express/formatters/declarations_formatter.rb +617 -615
  74. data/lib/expressir/express/formatters/expressions_formatter.rb +146 -144
  75. data/lib/expressir/express/formatters/literals_formatter.rb +35 -33
  76. data/lib/expressir/express/formatters/references_formatter.rb +34 -32
  77. data/lib/expressir/express/formatters/remark_formatter.rb +176 -209
  78. data/lib/expressir/express/formatters/remark_item_formatter.rb +18 -16
  79. data/lib/expressir/express/formatters/statements_formatter.rb +190 -188
  80. data/lib/expressir/express/formatters/supertype_expressions_formatter.rb +41 -39
  81. data/lib/expressir/express/formatters.rb +22 -0
  82. data/lib/expressir/express/parser.rb +40 -41
  83. data/lib/expressir/express/pretty_formatter.rb +68 -47
  84. data/lib/expressir/express/remark_attacher.rb +210 -147
  85. data/lib/expressir/express/streaming_builder.rb +0 -3
  86. data/lib/expressir/express/transformer/remark_handling.rb +1 -2
  87. data/lib/expressir/express.rb +29 -0
  88. data/lib/expressir/manifest/resolver.rb +0 -3
  89. data/lib/expressir/manifest/validator.rb +0 -3
  90. data/lib/expressir/manifest.rb +6 -0
  91. data/lib/expressir/model/cache.rb +1 -1
  92. data/lib/expressir/model/concerns.rb +19 -0
  93. data/lib/expressir/model/data_types/aggregate.rb +1 -1
  94. data/lib/expressir/model/data_types/array.rb +1 -1
  95. data/lib/expressir/model/data_types/bag.rb +1 -1
  96. data/lib/expressir/model/data_types/binary.rb +1 -1
  97. data/lib/expressir/model/data_types/boolean.rb +1 -1
  98. data/lib/expressir/model/data_types/enumeration.rb +1 -1
  99. data/lib/expressir/model/data_types/enumeration_item.rb +1 -1
  100. data/lib/expressir/model/data_types/generic.rb +1 -1
  101. data/lib/expressir/model/data_types/generic_entity.rb +1 -1
  102. data/lib/expressir/model/data_types/integer.rb +1 -1
  103. data/lib/expressir/model/data_types/list.rb +1 -1
  104. data/lib/expressir/model/data_types/logical.rb +1 -1
  105. data/lib/expressir/model/data_types/number.rb +1 -1
  106. data/lib/expressir/model/data_types/real.rb +1 -1
  107. data/lib/expressir/model/data_types/select.rb +1 -1
  108. data/lib/expressir/model/data_types/set.rb +1 -1
  109. data/lib/expressir/model/data_types/string.rb +1 -1
  110. data/lib/expressir/model/data_types.rb +25 -0
  111. data/lib/expressir/model/declarations/attribute.rb +1 -1
  112. data/lib/expressir/model/declarations/constant.rb +1 -1
  113. data/lib/expressir/model/declarations/derived_attribute.rb +1 -1
  114. data/lib/expressir/model/declarations/entity.rb +4 -1
  115. data/lib/expressir/model/declarations/function.rb +3 -1
  116. data/lib/expressir/model/declarations/informal_proposition_rule.rb +2 -1
  117. data/lib/expressir/model/declarations/interface.rb +1 -1
  118. data/lib/expressir/model/declarations/interface_item.rb +1 -1
  119. data/lib/expressir/model/declarations/interfaced_item.rb +1 -1
  120. data/lib/expressir/model/declarations/inverse_attribute.rb +1 -1
  121. data/lib/expressir/model/declarations/parameter.rb +1 -1
  122. data/lib/expressir/model/declarations/procedure.rb +3 -1
  123. data/lib/expressir/model/declarations/remark_item.rb +1 -1
  124. data/lib/expressir/model/declarations/rule.rb +4 -1
  125. data/lib/expressir/model/declarations/schema.rb +2 -1
  126. data/lib/expressir/model/declarations/schema_version.rb +1 -1
  127. data/lib/expressir/model/declarations/schema_version_item.rb +1 -1
  128. data/lib/expressir/model/declarations/subtype_constraint.rb +1 -1
  129. data/lib/expressir/model/declarations/type.rb +4 -1
  130. data/lib/expressir/model/declarations/unique_rule.rb +1 -1
  131. data/lib/expressir/model/declarations/variable.rb +1 -1
  132. data/lib/expressir/model/declarations/where_rule.rb +1 -1
  133. data/lib/expressir/model/declarations.rb +31 -0
  134. data/lib/expressir/model/dependency_resolver.rb +0 -2
  135. data/lib/expressir/model/exp_file.rb +38 -0
  136. data/lib/expressir/model/expressions/aggregate_initializer.rb +1 -1
  137. data/lib/expressir/model/expressions/aggregate_initializer_item.rb +1 -1
  138. data/lib/expressir/model/expressions/binary_expression.rb +1 -1
  139. data/lib/expressir/model/expressions/entity_constructor.rb +1 -1
  140. data/lib/expressir/model/expressions/function_call.rb +1 -1
  141. data/lib/expressir/model/expressions/interval.rb +1 -1
  142. data/lib/expressir/model/expressions/query_expression.rb +1 -1
  143. data/lib/expressir/model/expressions/unary_expression.rb +1 -1
  144. data/lib/expressir/model/expressions.rb +18 -0
  145. data/lib/expressir/model/identifier.rb +5 -1
  146. data/lib/expressir/model/indexes.rb +11 -0
  147. data/lib/expressir/model/literals/binary.rb +1 -1
  148. data/lib/expressir/model/literals/integer.rb +1 -1
  149. data/lib/expressir/model/literals/logical.rb +1 -1
  150. data/lib/expressir/model/literals/real.rb +1 -1
  151. data/lib/expressir/model/literals/string.rb +1 -1
  152. data/lib/expressir/model/literals.rb +13 -0
  153. data/lib/expressir/model/model_element.rb +7 -15
  154. data/lib/expressir/model/references/attribute_reference.rb +1 -1
  155. data/lib/expressir/model/references/group_reference.rb +1 -1
  156. data/lib/expressir/model/references/index_reference.rb +1 -1
  157. data/lib/expressir/model/references/simple_reference.rb +1 -1
  158. data/lib/expressir/model/references.rb +12 -0
  159. data/lib/expressir/model/remark_info.rb +1 -7
  160. data/lib/expressir/model/repository.rb +72 -36
  161. data/lib/expressir/model/repository_validator.rb +0 -2
  162. data/lib/expressir/model/search_engine.rb +6 -30
  163. data/lib/expressir/model/statements/alias.rb +1 -1
  164. data/lib/expressir/model/statements/assignment.rb +1 -1
  165. data/lib/expressir/model/statements/case.rb +1 -1
  166. data/lib/expressir/model/statements/case_action.rb +1 -1
  167. data/lib/expressir/model/statements/compound.rb +1 -1
  168. data/lib/expressir/model/statements/escape.rb +1 -1
  169. data/lib/expressir/model/statements/if.rb +1 -1
  170. data/lib/expressir/model/statements/null.rb +1 -1
  171. data/lib/expressir/model/statements/procedure_call.rb +1 -1
  172. data/lib/expressir/model/statements/repeat.rb +1 -1
  173. data/lib/expressir/model/statements/return.rb +1 -1
  174. data/lib/expressir/model/statements/skip.rb +1 -1
  175. data/lib/expressir/model/statements.rb +20 -0
  176. data/lib/expressir/model/supertype_expressions/binary_supertype_expression.rb +1 -1
  177. data/lib/expressir/model/supertype_expressions/oneof_supertype_expression.rb +1 -1
  178. data/lib/expressir/model/supertype_expressions.rb +12 -0
  179. data/lib/expressir/model.rb +28 -4
  180. data/lib/expressir/package/builder.rb +33 -4
  181. data/lib/expressir/package/metadata.rb +0 -1
  182. data/lib/expressir/package/reader.rb +0 -1
  183. data/lib/expressir/package.rb +8 -0
  184. data/lib/expressir/schema_manifest.rb +5 -6
  185. data/lib/expressir/schema_manifest_entry.rb +3 -4
  186. data/lib/expressir/transformer.rb +7 -0
  187. data/lib/expressir/version.rb +1 -1
  188. data/lib/expressir.rb +23 -171
  189. metadata +49 -9
  190. data/lib/expressir/express/builders/token_builder.rb +0 -15
@@ -1,13 +1,11 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative "helpers"
4
-
5
3
  module Expressir
6
4
  module Express
7
5
  module Builders
8
6
  # Builds expression nodes (binary, unary, query, interval, etc.).
9
7
  class ExpressionBuilder
10
- include Helpers
8
+ include ::Expressir::Express::Builders::Helpers
11
9
 
12
10
  # Expression
13
11
  def build_expression(ast_data)
@@ -43,14 +41,24 @@ module Expressir
43
41
  return nil unless ast_data[:term]
44
42
 
45
43
  term = Builder.build_term(ast_data[:term])
46
- rhs = ast_data[:rhs] || []
44
+ rhs = ast_data[:rhs]
45
+
46
+ return term if rhs.nil? || (rhs.respond_to?(:empty?) && rhs.empty?)
47
47
 
48
- return term if rhs.empty?
48
+ # Handle both formats:
49
+ # - Ruby parser: rhs is Array of {:item => {...}} hashes
50
+ # - Native parser: rhs might be a Hash (merged) or Array
51
+ rhs_array = rhs.is_a?(Array) ? rhs : [rhs]
49
52
 
50
53
  operands = [term]
51
54
  operators = []
52
55
 
53
- rhs.each do |r|
56
+ rhs_array.each do |r|
57
+ # Handle Hash.each yielding [key, value] arrays
58
+ r = r.last if r.is_a?(Array) && r.length == 2
59
+
60
+ next unless r.is_a?(Hash)
61
+
54
62
  item = r[:item] || r
55
63
  op_data = item[:operator]
56
64
  operators << extract_operator(op_data[:add_like_op]) if op_data
@@ -67,14 +75,24 @@ module Expressir
67
75
  return nil unless ast_data[:factor]
68
76
 
69
77
  factor = Builder.build_factor(ast_data[:factor])
70
- rhs = ast_data[:rhs] || []
78
+ rhs = ast_data[:rhs]
79
+
80
+ return factor if rhs.nil? || (rhs.respond_to?(:empty?) && rhs.empty?)
71
81
 
72
- return factor if rhs.empty?
82
+ # Handle both formats:
83
+ # - Ruby parser: rhs is Array of {:item => {...}} hashes
84
+ # - Native parser: rhs might be a Hash (merged) or Array
85
+ rhs_array = rhs.is_a?(Array) ? rhs : [rhs]
73
86
 
74
87
  operands = [factor]
75
88
  operators = []
76
89
 
77
- rhs.each do |r|
90
+ rhs_array.each do |r|
91
+ # Handle Hash.each yielding [key, value] arrays
92
+ r = r.last if r.is_a?(Array) && r.length == 2
93
+
94
+ next unless r.is_a?(Hash)
95
+
78
96
  item = r[:item] || r
79
97
  op_data = item[:multiplication_like_op] || item[:mul_like_op]
80
98
  operators << extract_operator(op_data) if op_data
@@ -192,7 +210,7 @@ module Expressir
192
210
 
193
211
  return ref unless qualifiers
194
212
 
195
- [qualifiers].flatten.compact.each do |qual|
213
+ Builder.ensure_array(qualifiers).each do |qual|
196
214
  qual_result = Builder.build_node(:qualifier, qual)
197
215
  ref = apply_qualifier(ref, qual_result)
198
216
  end
@@ -203,7 +221,7 @@ module Expressir
203
221
  ref = Builder.build_node(:entity_ref, ast_data[:entity_ref])
204
222
  return ref unless qualifiers
205
223
 
206
- [qualifiers].flatten.compact.each do |qual|
224
+ Builder.ensure_array(qualifiers).each do |qual|
207
225
  qual_result = Builder.build_node(:qualifier, qual)
208
226
  ref = apply_qualifier(ref, qual_result)
209
227
  end
@@ -267,7 +285,7 @@ module Expressir
267
285
  else
268
286
  Expressir::Model::Expressions::FunctionCall.new(
269
287
  function: func_ref,
270
- parameters: [params].flatten.compact,
288
+ parameters: params,
271
289
  )
272
290
  end
273
291
  end
@@ -307,7 +325,7 @@ module Expressir
307
325
 
308
326
  Expressir::Model::Expressions::FunctionCall.new(
309
327
  function: entity_ref,
310
- parameters: [params].flatten.compact,
328
+ parameters: params,
311
329
  )
312
330
  end
313
331
 
@@ -397,57 +415,3 @@ module Expressir
397
415
  end
398
416
  end
399
417
  end
400
-
401
- builder = Expressir::Express::Builders::ExpressionBuilder.new
402
-
403
- Builder.register(:expression) { |d| builder.build_expression(d) }
404
- Builder.register(:logical_expression) do |d|
405
- builder.build_logical_expression(d)
406
- end
407
- Builder.register(:numeric_expression) do |d|
408
- builder.build_numeric_expression(d)
409
- end
410
- Builder.register(:simple_expression) { |d| builder.build_simple_expression(d) }
411
- Builder.register(:term) { |d| builder.build_term(d) }
412
- Builder.register(:factor) { |d| builder.build_factor(d) }
413
- Builder.register(:simple_factor) { |d| builder.build_simple_factor(d) }
414
- Builder.register(:simple_factor_expression) do |d|
415
- builder.build_simple_factor_expression(d)
416
- end
417
- Builder.register(:simple_factor_unary_expression) do |d|
418
- builder.build_simple_factor_unary_expression(d)
419
- end
420
- Builder.register(:constant_factor) { |d| builder.build_constant_factor(d) }
421
- Builder.register(:primary) { |d| builder.build_primary(d) }
422
- Builder.register(:qualifiable_factor) do |d|
423
- builder.build_qualifiable_factor(d, nil)
424
- end
425
- Builder.register(:population) { |d| builder.build_population(d, nil) }
426
- Builder.register(:qualifier) { |d| builder.build_qualifier(d) }
427
- Builder.register(:rel_op_extended) { |d| builder.build_rel_op_extended(d) }
428
- Builder.register(:function_call) { |d| builder.build_function_call(d) }
429
- Builder.register(:actual_parameter_list) do |d|
430
- builder.build_actual_parameter_list(d)
431
- end
432
- Builder.register(:parameter) { |d| builder.build_parameter(d) }
433
- Builder.register(:entity_constructor) do |d|
434
- builder.build_entity_constructor(d)
435
- end
436
- Builder.register(:query_expression) { |d| builder.build_query_expression(d) }
437
- Builder.register(:aggregate_source) { |d| builder.build_aggregate_source(d) }
438
- Builder.register(:aggregate_initializer) do |d|
439
- builder.build_aggregate_initializer(d)
440
- end
441
- Builder.register(:element) { |d| builder.build_element(d) }
442
- Builder.register(:repetition) { |d| builder.build_repetition(d) }
443
- Builder.register(:interval) { |d| builder.build_interval(d) }
444
- Builder.register(:interval_low) { |d| builder.build_interval_low(d) }
445
- Builder.register(:interval_high) { |d| builder.build_interval_high(d) }
446
- Builder.register(:interval_item) { |d| builder.build_interval_item(d) }
447
- Builder.register(:interval_op) { |d| builder.send(:extract_interval_op, d) }
448
-
449
- # Operators
450
- Builder.register(:add_like_op) { |d| builder.send(:extract_operator, d) }
451
- Builder.register(:mul_like_op) { |d| builder.send(:extract_operator, d) }
452
- Builder.register(:unary_op) { |d| builder.send(:extract_unary_op, d) }
453
- Builder.register(:rel_op) { |d| builder.send(:extract_rel_op, d) }
@@ -1,14 +1,10 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative "helpers"
4
-
5
3
  module Expressir
6
4
  module Express
7
5
  module Builders
8
6
  # Builds function declaration nodes.
9
7
  class FunctionDeclBuilder
10
- include Helpers
11
-
12
8
  def call(ast_data)
13
9
  head = ast_data[:function_head]
14
10
  algorithm_head = ast_data[:algorithm_head]
@@ -23,13 +19,21 @@ module Expressir
23
19
  declarations = Builder.build_children(algorithm_head[:declaration])
24
20
  end
25
21
 
26
- types = declarations.select { |x| x.is_a?(Expressir::Model::Declarations::Type) }
27
- entities = declarations.select { |x| x.is_a?(Expressir::Model::Declarations::Entity) }
28
- subtype_constraints = declarations.select { |x| x.is_a?(Expressir::Model::Declarations::SubtypeConstraint) }
29
- functions = declarations.select { |x| x.is_a?(Expressir::Model::Declarations::Function) }
30
- procedures = declarations.select { |x| x.is_a?(Expressir::Model::Declarations::Procedure) }
31
- constants = build_constant_decl(algorithm_head[:constant_decl]) if algorithm_head.is_a?(Hash) && algorithm_head[:constant_decl]
32
- variables = build_local_decl(algorithm_head[:local_decl]) if algorithm_head.is_a?(Hash) && algorithm_head[:local_decl]
22
+ types = declarations.grep(Expressir::Model::Declarations::Type)
23
+ entities = declarations.grep(Expressir::Model::Declarations::Entity)
24
+ subtype_constraints = declarations.grep(Expressir::Model::Declarations::SubtypeConstraint)
25
+ functions = declarations.grep(Expressir::Model::Declarations::Function)
26
+ procedures = declarations.grep(Expressir::Model::Declarations::Procedure)
27
+ constants = if algorithm_head.is_a?(Hash) && algorithm_head[:constant_decl]
28
+ build_constant_decl(algorithm_head[:constant_decl])
29
+ else
30
+ []
31
+ end
32
+ variables = if algorithm_head.is_a?(Hash) && algorithm_head[:local_decl]
33
+ build_local_decl(algorithm_head[:local_decl])
34
+ else
35
+ []
36
+ end
33
37
  statements = Builder.build_children(stmts)
34
38
 
35
39
  Expressir::Model::Declarations::Function.new(
@@ -41,8 +45,8 @@ module Expressir
41
45
  subtype_constraints: subtype_constraints,
42
46
  functions: functions,
43
47
  procedures: procedures,
44
- constants: [constants].flatten.compact,
45
- variables: [variables].flatten.compact,
48
+ constants: constants,
49
+ variables: variables,
46
50
  statements: statements.compact,
47
51
  )
48
52
  end
@@ -62,9 +66,9 @@ module Expressir
62
66
  end
63
67
 
64
68
  parameters = []
65
- params_data.flatten.compact.each do |param|
69
+ Builder.ensure_array(params_data).each do |param|
66
70
  result = Builder.build({ formal_parameter: param })
67
- parameters.concat([result].flatten.compact) if result
71
+ parameters.concat(Builder.ensure_array(result)) if result
68
72
  end
69
73
  parameters
70
74
  end
@@ -74,11 +78,9 @@ module Expressir
74
78
  end
75
79
 
76
80
  def build_local_decl(data)
77
- Builder.build_children(data[:local_variable]).flatten.compact
81
+ Builder.build_children(data[:local_variable])
78
82
  end
79
83
  end
80
84
  end
81
85
  end
82
86
  end
83
-
84
- Builder.register(:function_decl, Expressir::Express::Builders::FunctionDeclBuilder.new)
@@ -1,14 +1,10 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative "helpers"
4
-
5
3
  module Expressir
6
4
  module Express
7
5
  module Builders
8
6
  # Builds interface specification nodes (use/reference clauses).
9
7
  class InterfaceBuilder
10
- include Helpers
11
-
12
8
  def build_interface_specification(ast_data)
13
9
  ast_data = ast_data[:interface_specification] if ast_data[:interface_specification]
14
10
  if ast_data[:reference_clause]
@@ -153,19 +149,3 @@ module Expressir
153
149
  end
154
150
  end
155
151
  end
156
-
157
- builder = Expressir::Express::Builders::InterfaceBuilder.new
158
-
159
- Builder.register(:interface_specification) do |d|
160
- builder.build_interface_specification(d)
161
- end
162
- Builder.register(:use_clause) { |d| builder.build_use_clause(d) }
163
- Builder.register(:reference_clause) { |d| builder.build_reference_clause(d) }
164
- Builder.register(:named_type_or_rename) do |d|
165
- builder.build_named_type_or_rename(d)
166
- end
167
- Builder.register(:resource_or_rename) do |d|
168
- builder.build_resource_or_rename(d)
169
- end
170
- Builder.register(:resource_ref) { |d| builder.build_resource_ref(d) }
171
- Builder.register(:rename_id) { |d| builder.build_rename_id(d) }
@@ -41,5 +41,3 @@ module Expressir
41
41
  end
42
42
  end
43
43
  end
44
-
45
- Builder.register(:inverse_attr, Expressir::Express::Builders::InverseAttrBuilder.new)
@@ -1,14 +1,10 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative "helpers"
4
-
5
3
  module Expressir
6
4
  module Express
7
5
  module Builders
8
6
  # Builds inverse_attr_type nodes.
9
7
  class InverseAttrTypeBuilder
10
- include Helpers
11
-
12
8
  def call(ast_data)
13
9
  bound_spec = ast_data[:bound_spec] || {}
14
10
  bound1 = Builder.build_optional(bound_spec[:bound1])
@@ -32,5 +28,3 @@ module Expressir
32
28
  end
33
29
  end
34
30
  end
35
-
36
- Builder.register(:inverse_attr_type, Expressir::Express::Builders::InverseAttrTypeBuilder.new)
@@ -12,5 +12,3 @@ module Expressir
12
12
  end
13
13
  end
14
14
  end
15
-
16
- Builder.register(:inverse_clause, Expressir::Express::Builders::InverseClauseBuilder.new)
@@ -1,13 +1,11 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative "helpers"
4
-
5
3
  module Expressir
6
4
  module Express
7
5
  module Builders
8
6
  # Builds literal nodes (integer, real, binary, logical, string).
9
7
  class LiteralBuilder
10
- include Helpers
8
+ include ::Expressir::Express::Builders::Helpers
11
9
 
12
10
  # Integer literal
13
11
  def build_integer(ast_data)
@@ -93,15 +91,3 @@ module Expressir
93
91
  end
94
92
  end
95
93
  end
96
-
97
- builder = Expressir::Express::Builders::LiteralBuilder.new
98
- Builder.register(:integer_literal) { |d| builder.build_integer(d) }
99
- Builder.register(:real_literal) { |d| builder.build_real(d) }
100
- Builder.register(:binary_literal) { |d| builder.build_binary(d) }
101
- Builder.register(:logical_literal) { |d| builder.build_logical(d) }
102
- Builder.register(:string_literal) { |d| builder.build_string(d) }
103
- Builder.register(:simple_string_literal) { |d| builder.build_simple_string(d) }
104
- Builder.register(:encoded_string_literal) do |d|
105
- builder.build_encoded_string(d)
106
- end
107
- Builder.register(:literal, builder)
@@ -1,14 +1,10 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative "helpers"
4
-
5
3
  module Expressir
6
4
  module Express
7
5
  module Builders
8
6
  # Builds procedure declaration nodes.
9
7
  class ProcedureDeclBuilder
10
- include Helpers
11
-
12
8
  def call(ast_data)
13
9
  head = ast_data[:procedure_head]
14
10
  algorithm_head = ast_data[:algorithm_head]
@@ -22,13 +18,21 @@ module Expressir
22
18
  declarations = Builder.build_children(algorithm_head[:declaration])
23
19
  end
24
20
 
25
- types = declarations.select { |x| x.is_a?(Expressir::Model::Declarations::Type) }
26
- entities = declarations.select { |x| x.is_a?(Expressir::Model::Declarations::Entity) }
27
- subtype_constraints = declarations.select { |x| x.is_a?(Expressir::Model::Declarations::SubtypeConstraint) }
28
- functions = declarations.select { |x| x.is_a?(Expressir::Model::Declarations::Function) }
29
- procedures = declarations.select { |x| x.is_a?(Expressir::Model::Declarations::Procedure) }
30
- constants = build_constant_decl(algorithm_head[:constant_decl]) if algorithm_head.is_a?(Hash) && algorithm_head[:constant_decl]
31
- variables = build_local_decl(algorithm_head[:local_decl]) if algorithm_head.is_a?(Hash) && algorithm_head[:local_decl]
21
+ types = declarations.grep(Expressir::Model::Declarations::Type)
22
+ entities = declarations.grep(Expressir::Model::Declarations::Entity)
23
+ subtype_constraints = declarations.grep(Expressir::Model::Declarations::SubtypeConstraint)
24
+ functions = declarations.grep(Expressir::Model::Declarations::Function)
25
+ procedures = declarations.grep(Expressir::Model::Declarations::Procedure)
26
+ constants = if algorithm_head.is_a?(Hash) && algorithm_head[:constant_decl]
27
+ build_constant_decl(algorithm_head[:constant_decl])
28
+ else
29
+ []
30
+ end
31
+ variables = if algorithm_head.is_a?(Hash) && algorithm_head[:local_decl]
32
+ build_local_decl(algorithm_head[:local_decl])
33
+ else
34
+ []
35
+ end
32
36
  statements = Builder.build_children(stmts)
33
37
 
34
38
  Expressir::Model::Declarations::Procedure.new(
@@ -39,8 +43,8 @@ module Expressir
39
43
  subtype_constraints: subtype_constraints,
40
44
  functions: functions,
41
45
  procedures: procedures,
42
- constants: [constants].flatten.compact,
43
- variables: [variables].flatten.compact,
46
+ constants: constants,
47
+ variables: variables,
44
48
  statements: statements.compact,
45
49
  )
46
50
  end
@@ -57,10 +61,9 @@ module Expressir
57
61
  end
58
62
 
59
63
  parameters = []
60
- params_data = [params_data].flatten.compact
61
- params_data.each do |param|
64
+ Builder.ensure_array(params_data).each do |param|
62
65
  result = Builder.build({ procedure_head_parameter: param })
63
- parameters.concat([result].flatten.compact) if result
66
+ parameters.concat(Builder.ensure_array(result)) if result
64
67
  end
65
68
  parameters
66
69
  end
@@ -70,11 +73,9 @@ module Expressir
70
73
  end
71
74
 
72
75
  def build_local_decl(data)
73
- Builder.build_children(data[:local_variable]).flatten.compact
76
+ Builder.build_children(data[:local_variable])
74
77
  end
75
78
  end
76
79
  end
77
80
  end
78
81
  end
79
-
80
- Builder.register(:procedure_decl, Expressir::Express::Builders::ProcedureDeclBuilder.new)
@@ -1,14 +1,10 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative "helpers"
4
-
5
3
  module Expressir
6
4
  module Express
7
5
  module Builders
8
6
  # Builds qualifier nodes (attribute, group, index qualifiers).
9
7
  class QualifierBuilder
10
- include Helpers
11
-
12
8
  def build_redeclared_attribute(ast_data)
13
9
  qualified_attr = ast_data[:qualified_attribute]
14
10
  if qualified_attr.is_a?(Hash)
@@ -103,26 +99,3 @@ module Expressir
103
99
  end
104
100
  end
105
101
  end
106
-
107
- builder = Expressir::Express::Builders::QualifierBuilder.new
108
-
109
- Builder.register(:redeclared_attribute) do |d|
110
- builder.build_redeclared_attribute(d)
111
- end
112
- Builder.register(:referenced_attribute) do |d|
113
- builder.build_referenced_attribute(d)
114
- end
115
- Builder.register(:qualified_attribute) do |d|
116
- builder.build_qualified_attribute(d)
117
- end
118
- Builder.register(:group_qualifier) { |d| builder.build_group_qualifier(d) }
119
- Builder.register(:attribute_qualifier) do |d|
120
- builder.build_attribute_qualifier(d)
121
- end
122
- Builder.register(:index_qualifier) { |d| builder.build_index_qualifier(d) }
123
- Builder.register(:index1) { |d| builder.build_index1(d) }
124
- Builder.register(:index2) { |d| builder.build_index2(d) }
125
- Builder.register(:index) { |d| builder.build_index(d) }
126
- Builder.register(:enumeration_reference) do |d|
127
- builder.build_enumeration_reference(d)
128
- end
@@ -1,14 +1,12 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative "helpers"
4
-
5
3
  module Expressir
6
4
  module Express
7
5
  module Builders
8
6
  # Builds reference nodes (attribute_ref, entity_ref, etc.).
9
7
  # Returns SimpleReference for all reference types.
10
8
  class ReferenceBuilder
11
- include Helpers
9
+ include ::Expressir::Express::Builders::Helpers
12
10
 
13
11
  def call(ast_data)
14
12
  id = extract_id_ref(ast_data)
@@ -18,10 +16,3 @@ module Expressir
18
16
  end
19
17
  end
20
18
  end
21
-
22
- # Register for all reference types
23
- %i[attribute_ref constant_ref entity_ref enumeration_ref function_ref
24
- parameter_ref procedure_ref rule_ref rule_label_ref schema_ref
25
- subtype_constraint_ref type_label_ref type_ref variable_ref].each do |ref_type|
26
- Builder.register(ref_type, Expressir::Express::Builders::ReferenceBuilder.new)
27
- end
@@ -1,14 +1,10 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative "helpers"
4
-
5
3
  module Expressir
6
4
  module Express
7
5
  module Builders
8
6
  # Builds rule declaration nodes.
9
7
  class RuleDeclBuilder
10
- include Helpers
11
-
12
8
  def call(ast_data)
13
9
  head = ast_data[:rule_head]
14
10
  algorithm_head = ast_data[:algorithm_head]
@@ -23,28 +19,36 @@ module Expressir
23
19
  declarations = Builder.build_children(algorithm_head[:declaration])
24
20
  end
25
21
 
26
- types = declarations.select { |x| x.is_a?(Expressir::Model::Declarations::Type) }
27
- entities = declarations.select { |x| x.is_a?(Expressir::Model::Declarations::Entity) }
28
- subtype_constraints = declarations.select { |x| x.is_a?(Expressir::Model::Declarations::SubtypeConstraint) }
29
- functions = declarations.select { |x| x.is_a?(Expressir::Model::Declarations::Function) }
30
- procedures = declarations.select { |x| x.is_a?(Expressir::Model::Declarations::Procedure) }
31
- constants = build_constant_decl(algorithm_head[:constant_decl]) if algorithm_head.is_a?(Hash) && algorithm_head[:constant_decl]
32
- variables = build_local_decl(algorithm_head[:local_decl]) if algorithm_head.is_a?(Hash) && algorithm_head[:local_decl]
22
+ types = declarations.grep(Expressir::Model::Declarations::Type)
23
+ entities = declarations.grep(Expressir::Model::Declarations::Entity)
24
+ subtype_constraints = declarations.grep(Expressir::Model::Declarations::SubtypeConstraint)
25
+ functions = declarations.grep(Expressir::Model::Declarations::Function)
26
+ procedures = declarations.grep(Expressir::Model::Declarations::Procedure)
27
+ constants = if algorithm_head.is_a?(Hash) && algorithm_head[:constant_decl]
28
+ build_constant_decl(algorithm_head[:constant_decl])
29
+ else
30
+ []
31
+ end
32
+ variables = if algorithm_head.is_a?(Hash) && algorithm_head[:local_decl]
33
+ build_local_decl(algorithm_head[:local_decl])
34
+ else
35
+ []
36
+ end
33
37
  statements = Builder.build_children(stmts)
34
38
  where_rules = where_clause ? Builder.build({ where_clause: where_clause }) : []
35
39
 
36
40
  Expressir::Model::Declarations::Rule.new(
37
41
  id: id,
38
- applies_to: [applies_to].flatten.compact,
42
+ applies_to: Builder.ensure_array(applies_to),
39
43
  types: types,
40
44
  entities: entities,
41
45
  subtype_constraints: subtype_constraints,
42
46
  functions: functions,
43
47
  procedures: procedures,
44
- constants: [constants].flatten.compact,
45
- variables: [variables].flatten.compact,
48
+ constants: constants,
49
+ variables: variables,
46
50
  statements: statements.compact,
47
- where_rules: [where_rules].flatten.compact,
51
+ where_rules: [where_rules].flatten,
48
52
  )
49
53
  end
50
54
 
@@ -70,7 +74,7 @@ module Expressir
70
74
  refs << Builder.build({ entity_ref: entity_refs[:entity_ref] })
71
75
  end
72
76
  if entity_refs[:item]
73
- [entity_refs[:item]].flatten.each do |item|
77
+ Builder.ensure_array(entity_refs[:item]).each do |item|
74
78
  if item[:entity_ref]
75
79
  refs << Builder.build({ entity_ref: item[:entity_ref] })
76
80
  end
@@ -85,11 +89,9 @@ module Expressir
85
89
  end
86
90
 
87
91
  def build_local_decl(data)
88
- Builder.build_children(data[:local_variable]).flatten.compact
92
+ Builder.build_children(data[:local_variable])
89
93
  end
90
94
  end
91
95
  end
92
96
  end
93
97
  end
94
-
95
- Builder.register(:rule_decl, Expressir::Express::Builders::RuleDeclBuilder.new)
@@ -1,7 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative "helpers"
4
-
5
3
  module Expressir
6
4
  module Express
7
5
  module Builders
@@ -18,5 +16,3 @@ module Expressir
18
16
  end
19
17
  end
20
18
  end
21
-
22
- Builder.register(:schema_body_declaration, Expressir::Express::Builders::SchemaBodyDeclBuilder.new)
@@ -1,14 +1,10 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative "helpers"
4
-
5
3
  module Expressir
6
4
  module Express
7
5
  module Builders
8
6
  # Builds schema_decl nodes into Schema objects.
9
7
  class SchemaDeclBuilder
10
- include Helpers
11
-
12
8
  def call(ast_data)
13
9
  id = Builder.build_optional(ast_data[:schema_id])
14
10
  version = if ast_data[:schema_version_id]
@@ -26,18 +22,18 @@ module Expressir
26
22
  declarations = Builder.build_children(body_decls) if body_decls
27
23
  end
28
24
 
29
- types = declarations.select { |x| x.is_a?(Expressir::Model::Declarations::Type) }
30
- entities = declarations.select { |x| x.is_a?(Expressir::Model::Declarations::Entity) }
31
- subtype_constraints = declarations.select { |x| x.is_a?(Expressir::Model::Declarations::SubtypeConstraint) }
32
- functions = declarations.select { |x| x.is_a?(Expressir::Model::Declarations::Function) }
33
- rules = declarations.select { |x| x.is_a?(Expressir::Model::Declarations::Rule) }
34
- procedures = declarations.select { |x| x.is_a?(Expressir::Model::Declarations::Procedure) }
25
+ types = declarations.grep(Expressir::Model::Declarations::Type)
26
+ entities = declarations.grep(Expressir::Model::Declarations::Entity)
27
+ subtype_constraints = declarations.grep(Expressir::Model::Declarations::SubtypeConstraint)
28
+ functions = declarations.grep(Expressir::Model::Declarations::Function)
29
+ rules = declarations.grep(Expressir::Model::Declarations::Rule)
30
+ procedures = declarations.grep(Expressir::Model::Declarations::Procedure)
35
31
 
36
32
  Expressir::Model::Declarations::Schema.new(
37
33
  id: id,
38
34
  version: version,
39
35
  interfaces: interfaces.compact,
40
- constants: [constants].flatten.compact,
36
+ constants: [constants].flatten,
41
37
  types: types,
42
38
  entities: entities,
43
39
  subtype_constraints: subtype_constraints,
@@ -58,5 +54,3 @@ module Expressir
58
54
  end
59
55
  end
60
56
  end
61
-
62
- Builder.register(:schema_decl, Expressir::Express::Builders::SchemaDeclBuilder.new)
@@ -1,14 +1,10 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative "helpers"
4
-
5
3
  module Expressir
6
4
  module Express
7
5
  module Builders
8
6
  # Builds schema_version_id nodes into SchemaVersion objects.
9
7
  class SchemaVersionBuilder
10
- include Helpers
11
-
12
8
  def call(ast_data)
13
9
  string_val = Builder.build_optional(ast_data[:string_literal])
14
10
  value = string_val.is_a?(Expressir::Model::Literals::String) ? string_val.value : string_val.to_s
@@ -36,5 +32,3 @@ module Expressir
36
32
  end
37
33
  end
38
34
  end
39
-
40
- Builder.register(:schema_version_id, Expressir::Express::Builders::SchemaVersionBuilder.new)