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
@@ -0,0 +1,411 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Centralized Builder Registry
4
+ # ============================
5
+ # This is the SINGLE SOURCE OF TRUTH for all AST node type registrations.
6
+ #
7
+ # Builder classes are defined in types/*.rb files.
8
+ # This file creates instances and registers them with Builder.register.
9
+ #
10
+ # Benefits of this architecture:
11
+ # 1. All registrations in one place - easy to see what's handled
12
+ # 2. Separation of class definition from registration
13
+ # 3. Multiple type configurations possible
14
+
15
+ module Expressir
16
+ module Express
17
+ # Builder registry module - creates instances and registers handlers
18
+ module BuilderRegistry
19
+ # Create type instances (used by closures below)
20
+ built_in = Builders::BuiltInBuilder.new
21
+ constant = Builders::ConstantBuilder.new
22
+ expression = Builders::ExpressionBuilder.new
23
+ interface = Builders::InterfaceBuilder.new
24
+ literal = Builders::LiteralBuilder.new
25
+ qualifier = Builders::QualifierBuilder.new
26
+ statement = Builders::StatementBuilder.new
27
+ subtype_constraint = Builders::SubtypeConstraintBuilder.new
28
+ type_builder = Builders::TypeBuilder.new
29
+
30
+ # ========================================================================
31
+ # Token Operators (return nil - used as separators)
32
+ # Token types - operator tokens that return nil.
33
+ # These are used as separators in lists and don't produce model objects.
34
+ # ========================================================================
35
+ %i[
36
+ op_comma op_colon op_decl op_delim op_leftparen op_rightparen
37
+ op_leftbracket op_rightbracket op_left_curly_brace op_right_curly_brace
38
+ op_period op_pipe op_double_backslash op_double_pipe op_double_asterisk
39
+ op_asterisk op_slash op_plus op_minus op_less_equal op_greater_equal
40
+ op_less_greater op_less_than op_greater_than op_equals
41
+ op_colon_less_greater_colon op_colon_equals_colon
42
+ op_query_begin op_query_end op_question_mark
43
+ ].each do |token|
44
+ Builder.register(token) { |_d| nil }
45
+ end
46
+
47
+ # ========================================================================
48
+ # Simple ID Types (return string via SimpleIdBuilder)
49
+ # ========================================================================
50
+ %i[
51
+ simple_id schema_id entity_id type_id function_id procedure_id
52
+ rule_id rule_label_id constant_id parameter_id variable_id
53
+ enumeration_id subtype_constraint_id type_label_id attribute_id
54
+ ].each do |id_type|
55
+ Builder.register(id_type, Builders::SimpleIdBuilder.new)
56
+ end
57
+
58
+ # ========================================================================
59
+ # Reference Types (return SimpleReference via ReferenceBuilder)
60
+ # ========================================================================
61
+ %i[
62
+ attribute_ref constant_ref entity_ref enumeration_ref function_ref
63
+ parameter_ref procedure_ref rule_ref rule_label_ref schema_ref
64
+ subtype_constraint_ref type_label_ref type_ref variable_ref
65
+ ].each do |ref_type|
66
+ Builder.register(ref_type, Builders::ReferenceBuilder.new)
67
+ end
68
+
69
+ # ========================================================================
70
+ # Class-based Builders (simple delegation to call method)
71
+ # ========================================================================
72
+ Builder.register(:syntax, Builders::SyntaxBuilder.new)
73
+ Builder.register(:schema_version_id, Builders::SchemaVersionBuilder.new)
74
+ Builder.register(:declaration, Builders::DeclarationBuilder.new)
75
+ Builder.register(:schema_body_declaration, Builders::SchemaBodyDeclBuilder.new)
76
+ Builder.register(:schema_decl, Builders::SchemaDeclBuilder.new)
77
+ Builder.register(:entity_decl, Builders::EntityDeclBuilder.new)
78
+ Builder.register(:explicit_attr, Builders::ExplicitAttrBuilder.new)
79
+ Builder.register(:attribute_decl, Builders::AttributeDeclBuilder.new)
80
+ Builder.register(:derive_clause, Builders::DeriveClauseBuilder.new)
81
+ Builder.register(:derived_attr, Builders::DerivedAttrBuilder.new)
82
+ Builder.register(:inverse_clause, Builders::InverseClauseBuilder.new)
83
+ Builder.register(:inverse_attr, Builders::InverseAttrBuilder.new)
84
+ Builder.register(:inverse_attr_type, Builders::InverseAttrTypeBuilder.new)
85
+ Builder.register(:unique_clause, Builders::UniqueClauseBuilder.new)
86
+ Builder.register(:unique_rule, Builders::UniqueRuleBuilder.new)
87
+ Builder.register(:where_clause, Builders::WhereClauseBuilder.new)
88
+ Builder.register(:domain_rule, Builders::DomainRuleBuilder.new)
89
+ Builder.register(:type_decl, Builders::TypeDeclBuilder.new)
90
+ Builder.register(:function_decl, Builders::FunctionDeclBuilder.new)
91
+ Builder.register(:procedure_decl, Builders::ProcedureDeclBuilder.new)
92
+ Builder.register(:rule_decl, Builders::RuleDeclBuilder.new)
93
+
94
+ # ========================================================================
95
+ # Built-in Builder (closures)
96
+ # ========================================================================
97
+ Builder.register(:built_in_constant) do |d|
98
+ built_in.build_built_in_constant(d)
99
+ end
100
+ Builder.register(:built_in_function) do |d|
101
+ built_in.build_built_in_function(d)
102
+ end
103
+ Builder.register(:built_in_procedure) do |d|
104
+ built_in.build_built_in_procedure(d)
105
+ end
106
+ Builder.register(:general_ref) { |d| built_in.build_general_ref(d) }
107
+ Builder.register(:named_types) { |d| built_in.build_named_types(d) }
108
+ Builder.register(:item) { |d| built_in.build_item(d) }
109
+ Builder.register(:procedure_ref) { |d| built_in.build_procedure_ref(d) }
110
+ Builder.register(:schema_ref) { |d| built_in.build_schema_ref(d) }
111
+
112
+ # ========================================================================
113
+ # Constant Builder (closures)
114
+ # ========================================================================
115
+ Builder.register(:constant_decl) { |d| constant.build_constant_decl(d) }
116
+ Builder.register(:constant_body) { |d| constant.build_constant_body(d) }
117
+ Builder.register(:local_decl) { |d| constant.build_local_decl(d) }
118
+ Builder.register(:local_variable) { |d| constant.build_local_variable(d) }
119
+ Builder.register(:formal_parameter) do |d|
120
+ constant.build_formal_parameter(d)
121
+ end
122
+ Builder.register(:procedure_head_parameter) do |d|
123
+ constant.build_procedure_head_parameter(d)
124
+ end
125
+
126
+ # ========================================================================
127
+ # Expression Builder (closures)
128
+ # ========================================================================
129
+ Builder.register(:expression) { |d| expression.build_expression(d) }
130
+ Builder.register(:logical_expression) do |d|
131
+ expression.build_logical_expression(d)
132
+ end
133
+ Builder.register(:numeric_expression) do |d|
134
+ expression.build_numeric_expression(d)
135
+ end
136
+ Builder.register(:simple_expression) do |d|
137
+ expression.build_simple_expression(d)
138
+ end
139
+ Builder.register(:term) { |d| expression.build_term(d) }
140
+ Builder.register(:factor) { |d| expression.build_factor(d) }
141
+ Builder.register(:simple_factor) { |d| expression.build_simple_factor(d) }
142
+ Builder.register(:simple_factor_expression) do |d|
143
+ expression.build_simple_factor_expression(d)
144
+ end
145
+ Builder.register(:simple_factor_unary_expression) do |d|
146
+ expression.build_simple_factor_unary_expression(d)
147
+ end
148
+ Builder.register(:constant_factor) do |d|
149
+ expression.build_constant_factor(d)
150
+ end
151
+ Builder.register(:primary) { |d| expression.build_primary(d) }
152
+ Builder.register(:qualifiable_factor) do |d|
153
+ expression.build_qualifiable_factor(d, nil)
154
+ end
155
+ Builder.register(:population) { |d| expression.build_population(d, nil) }
156
+ Builder.register(:qualifier) { |d| expression.build_qualifier(d) }
157
+ Builder.register(:rel_op_extended) do |d|
158
+ expression.build_rel_op_extended(d)
159
+ end
160
+ Builder.register(:function_call) { |d| expression.build_function_call(d) }
161
+ Builder.register(:actual_parameter_list) do |d|
162
+ expression.build_actual_parameter_list(d)
163
+ end
164
+ Builder.register(:parameter) { |d| expression.build_parameter(d) }
165
+ Builder.register(:entity_constructor) do |d|
166
+ expression.build_entity_constructor(d)
167
+ end
168
+ Builder.register(:query_expression) do |d|
169
+ expression.build_query_expression(d)
170
+ end
171
+ Builder.register(:aggregate_source) do |d|
172
+ expression.build_aggregate_source(d)
173
+ end
174
+ Builder.register(:aggregate_initializer) do |d|
175
+ expression.build_aggregate_initializer(d)
176
+ end
177
+ Builder.register(:element) { |d| expression.build_element(d) }
178
+ Builder.register(:repetition) { |d| expression.build_repetition(d) }
179
+ Builder.register(:interval) { |d| expression.build_interval(d) }
180
+ Builder.register(:interval_low) { |d| expression.build_interval_low(d) }
181
+ Builder.register(:interval_high) { |d| expression.build_interval_high(d) }
182
+ Builder.register(:interval_item) { |d| expression.build_interval_item(d) }
183
+ Builder.register(:interval_op) do |d|
184
+ expression.send(:extract_interval_op, d)
185
+ end
186
+
187
+ # Operators
188
+ Builder.register(:add_like_op) do |d|
189
+ expression.send(:extract_operator, d)
190
+ end
191
+ Builder.register(:mul_like_op) do |d|
192
+ expression.send(:extract_operator, d)
193
+ end
194
+ Builder.register(:unary_op) { |d| expression.send(:extract_unary_op, d) }
195
+ Builder.register(:rel_op) { |d| expression.send(:extract_rel_op, d) }
196
+
197
+ # ========================================================================
198
+ # Interface Builder (closures)
199
+ # ========================================================================
200
+ Builder.register(:interface_specification) do |d|
201
+ interface.build_interface_specification(d)
202
+ end
203
+ Builder.register(:use_clause) { |d| interface.build_use_clause(d) }
204
+ Builder.register(:reference_clause) do |d|
205
+ interface.build_reference_clause(d)
206
+ end
207
+ Builder.register(:named_type_or_rename) do |d|
208
+ interface.build_named_type_or_rename(d)
209
+ end
210
+ Builder.register(:resource_or_rename) do |d|
211
+ interface.build_resource_or_rename(d)
212
+ end
213
+ Builder.register(:resource_ref) { |d| interface.build_resource_ref(d) }
214
+ Builder.register(:rename_id) { |d| interface.build_rename_id(d) }
215
+
216
+ # ========================================================================
217
+ # Literal Builder (closures)
218
+ # ========================================================================
219
+ Builder.register(:integer_literal) { |d| literal.build_integer(d) }
220
+ Builder.register(:real_literal) { |d| literal.build_real(d) }
221
+ Builder.register(:binary_literal) { |d| literal.build_binary(d) }
222
+ Builder.register(:logical_literal) { |d| literal.build_logical(d) }
223
+ Builder.register(:string_literal) { |d| literal.build_string(d) }
224
+ Builder.register(:simple_string_literal) do |d|
225
+ literal.build_simple_string(d)
226
+ end
227
+ Builder.register(:encoded_string_literal) do |d|
228
+ literal.build_encoded_string(d)
229
+ end
230
+ Builder.register(:literal, literal)
231
+
232
+ # ========================================================================
233
+ # Qualifier Builder (closures)
234
+ # ========================================================================
235
+ Builder.register(:redeclared_attribute) do |d|
236
+ qualifier.build_redeclared_attribute(d)
237
+ end
238
+ Builder.register(:referenced_attribute) do |d|
239
+ qualifier.build_referenced_attribute(d)
240
+ end
241
+ Builder.register(:qualified_attribute) do |d|
242
+ qualifier.build_qualified_attribute(d)
243
+ end
244
+ Builder.register(:group_qualifier) do |d|
245
+ qualifier.build_group_qualifier(d)
246
+ end
247
+ Builder.register(:attribute_qualifier) do |d|
248
+ qualifier.build_attribute_qualifier(d)
249
+ end
250
+ Builder.register(:index_qualifier) do |d|
251
+ qualifier.build_index_qualifier(d)
252
+ end
253
+ Builder.register(:index1) { |d| qualifier.build_index1(d) }
254
+ Builder.register(:index2) { |d| qualifier.build_index2(d) }
255
+ Builder.register(:index) { |d| qualifier.build_index(d) }
256
+ Builder.register(:enumeration_reference) do |d|
257
+ qualifier.build_enumeration_reference(d)
258
+ end
259
+
260
+ # ========================================================================
261
+ # Statement Builder (closures)
262
+ # ========================================================================
263
+ Builder.register(:stmt) { |d| statement.build_stmt(d) }
264
+ Builder.register(:assignment_stmt) do |d|
265
+ statement.build_assignment_stmt(d)
266
+ end
267
+ Builder.register(:alias_stmt) { |d| statement.build_alias_stmt(d) }
268
+ Builder.register(:if_stmt) { |d| statement.build_if_stmt(d) }
269
+ Builder.register(:case_stmt) { |d| statement.build_case_stmt(d) }
270
+ Builder.register(:selector) { |d| statement.build_selector(d) }
271
+ Builder.register(:case_action) { |d| statement.build_case_action(d) }
272
+ Builder.register(:case_label) { |d| statement.build_case_label(d) }
273
+ Builder.register(:compound_stmt) { |d| statement.build_compound_stmt(d) }
274
+ Builder.register(:repeat_stmt) { |d| statement.build_repeat_stmt(d) }
275
+ Builder.register(:increment_control) do |d|
276
+ statement.build_increment_control(d)
277
+ end
278
+ Builder.register(:increment) { |d| statement.build_increment(d) }
279
+ Builder.register(:while_control) { |d| statement.build_while_control(d) }
280
+ Builder.register(:until_control) { |d| statement.build_until_control(d) }
281
+ Builder.register(:return_stmt) { |d| statement.build_return_stmt(d) }
282
+ Builder.register(:escape_stmt) { |d| statement.build_escape_stmt(d) }
283
+ Builder.register(:skip_stmt) { |d| statement.build_skip_stmt(d) }
284
+ Builder.register(:null_stmt) { |d| statement.build_null_stmt(d) }
285
+ Builder.register(:procedure_call_stmt) do |d|
286
+ statement.build_procedure_call_stmt(d)
287
+ end
288
+ Builder.register(:type_label) { |d| statement.build_type_label(d) }
289
+ Builder.register(:type_label_ref) do |d|
290
+ statement.build_type_label_ref(d)
291
+ end
292
+
293
+ # ========================================================================
294
+ # Subtype Constraint Builder (closures)
295
+ # ========================================================================
296
+ Builder.register(:subtype_constraint_decl) do |d|
297
+ subtype_constraint.build_subtype_constraint_decl(d)
298
+ end
299
+ Builder.register(:subtype_constraint) do |d|
300
+ subtype_constraint.build_subtype_constraint(d)
301
+ end
302
+ Builder.register(:subtype_declaration) do |d|
303
+ subtype_constraint.build_subtype_declaration(d)
304
+ end
305
+ Builder.register(:supertype_rule) do |d|
306
+ subtype_constraint.build_supertype_rule(d)
307
+ end
308
+ Builder.register(:supertype_expression) do |d|
309
+ subtype_constraint.build_supertype_expression(d)
310
+ end
311
+ Builder.register(:supertype_factor) do |d|
312
+ subtype_constraint.build_supertype_factor(d)
313
+ end
314
+ Builder.register(:supertype_term) do |d|
315
+ subtype_constraint.build_supertype_term(d)
316
+ end
317
+ Builder.register(:one_of) { |d| subtype_constraint.build_one_of(d) }
318
+ Builder.register(:total_over) do |d|
319
+ subtype_constraint.build_total_over(d)
320
+ end
321
+
322
+ Builder.register(:subtype_constraint_decl) do |d|
323
+ subtype_constraint.build_subtype_constraint_decl(d)
324
+ end
325
+ Builder.register(:total_over) do |d|
326
+ subtype_constraint.build_total_over(d)
327
+ end
328
+ Builder.register(:supertype_expression) do |d|
329
+ subtype_constraint.build_supertype_expression(d)
330
+ end
331
+ Builder.register(:supertype_factor) do |d|
332
+ subtype_constraint.build_supertype_factor(d)
333
+ end
334
+ Builder.register(:supertype_term) do |d|
335
+ subtype_constraint.build_supertype_term(d)
336
+ end
337
+ Builder.register(:one_of) { |d| subtype_constraint.build_one_of(d) }
338
+ Builder.register(:supertype_rule) do |d|
339
+ subtype_constraint.build_supertype_rule(d)
340
+ end
341
+ Builder.register(:subtype_constraint) do |d|
342
+ subtype_constraint.build_subtype_constraint(d)
343
+ end
344
+ Builder.register(:subtype_declaration) do |d|
345
+ subtype_constraint.build_subtype_declaration(d)
346
+ end
347
+
348
+ # ========================================================================
349
+ # Type Builder (closures)
350
+ # ========================================================================
351
+
352
+ # Simple types
353
+ %i[boolean_type integer_type logical_type number_type].each do |type|
354
+ Builder.register(type) { |d| type_builder.send(:"build_#{type}", d) }
355
+ end
356
+
357
+ # Type constructors
358
+ Builder.register(:generic_type) { |_d| Expressir::Model::DataTypes::Generic.new }
359
+ Builder.register(:generic_entity_type) { |_d| Expressir::Model::DataTypes::GenericEntity.new }
360
+ Builder.register(:aggregate_type) { |_d| Expressir::Model::DataTypes::Aggregate.new }
361
+ Builder.register(:general_set_type) do |d|
362
+ type_builder.build_general_set_type(d)
363
+ end
364
+ Builder.register(:general_list_type) do |d|
365
+ type_builder.build_general_list_type(d)
366
+ end
367
+ Builder.register(:general_bag_type) do |d|
368
+ type_builder.build_general_bag_type(d)
369
+ end
370
+ Builder.register(:general_array_type) do |d|
371
+ type_builder.build_general_array_type(d)
372
+ end
373
+
374
+ Builder.register(:string_type) { |d| type_builder.build_string_type(d) }
375
+ Builder.register(:binary_type) { |d| type_builder.build_binary_type(d) }
376
+ Builder.register(:real_type) { |d| type_builder.build_real_type(d) }
377
+ Builder.register(:array_type) { |d| type_builder.build_array_type(d) }
378
+ Builder.register(:bag_type) { |d| type_builder.build_bag_type(d) }
379
+ Builder.register(:list_type) { |d| type_builder.build_list_type(d) }
380
+ Builder.register(:set_type) { |d| type_builder.build_set_type(d) }
381
+ Builder.register(:enumeration_type) do |d|
382
+ type_builder.build_enumeration_type(d)
383
+ end
384
+ Builder.register(:enumeration_item) do |d|
385
+ type_builder.build_enumeration_item(d)
386
+ end
387
+ Builder.register(:select_type) { |d| type_builder.build_select_type(d) }
388
+
389
+ # Type wrappers
390
+ %i[concrete_types simple_types aggregation_types constructed_types
391
+ generalized_types named_types instantiable_type parameter_type
392
+ underlying_type general_aggregation_types].each do |type|
393
+ Builder.register(type) { |d| type_builder.build_type_wrapper(d) }
394
+ end
395
+
396
+ # Bound handlers
397
+ Builder.register(:bound1) do |d|
398
+ Builder.build_optional(d[:numeric_expression])
399
+ end
400
+ Builder.register(:bound2) do |d|
401
+ Builder.build_optional(d[:numeric_expression])
402
+ end
403
+ Builder.register(:width_spec) do |d|
404
+ { width: Builder.build_optional(d[:width]), fixed: !d[:t_fixed].nil? }
405
+ end
406
+ Builder.register(:width) do |d|
407
+ Builder.build_optional(d[:numeric_expression])
408
+ end
409
+ end
410
+ end
411
+ 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 attribute_decl nodes.
9
7
  class AttributeDeclBuilder
10
- include Helpers
11
-
12
8
  def call(ast_data)
13
9
  id = Builder.build_optional(ast_data[:attribute_id])
14
10
  supertype_attribute = nil
@@ -34,5 +30,3 @@ module Expressir
34
30
  end
35
31
  end
36
32
  end
37
-
38
- Builder.register(:attribute_decl, Expressir::Express::Builders::AttributeDeclBuilder.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 built-in constant, function, and procedure reference nodes.
9
7
  class BuiltInBuilder
10
- include Helpers
8
+ include ::Expressir::Express::Builders::Helpers
11
9
 
12
10
  def build_built_in_constant(ast_data)
13
11
  id = extract_nested_text(ast_data)
@@ -73,16 +71,3 @@ module Expressir
73
71
  end
74
72
  end
75
73
  end
76
-
77
- builder = Expressir::Express::Builders::BuiltInBuilder.new
78
-
79
- Builder.register(:built_in_constant) { |d| builder.build_built_in_constant(d) }
80
- Builder.register(:built_in_function) { |d| builder.build_built_in_function(d) }
81
- Builder.register(:built_in_procedure) do |d|
82
- builder.build_built_in_procedure(d)
83
- end
84
- Builder.register(:general_ref) { |d| builder.build_general_ref(d) }
85
- Builder.register(:named_types) { |d| builder.build_named_types(d) }
86
- Builder.register(:item) { |d| builder.build_item(d) }
87
- Builder.register(:procedure_ref) { |d| builder.build_procedure_ref(d) }
88
- Builder.register(:schema_ref) { |d| builder.build_schema_ref(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 constant and local variable nodes.
9
7
  class ConstantBuilder
10
- include Helpers
11
-
12
8
  def build_constant_decl(ast_data)
13
9
  Builder.build_children(ast_data[:constant_body])
14
10
  end
@@ -23,7 +19,7 @@ module Expressir
23
19
  end
24
20
 
25
21
  def build_local_decl(ast_data)
26
- Builder.build_children(ast_data[:local_variable]).flatten.compact
22
+ Builder.build_children(ast_data[:local_variable])
27
23
  end
28
24
 
29
25
  def build_local_variable(ast_data)
@@ -79,11 +75,11 @@ module Expressir
79
75
  formal_param_data = ast_data[:formal_parameter]
80
76
  params = if formal_param_data.is_a?(Hash)
81
77
  result = Builder.build({ formal_parameter: formal_param_data })
82
- [result].flatten.compact
78
+ Builder.ensure_array(result)
83
79
  elsif formal_param_data.is_a?(Array)
84
- formal_param_data.map do |fp|
80
+ formal_param_data.flat_map do |fp|
85
81
  Builder.build({ formal_parameter: fp })
86
- end.flatten.compact
82
+ end.compact
87
83
  else
88
84
  []
89
85
  end
@@ -102,14 +98,3 @@ module Expressir
102
98
  end
103
99
  end
104
100
  end
105
-
106
- builder = Expressir::Express::Builders::ConstantBuilder.new
107
-
108
- Builder.register(:constant_decl) { |d| builder.build_constant_decl(d) }
109
- Builder.register(:constant_body) { |d| builder.build_constant_body(d) }
110
- Builder.register(:local_decl) { |d| builder.build_local_decl(d) }
111
- Builder.register(:local_variable) { |d| builder.build_local_variable(d) }
112
- Builder.register(:formal_parameter) { |d| builder.build_formal_parameter(d) }
113
- Builder.register(:procedure_head_parameter) do |d|
114
- builder.build_procedure_head_parameter(d)
115
- end
@@ -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)