expressir 2.2.0 → 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 (192) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +1 -1
  3. data/.rubocop_todo.yml +254 -77
  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 +4 -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/base.rb +2 -9
  18. data/lib/expressir/commands/changes.rb +0 -2
  19. data/lib/expressir/commands/changes_import_eengine.rb +0 -3
  20. data/lib/expressir/commands/changes_validate.rb +0 -2
  21. data/lib/expressir/commands/format.rb +5 -3
  22. data/lib/expressir/commands/manifest.rb +0 -7
  23. data/lib/expressir/commands/package.rb +93 -101
  24. data/lib/expressir/commands/validate.rb +0 -2
  25. data/lib/expressir/commands/validate_ascii.rb +2 -4
  26. data/lib/expressir/commands/validate_load.rb +8 -5
  27. data/lib/expressir/commands.rb +20 -0
  28. data/lib/expressir/config.rb +0 -2
  29. data/lib/expressir/coverage.rb +11 -4
  30. data/lib/expressir/eengine/arm_compare_report.rb +1 -4
  31. data/lib/expressir/eengine/changes_section.rb +1 -3
  32. data/lib/expressir/eengine/compare_report.rb +1 -13
  33. data/lib/expressir/eengine/mim_compare_report.rb +1 -4
  34. data/lib/expressir/eengine/modified_object.rb +1 -2
  35. data/lib/expressir/eengine.rb +9 -0
  36. data/lib/expressir/errors.rb +113 -0
  37. data/lib/expressir/express/builder.rb +22 -7
  38. data/lib/expressir/express/builder_registry.rb +411 -0
  39. data/lib/expressir/express/builders/attribute_decl_builder.rb +0 -6
  40. data/lib/expressir/express/builders/built_in_builder.rb +1 -16
  41. data/lib/expressir/express/builders/constant_builder.rb +4 -19
  42. data/lib/expressir/express/builders/declaration_builder.rb +0 -4
  43. data/lib/expressir/express/builders/derive_clause_builder.rb +0 -2
  44. data/lib/expressir/express/builders/derived_attr_builder.rb +0 -2
  45. data/lib/expressir/express/builders/domain_rule_builder.rb +0 -2
  46. data/lib/expressir/express/builders/entity_decl_builder.rb +7 -13
  47. data/lib/expressir/express/builders/explicit_attr_builder.rb +5 -8
  48. data/lib/expressir/express/builders/expression_builder.rb +31 -67
  49. data/lib/expressir/express/builders/function_decl_builder.rb +20 -18
  50. data/lib/expressir/express/builders/interface_builder.rb +0 -20
  51. data/lib/expressir/express/builders/inverse_attr_builder.rb +0 -2
  52. data/lib/expressir/express/builders/inverse_attr_type_builder.rb +0 -6
  53. data/lib/expressir/express/builders/inverse_clause_builder.rb +0 -2
  54. data/lib/expressir/express/builders/literal_builder.rb +1 -15
  55. data/lib/expressir/express/builders/procedure_decl_builder.rb +20 -19
  56. data/lib/expressir/express/builders/qualifier_builder.rb +0 -27
  57. data/lib/expressir/express/builders/reference_builder.rb +1 -10
  58. data/lib/expressir/express/builders/rule_decl_builder.rb +21 -19
  59. data/lib/expressir/express/builders/schema_body_decl_builder.rb +0 -4
  60. data/lib/expressir/express/builders/schema_decl_builder.rb +7 -13
  61. data/lib/expressir/express/builders/schema_version_builder.rb +0 -6
  62. data/lib/expressir/express/builders/simple_id_builder.rb +1 -10
  63. data/lib/expressir/express/builders/statement_builder.rb +4 -32
  64. data/lib/expressir/express/builders/subtype_constraint_builder.rb +6 -30
  65. data/lib/expressir/express/builders/syntax_builder.rb +60 -7
  66. data/lib/expressir/express/builders/type_builder.rb +3 -45
  67. data/lib/expressir/express/builders/type_decl_builder.rb +1 -7
  68. data/lib/expressir/express/builders/unique_clause_builder.rb +1 -3
  69. data/lib/expressir/express/builders/unique_rule_builder.rb +0 -2
  70. data/lib/expressir/express/builders/where_clause_builder.rb +1 -3
  71. data/lib/expressir/express/builders.rb +47 -35
  72. data/lib/expressir/express/error.rb +0 -3
  73. data/lib/expressir/express/formatter.rb +17 -19
  74. data/lib/expressir/express/formatters/data_types_formatter.rb +295 -293
  75. data/lib/expressir/express/formatters/declarations_formatter.rb +617 -615
  76. data/lib/expressir/express/formatters/expressions_formatter.rb +146 -144
  77. data/lib/expressir/express/formatters/literals_formatter.rb +35 -33
  78. data/lib/expressir/express/formatters/references_formatter.rb +34 -32
  79. data/lib/expressir/express/formatters/remark_formatter.rb +176 -209
  80. data/lib/expressir/express/formatters/remark_item_formatter.rb +18 -16
  81. data/lib/expressir/express/formatters/statements_formatter.rb +190 -188
  82. data/lib/expressir/express/formatters/supertype_expressions_formatter.rb +41 -39
  83. data/lib/expressir/express/formatters.rb +22 -0
  84. data/lib/expressir/express/parser.rb +40 -41
  85. data/lib/expressir/express/pretty_formatter.rb +68 -47
  86. data/lib/expressir/express/remark_attacher.rb +210 -147
  87. data/lib/expressir/express/streaming_builder.rb +0 -3
  88. data/lib/expressir/express/transformer/remark_handling.rb +1 -2
  89. data/lib/expressir/express.rb +29 -0
  90. data/lib/expressir/manifest/resolver.rb +0 -3
  91. data/lib/expressir/manifest/validator.rb +0 -3
  92. data/lib/expressir/manifest.rb +6 -0
  93. data/lib/expressir/model/cache.rb +1 -1
  94. data/lib/expressir/model/concerns.rb +19 -0
  95. data/lib/expressir/model/data_types/aggregate.rb +1 -1
  96. data/lib/expressir/model/data_types/array.rb +1 -1
  97. data/lib/expressir/model/data_types/bag.rb +1 -1
  98. data/lib/expressir/model/data_types/binary.rb +1 -1
  99. data/lib/expressir/model/data_types/boolean.rb +1 -1
  100. data/lib/expressir/model/data_types/enumeration.rb +1 -1
  101. data/lib/expressir/model/data_types/enumeration_item.rb +1 -1
  102. data/lib/expressir/model/data_types/generic.rb +1 -1
  103. data/lib/expressir/model/data_types/generic_entity.rb +1 -1
  104. data/lib/expressir/model/data_types/integer.rb +1 -1
  105. data/lib/expressir/model/data_types/list.rb +1 -1
  106. data/lib/expressir/model/data_types/logical.rb +1 -1
  107. data/lib/expressir/model/data_types/number.rb +1 -1
  108. data/lib/expressir/model/data_types/real.rb +1 -1
  109. data/lib/expressir/model/data_types/select.rb +1 -1
  110. data/lib/expressir/model/data_types/set.rb +1 -1
  111. data/lib/expressir/model/data_types/string.rb +1 -1
  112. data/lib/expressir/model/data_types.rb +25 -0
  113. data/lib/expressir/model/declarations/attribute.rb +1 -1
  114. data/lib/expressir/model/declarations/constant.rb +1 -1
  115. data/lib/expressir/model/declarations/derived_attribute.rb +1 -1
  116. data/lib/expressir/model/declarations/entity.rb +4 -1
  117. data/lib/expressir/model/declarations/function.rb +3 -1
  118. data/lib/expressir/model/declarations/informal_proposition_rule.rb +2 -1
  119. data/lib/expressir/model/declarations/interface.rb +1 -1
  120. data/lib/expressir/model/declarations/interface_item.rb +1 -1
  121. data/lib/expressir/model/declarations/interfaced_item.rb +1 -1
  122. data/lib/expressir/model/declarations/inverse_attribute.rb +1 -1
  123. data/lib/expressir/model/declarations/parameter.rb +1 -1
  124. data/lib/expressir/model/declarations/procedure.rb +3 -1
  125. data/lib/expressir/model/declarations/remark_item.rb +1 -1
  126. data/lib/expressir/model/declarations/rule.rb +4 -1
  127. data/lib/expressir/model/declarations/schema.rb +2 -1
  128. data/lib/expressir/model/declarations/schema_version.rb +1 -1
  129. data/lib/expressir/model/declarations/schema_version_item.rb +1 -1
  130. data/lib/expressir/model/declarations/subtype_constraint.rb +1 -1
  131. data/lib/expressir/model/declarations/type.rb +4 -1
  132. data/lib/expressir/model/declarations/unique_rule.rb +1 -1
  133. data/lib/expressir/model/declarations/variable.rb +1 -1
  134. data/lib/expressir/model/declarations/where_rule.rb +1 -1
  135. data/lib/expressir/model/declarations.rb +31 -0
  136. data/lib/expressir/model/dependency_resolver.rb +0 -2
  137. data/lib/expressir/model/exp_file.rb +38 -0
  138. data/lib/expressir/model/expressions/aggregate_initializer.rb +1 -1
  139. data/lib/expressir/model/expressions/aggregate_initializer_item.rb +1 -1
  140. data/lib/expressir/model/expressions/binary_expression.rb +1 -1
  141. data/lib/expressir/model/expressions/entity_constructor.rb +1 -1
  142. data/lib/expressir/model/expressions/function_call.rb +1 -1
  143. data/lib/expressir/model/expressions/interval.rb +1 -1
  144. data/lib/expressir/model/expressions/query_expression.rb +1 -1
  145. data/lib/expressir/model/expressions/unary_expression.rb +1 -1
  146. data/lib/expressir/model/expressions.rb +18 -0
  147. data/lib/expressir/model/identifier.rb +5 -1
  148. data/lib/expressir/model/indexes.rb +11 -0
  149. data/lib/expressir/model/literals/binary.rb +1 -1
  150. data/lib/expressir/model/literals/integer.rb +1 -1
  151. data/lib/expressir/model/literals/logical.rb +1 -1
  152. data/lib/expressir/model/literals/real.rb +1 -1
  153. data/lib/expressir/model/literals/string.rb +1 -1
  154. data/lib/expressir/model/literals.rb +13 -0
  155. data/lib/expressir/model/model_element.rb +7 -15
  156. data/lib/expressir/model/references/attribute_reference.rb +1 -1
  157. data/lib/expressir/model/references/group_reference.rb +1 -1
  158. data/lib/expressir/model/references/index_reference.rb +1 -1
  159. data/lib/expressir/model/references/simple_reference.rb +1 -1
  160. data/lib/expressir/model/references.rb +12 -0
  161. data/lib/expressir/model/remark_info.rb +1 -7
  162. data/lib/expressir/model/repository.rb +72 -36
  163. data/lib/expressir/model/repository_validator.rb +0 -2
  164. data/lib/expressir/model/search_engine.rb +6 -30
  165. data/lib/expressir/model/statements/alias.rb +1 -1
  166. data/lib/expressir/model/statements/assignment.rb +1 -1
  167. data/lib/expressir/model/statements/case.rb +1 -1
  168. data/lib/expressir/model/statements/case_action.rb +1 -1
  169. data/lib/expressir/model/statements/compound.rb +1 -1
  170. data/lib/expressir/model/statements/escape.rb +1 -1
  171. data/lib/expressir/model/statements/if.rb +1 -1
  172. data/lib/expressir/model/statements/null.rb +1 -1
  173. data/lib/expressir/model/statements/procedure_call.rb +1 -1
  174. data/lib/expressir/model/statements/repeat.rb +1 -1
  175. data/lib/expressir/model/statements/return.rb +1 -1
  176. data/lib/expressir/model/statements/skip.rb +1 -1
  177. data/lib/expressir/model/statements.rb +20 -0
  178. data/lib/expressir/model/supertype_expressions/binary_supertype_expression.rb +1 -1
  179. data/lib/expressir/model/supertype_expressions/oneof_supertype_expression.rb +1 -1
  180. data/lib/expressir/model/supertype_expressions.rb +12 -0
  181. data/lib/expressir/model.rb +28 -4
  182. data/lib/expressir/package/builder.rb +33 -4
  183. data/lib/expressir/package/metadata.rb +0 -1
  184. data/lib/expressir/package/reader.rb +0 -1
  185. data/lib/expressir/package.rb +8 -0
  186. data/lib/expressir/schema_manifest.rb +5 -6
  187. data/lib/expressir/schema_manifest_entry.rb +3 -4
  188. data/lib/expressir/transformer.rb +7 -0
  189. data/lib/expressir/version.rb +1 -1
  190. data/lib/expressir.rb +23 -173
  191. metadata +64 -9
  192. data/lib/expressir/express/builders/token_builder.rb +0 -15
@@ -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
@@ -20,5 +18,3 @@ module Expressir
20
18
  end
21
19
  end
22
20
  end
23
-
24
- Builder.register(:declaration, Expressir::Express::Builders::DeclarationBuilder.new)
@@ -12,5 +12,3 @@ module Expressir
12
12
  end
13
13
  end
14
14
  end
15
-
16
- Builder.register(:derive_clause, Expressir::Express::Builders::DeriveClauseBuilder.new)
@@ -24,5 +24,3 @@ module Expressir
24
24
  end
25
25
  end
26
26
  end
27
-
28
- Builder.register(:derived_attr, Expressir::Express::Builders::DerivedAttrBuilder.new)
@@ -17,5 +17,3 @@ module Expressir
17
17
  end
18
18
  end
19
19
  end
20
-
21
- Builder.register(:domain_rule, Expressir::Express::Builders::DomainRuleBuilder.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 entity_decl nodes into Entity objects.
9
7
  class EntityDeclBuilder
10
- include Helpers
11
-
12
8
  def call(ast_data)
13
9
  entity_head = ast_data[:entity_head]
14
10
  entity_body = ast_data[:entity_body]
@@ -40,7 +36,7 @@ module Expressir
40
36
  if subtype_constraint[:supertype_expression]
41
37
  supertype_expression = Builder.build({ supertype_expression: subtype_constraint[:supertype_expression] })
42
38
  elsif subtype_constraint[:list_of_entity_ref]
43
- entity_refs = Builder.build_children([subtype_constraint[:list_of_entity_ref][:entity_ref]].flatten.compact)
39
+ entity_refs = Builder.build_children(Builder.ensure_array(subtype_constraint[:list_of_entity_ref][:entity_ref]).map { |d| { entity_ref: d } })
44
40
  supertype_expression = entity_refs.first if entity_refs.length == 1
45
41
  end
46
42
  end
@@ -51,7 +47,7 @@ module Expressir
51
47
  if list_ref.is_a?(Hash)
52
48
  entity_ref_data = list_ref[:entity_ref]
53
49
  if entity_ref_data
54
- subtype_of = Builder.build_children([{ entity_ref: entity_ref_data }].flatten.compact)
50
+ subtype_of = Builder.build_children(Builder.ensure_array(entity_ref_data).map { |d| { entity_ref: d } })
55
51
  end
56
52
  end
57
53
  end
@@ -64,17 +60,17 @@ module Expressir
64
60
  if entity_body.is_a?(Hash)
65
61
  if entity_body[:explicit_attr]
66
62
  explicit_attrs = Builder.build_children(entity_body[:explicit_attr])
67
- attributes.concat(explicit_attrs.flatten.compact)
63
+ attributes.concat(explicit_attrs)
68
64
  end
69
65
 
70
66
  if entity_body[:derive_clause]
71
67
  derived = Builder.build({ derive_clause: entity_body[:derive_clause] })
72
- attributes.concat([derived].flatten.compact) if derived
68
+ attributes.concat([derived]) if derived
73
69
  end
74
70
 
75
71
  if entity_body[:inverse_clause]
76
72
  inverse = Builder.build({ inverse_clause: entity_body[:inverse_clause] })
77
- attributes.concat([inverse].flatten.compact) if inverse
73
+ attributes.concat([inverse]) if inverse
78
74
  end
79
75
 
80
76
  if entity_body[:unique_clause]
@@ -93,8 +89,8 @@ module Expressir
93
89
  supertype_expression: supertype_expression,
94
90
  subtype_of: subtype_of,
95
91
  attributes: attributes,
96
- unique_rules: [unique_rules].flatten.compact,
97
- where_rules: [where_rules].flatten.compact,
92
+ unique_rules: [unique_rules].flatten,
93
+ where_rules: [where_rules].flatten,
98
94
  }
99
95
  entity_params[:abstract] = true if abstract
100
96
 
@@ -104,5 +100,3 @@ module Expressir
104
100
  end
105
101
  end
106
102
  end
107
-
108
- Builder.register(:entity_decl, Expressir::Express::Builders::EntityDeclBuilder.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 explicit_attr nodes.
9
7
  class ExplicitAttrBuilder
10
- include Helpers
11
-
12
8
  def call(ast_data)
13
9
  list_data = ast_data[:list_of_attribute_decl]
14
10
  attr_decl_data = if list_data.is_a?(Hash)
@@ -20,7 +16,7 @@ module Expressir
20
16
  else
21
17
  ast_data[:attribute_decl]
22
18
  end
23
- attr_decls = [attr_decl_data].flatten.compact
19
+ attr_decls = Builder.ensure_array(attr_decl_data)
24
20
  optional = !ast_data[:t_optional].nil?
25
21
  type = Builder.build_optional(ast_data[:parameter_type])
26
22
 
@@ -40,7 +36,10 @@ module Expressir
40
36
  attr_params[:optional] = true if optional
41
37
  # Preserve source information from the intermediate object
42
38
  attr_params[:source] = attr.source if attr.source
43
- attr_params[:source_offset] = attr.source_offset if attr.source_offset
39
+ if attr.source_offset
40
+ attr_params[:source_offset] =
41
+ attr.source_offset
42
+ end
44
43
  Expressir::Model::Declarations::Attribute.new(**attr_params)
45
44
  end
46
45
  end
@@ -48,5 +47,3 @@ module Expressir
48
47
  end
49
48
  end
50
49
  end
51
-
52
- Builder.register(:explicit_attr, Expressir::Express::Builders::ExplicitAttrBuilder.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 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