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.
- checksums.yaml +4 -4
- data/.rubocop.yml +1 -1
- data/.rubocop_todo.yml +254 -77
- data/Gemfile +4 -1
- data/README.adoc +63 -26
- data/benchmark/srl_benchmark.rb +386 -0
- data/benchmark/srl_native_benchmark.rb +142 -0
- data/benchmark/srl_ruby_benchmark.rb +130 -0
- data/expressir.gemspec +4 -2
- data/lib/expressir/benchmark.rb +1 -1
- data/lib/expressir/changes/item_change.rb +0 -1
- data/lib/expressir/changes/mapping_change.rb +0 -1
- data/lib/expressir/changes/schema_change.rb +0 -2
- data/lib/expressir/changes/version_change.rb +0 -3
- data/lib/expressir/changes.rb +5 -6
- data/lib/expressir/cli.rb +10 -24
- data/lib/expressir/commands/base.rb +2 -9
- data/lib/expressir/commands/changes.rb +0 -2
- data/lib/expressir/commands/changes_import_eengine.rb +0 -3
- data/lib/expressir/commands/changes_validate.rb +0 -2
- data/lib/expressir/commands/format.rb +5 -3
- data/lib/expressir/commands/manifest.rb +0 -7
- data/lib/expressir/commands/package.rb +93 -101
- data/lib/expressir/commands/validate.rb +0 -2
- data/lib/expressir/commands/validate_ascii.rb +2 -4
- data/lib/expressir/commands/validate_load.rb +8 -5
- data/lib/expressir/commands.rb +20 -0
- data/lib/expressir/config.rb +0 -2
- data/lib/expressir/coverage.rb +11 -4
- data/lib/expressir/eengine/arm_compare_report.rb +1 -4
- data/lib/expressir/eengine/changes_section.rb +1 -3
- data/lib/expressir/eengine/compare_report.rb +1 -13
- data/lib/expressir/eengine/mim_compare_report.rb +1 -4
- data/lib/expressir/eengine/modified_object.rb +1 -2
- data/lib/expressir/eengine.rb +9 -0
- data/lib/expressir/errors.rb +113 -0
- data/lib/expressir/express/builder.rb +22 -7
- data/lib/expressir/express/builder_registry.rb +411 -0
- data/lib/expressir/express/builders/attribute_decl_builder.rb +0 -6
- data/lib/expressir/express/builders/built_in_builder.rb +1 -16
- data/lib/expressir/express/builders/constant_builder.rb +4 -19
- data/lib/expressir/express/builders/declaration_builder.rb +0 -4
- data/lib/expressir/express/builders/derive_clause_builder.rb +0 -2
- data/lib/expressir/express/builders/derived_attr_builder.rb +0 -2
- data/lib/expressir/express/builders/domain_rule_builder.rb +0 -2
- data/lib/expressir/express/builders/entity_decl_builder.rb +7 -13
- data/lib/expressir/express/builders/explicit_attr_builder.rb +5 -8
- data/lib/expressir/express/builders/expression_builder.rb +31 -67
- data/lib/expressir/express/builders/function_decl_builder.rb +20 -18
- data/lib/expressir/express/builders/interface_builder.rb +0 -20
- data/lib/expressir/express/builders/inverse_attr_builder.rb +0 -2
- data/lib/expressir/express/builders/inverse_attr_type_builder.rb +0 -6
- data/lib/expressir/express/builders/inverse_clause_builder.rb +0 -2
- data/lib/expressir/express/builders/literal_builder.rb +1 -15
- data/lib/expressir/express/builders/procedure_decl_builder.rb +20 -19
- data/lib/expressir/express/builders/qualifier_builder.rb +0 -27
- data/lib/expressir/express/builders/reference_builder.rb +1 -10
- data/lib/expressir/express/builders/rule_decl_builder.rb +21 -19
- data/lib/expressir/express/builders/schema_body_decl_builder.rb +0 -4
- data/lib/expressir/express/builders/schema_decl_builder.rb +7 -13
- data/lib/expressir/express/builders/schema_version_builder.rb +0 -6
- data/lib/expressir/express/builders/simple_id_builder.rb +1 -10
- data/lib/expressir/express/builders/statement_builder.rb +4 -32
- data/lib/expressir/express/builders/subtype_constraint_builder.rb +6 -30
- data/lib/expressir/express/builders/syntax_builder.rb +60 -7
- data/lib/expressir/express/builders/type_builder.rb +3 -45
- data/lib/expressir/express/builders/type_decl_builder.rb +1 -7
- data/lib/expressir/express/builders/unique_clause_builder.rb +1 -3
- data/lib/expressir/express/builders/unique_rule_builder.rb +0 -2
- data/lib/expressir/express/builders/where_clause_builder.rb +1 -3
- data/lib/expressir/express/builders.rb +47 -35
- data/lib/expressir/express/error.rb +0 -3
- data/lib/expressir/express/formatter.rb +17 -19
- data/lib/expressir/express/formatters/data_types_formatter.rb +295 -293
- data/lib/expressir/express/formatters/declarations_formatter.rb +617 -615
- data/lib/expressir/express/formatters/expressions_formatter.rb +146 -144
- data/lib/expressir/express/formatters/literals_formatter.rb +35 -33
- data/lib/expressir/express/formatters/references_formatter.rb +34 -32
- data/lib/expressir/express/formatters/remark_formatter.rb +176 -209
- data/lib/expressir/express/formatters/remark_item_formatter.rb +18 -16
- data/lib/expressir/express/formatters/statements_formatter.rb +190 -188
- data/lib/expressir/express/formatters/supertype_expressions_formatter.rb +41 -39
- data/lib/expressir/express/formatters.rb +22 -0
- data/lib/expressir/express/parser.rb +40 -41
- data/lib/expressir/express/pretty_formatter.rb +68 -47
- data/lib/expressir/express/remark_attacher.rb +210 -147
- data/lib/expressir/express/streaming_builder.rb +0 -3
- data/lib/expressir/express/transformer/remark_handling.rb +1 -2
- data/lib/expressir/express.rb +29 -0
- data/lib/expressir/manifest/resolver.rb +0 -3
- data/lib/expressir/manifest/validator.rb +0 -3
- data/lib/expressir/manifest.rb +6 -0
- data/lib/expressir/model/cache.rb +1 -1
- data/lib/expressir/model/concerns.rb +19 -0
- data/lib/expressir/model/data_types/aggregate.rb +1 -1
- data/lib/expressir/model/data_types/array.rb +1 -1
- data/lib/expressir/model/data_types/bag.rb +1 -1
- data/lib/expressir/model/data_types/binary.rb +1 -1
- data/lib/expressir/model/data_types/boolean.rb +1 -1
- data/lib/expressir/model/data_types/enumeration.rb +1 -1
- data/lib/expressir/model/data_types/enumeration_item.rb +1 -1
- data/lib/expressir/model/data_types/generic.rb +1 -1
- data/lib/expressir/model/data_types/generic_entity.rb +1 -1
- data/lib/expressir/model/data_types/integer.rb +1 -1
- data/lib/expressir/model/data_types/list.rb +1 -1
- data/lib/expressir/model/data_types/logical.rb +1 -1
- data/lib/expressir/model/data_types/number.rb +1 -1
- data/lib/expressir/model/data_types/real.rb +1 -1
- data/lib/expressir/model/data_types/select.rb +1 -1
- data/lib/expressir/model/data_types/set.rb +1 -1
- data/lib/expressir/model/data_types/string.rb +1 -1
- data/lib/expressir/model/data_types.rb +25 -0
- data/lib/expressir/model/declarations/attribute.rb +1 -1
- data/lib/expressir/model/declarations/constant.rb +1 -1
- data/lib/expressir/model/declarations/derived_attribute.rb +1 -1
- data/lib/expressir/model/declarations/entity.rb +4 -1
- data/lib/expressir/model/declarations/function.rb +3 -1
- data/lib/expressir/model/declarations/informal_proposition_rule.rb +2 -1
- data/lib/expressir/model/declarations/interface.rb +1 -1
- data/lib/expressir/model/declarations/interface_item.rb +1 -1
- data/lib/expressir/model/declarations/interfaced_item.rb +1 -1
- data/lib/expressir/model/declarations/inverse_attribute.rb +1 -1
- data/lib/expressir/model/declarations/parameter.rb +1 -1
- data/lib/expressir/model/declarations/procedure.rb +3 -1
- data/lib/expressir/model/declarations/remark_item.rb +1 -1
- data/lib/expressir/model/declarations/rule.rb +4 -1
- data/lib/expressir/model/declarations/schema.rb +2 -1
- data/lib/expressir/model/declarations/schema_version.rb +1 -1
- data/lib/expressir/model/declarations/schema_version_item.rb +1 -1
- data/lib/expressir/model/declarations/subtype_constraint.rb +1 -1
- data/lib/expressir/model/declarations/type.rb +4 -1
- data/lib/expressir/model/declarations/unique_rule.rb +1 -1
- data/lib/expressir/model/declarations/variable.rb +1 -1
- data/lib/expressir/model/declarations/where_rule.rb +1 -1
- data/lib/expressir/model/declarations.rb +31 -0
- data/lib/expressir/model/dependency_resolver.rb +0 -2
- data/lib/expressir/model/exp_file.rb +38 -0
- data/lib/expressir/model/expressions/aggregate_initializer.rb +1 -1
- data/lib/expressir/model/expressions/aggregate_initializer_item.rb +1 -1
- data/lib/expressir/model/expressions/binary_expression.rb +1 -1
- data/lib/expressir/model/expressions/entity_constructor.rb +1 -1
- data/lib/expressir/model/expressions/function_call.rb +1 -1
- data/lib/expressir/model/expressions/interval.rb +1 -1
- data/lib/expressir/model/expressions/query_expression.rb +1 -1
- data/lib/expressir/model/expressions/unary_expression.rb +1 -1
- data/lib/expressir/model/expressions.rb +18 -0
- data/lib/expressir/model/identifier.rb +5 -1
- data/lib/expressir/model/indexes.rb +11 -0
- data/lib/expressir/model/literals/binary.rb +1 -1
- data/lib/expressir/model/literals/integer.rb +1 -1
- data/lib/expressir/model/literals/logical.rb +1 -1
- data/lib/expressir/model/literals/real.rb +1 -1
- data/lib/expressir/model/literals/string.rb +1 -1
- data/lib/expressir/model/literals.rb +13 -0
- data/lib/expressir/model/model_element.rb +7 -15
- data/lib/expressir/model/references/attribute_reference.rb +1 -1
- data/lib/expressir/model/references/group_reference.rb +1 -1
- data/lib/expressir/model/references/index_reference.rb +1 -1
- data/lib/expressir/model/references/simple_reference.rb +1 -1
- data/lib/expressir/model/references.rb +12 -0
- data/lib/expressir/model/remark_info.rb +1 -7
- data/lib/expressir/model/repository.rb +72 -36
- data/lib/expressir/model/repository_validator.rb +0 -2
- data/lib/expressir/model/search_engine.rb +6 -30
- data/lib/expressir/model/statements/alias.rb +1 -1
- data/lib/expressir/model/statements/assignment.rb +1 -1
- data/lib/expressir/model/statements/case.rb +1 -1
- data/lib/expressir/model/statements/case_action.rb +1 -1
- data/lib/expressir/model/statements/compound.rb +1 -1
- data/lib/expressir/model/statements/escape.rb +1 -1
- data/lib/expressir/model/statements/if.rb +1 -1
- data/lib/expressir/model/statements/null.rb +1 -1
- data/lib/expressir/model/statements/procedure_call.rb +1 -1
- data/lib/expressir/model/statements/repeat.rb +1 -1
- data/lib/expressir/model/statements/return.rb +1 -1
- data/lib/expressir/model/statements/skip.rb +1 -1
- data/lib/expressir/model/statements.rb +20 -0
- data/lib/expressir/model/supertype_expressions/binary_supertype_expression.rb +1 -1
- data/lib/expressir/model/supertype_expressions/oneof_supertype_expression.rb +1 -1
- data/lib/expressir/model/supertype_expressions.rb +12 -0
- data/lib/expressir/model.rb +28 -4
- data/lib/expressir/package/builder.rb +33 -4
- data/lib/expressir/package/metadata.rb +0 -1
- data/lib/expressir/package/reader.rb +0 -1
- data/lib/expressir/package.rb +8 -0
- data/lib/expressir/schema_manifest.rb +5 -6
- data/lib/expressir/schema_manifest_entry.rb +3 -4
- data/lib/expressir/transformer.rb +7 -0
- data/lib/expressir/version.rb +1 -1
- data/lib/expressir.rb +23 -173
- metadata +64 -9
- 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 []
|
|
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
|
|
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])
|
|
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
|
-
|
|
78
|
+
Builder.ensure_array(result)
|
|
83
79
|
elsif formal_param_data.is_a?(Array)
|
|
84
|
-
formal_param_data.
|
|
80
|
+
formal_param_data.flat_map do |fp|
|
|
85
81
|
Builder.build({ formal_parameter: fp })
|
|
86
|
-
end.
|
|
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
|