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
@@ -0,0 +1,113 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Expressir
4
+ # Base error class with details support
5
+ class Error < StandardError
6
+ attr_reader :details
7
+
8
+ def initialize(message = nil, details: nil)
9
+ @details = details
10
+ super(message)
11
+ end
12
+ end
13
+
14
+ # File/Resource Errors
15
+ class FileNotFoundError < Error
16
+ attr_reader :file_path, :file_type
17
+
18
+ def initialize(file_path, file_type: nil)
19
+ @file_path = file_path
20
+ @file_type = file_type
21
+ super("#{file_type || 'File'} not found: #{file_path}")
22
+ end
23
+ end
24
+
25
+ class ManifestNotFoundError < FileNotFoundError
26
+ def initialize(file_path)
27
+ super(file_path, file_type: "Manifest file")
28
+ end
29
+ end
30
+
31
+ class PackageNotFoundError < FileNotFoundError
32
+ def initialize(file_path)
33
+ super(file_path, file_type: "Package file")
34
+ end
35
+ end
36
+
37
+ class SchemaNotFoundError < FileNotFoundError
38
+ def initialize(file_path)
39
+ super(file_path, file_type: "Schema file")
40
+ end
41
+ end
42
+
43
+ # Usage/Argument Errors
44
+ class UsageError < Error
45
+ attr_reader :usage_hint
46
+
47
+ def initialize(message, usage_hint: nil)
48
+ @usage_hint = usage_hint
49
+ super(message)
50
+ end
51
+ end
52
+
53
+ class MissingRequiredArgumentError < UsageError; end
54
+
55
+ class InvalidOptionError < UsageError
56
+ attr_reader :option_name, :valid_options
57
+
58
+ def initialize(option_name, value, valid_options: nil)
59
+ @option_name = option_name
60
+ @valid_options = valid_options
61
+ msg = "Invalid value '#{value}' for #{option_name}"
62
+ msg += ". Valid options: #{valid_options.join(', ')}" if valid_options
63
+ super(msg)
64
+ end
65
+ end
66
+
67
+ # Validation Errors
68
+ class ValidationError < Error
69
+ attr_reader :errors
70
+
71
+ def initialize(message, errors: [])
72
+ @errors = errors
73
+ super(message)
74
+ end
75
+ end
76
+
77
+ class ManifestValidationError < ValidationError; end
78
+ class SchemaValidationError < ValidationError; end
79
+
80
+ class ReferentialIntegrityError < ValidationError
81
+ attr_reader :unresolved_references
82
+
83
+ def initialize(unresolved_references,
84
+ message: "Referential integrity check failed")
85
+ @unresolved_references = unresolved_references
86
+ super(message)
87
+ end
88
+ end
89
+
90
+ class NoValidSchemaPathsError < ValidationError
91
+ def initialize(message = "No valid schema paths found")
92
+ super
93
+ end
94
+ end
95
+
96
+ # Command Errors (for rescue blocks)
97
+ class CommandError < Error
98
+ attr_reader :command_name
99
+
100
+ def initialize(message, command_name: nil)
101
+ @command_name = command_name
102
+ super(message)
103
+ end
104
+ end
105
+
106
+ class PackageBuildError < CommandError; end
107
+ class PackageReadError < CommandError; end
108
+ class PackageExtractError < CommandError; end
109
+ class PackageValidationError < CommandError; end
110
+ class PackageListError < CommandError; end
111
+ class PackageSearchError < CommandError; end
112
+ class PackageTreeError < CommandError; end
113
+ end
@@ -1,7 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative "error"
4
-
5
3
  module Expressir
6
4
  module Express
7
5
  # Builder registry for AST node type handlers.
@@ -110,14 +108,29 @@ module Expressir
110
108
  build(ast)
111
109
  end
112
110
 
111
+ # Normalize a value to an Array for iteration.
112
+ # Handles: nil → [], Parsanol::Slice → [], Array → Array, other → [other]
113
+ def ensure_array(value)
114
+ return [] if value.nil?
115
+ return [] if value.is_a?(Parsanol::Slice)
116
+ value.is_a?(Array) ? value : [value]
117
+ end
118
+
113
119
  # Build children (array of AST nodes)
114
120
  # Optimized to avoid intermediate array allocations
115
121
  def build_children(ast_array)
116
- return [] unless ast_array
122
+ return [] if ast_array.nil?
123
+
124
+ # Handle Parsanol::Slice (including empty Slices from native parser)
125
+ # Convert to empty Array to match Ruby parser behavior
126
+ # Native parser returns empty slices where Ruby parser returns empty arrays
127
+ if ast_array.is_a?(Parsanol::Slice)
128
+ return []
129
+ end
117
130
 
118
131
  # Handle single element (common case)
119
132
  unless ast_array.is_a?(Array)
120
- return ast_array.nil? ? [] : [build(ast_array)].compact
133
+ return [build(ast_array)].compact
121
134
  end
122
135
 
123
136
  # Build result in single pass, avoiding flatten/compact/map chain
@@ -125,6 +138,11 @@ module Expressir
125
138
  ast_array.each do |item|
126
139
  next if item.nil?
127
140
 
141
+ # Empty Slices from native parser should be treated as empty arrays
142
+ if item.is_a?(Parsanol::Slice)
143
+ next
144
+ end
145
+
128
146
  case item
129
147
  when Array
130
148
  item.each do |sub|
@@ -345,6 +363,3 @@ module Expressir
345
363
  end
346
364
  end
347
365
  end
348
-
349
- # Top-level alias for convenience in builder files
350
- Builder = Expressir::Express::Builder
@@ -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