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.
- checksums.yaml +4 -4
- data/.rubocop.yml +1 -1
- data/.rubocop_todo.yml +253 -81
- 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 +3 -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/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 +1 -1
- data/lib/expressir/commands/manifest.rb +0 -7
- data/lib/expressir/commands/package.rb +16 -29
- data/lib/expressir/commands/validate.rb +0 -2
- data/lib/expressir/commands/validate_load.rb +1 -1
- 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 +3 -5
- 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 -171
- metadata +49 -9
- data/lib/expressir/express/builders/token_builder.rb +0 -15
|
@@ -1,13 +1,11 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
require_relative "helpers"
|
|
4
|
-
|
|
5
3
|
module Expressir
|
|
6
4
|
module Express
|
|
7
5
|
module Builders
|
|
8
6
|
# Builds expression nodes (binary, unary, query, interval, etc.).
|
|
9
7
|
class ExpressionBuilder
|
|
10
|
-
include Helpers
|
|
8
|
+
include ::Expressir::Express::Builders::Helpers
|
|
11
9
|
|
|
12
10
|
# Expression
|
|
13
11
|
def build_expression(ast_data)
|
|
@@ -43,14 +41,24 @@ module Expressir
|
|
|
43
41
|
return nil unless ast_data[:term]
|
|
44
42
|
|
|
45
43
|
term = Builder.build_term(ast_data[:term])
|
|
46
|
-
rhs = ast_data[:rhs]
|
|
44
|
+
rhs = ast_data[:rhs]
|
|
45
|
+
|
|
46
|
+
return term if rhs.nil? || (rhs.respond_to?(:empty?) && rhs.empty?)
|
|
47
47
|
|
|
48
|
-
|
|
48
|
+
# Handle both formats:
|
|
49
|
+
# - Ruby parser: rhs is Array of {:item => {...}} hashes
|
|
50
|
+
# - Native parser: rhs might be a Hash (merged) or Array
|
|
51
|
+
rhs_array = rhs.is_a?(Array) ? rhs : [rhs]
|
|
49
52
|
|
|
50
53
|
operands = [term]
|
|
51
54
|
operators = []
|
|
52
55
|
|
|
53
|
-
|
|
56
|
+
rhs_array.each do |r|
|
|
57
|
+
# Handle Hash.each yielding [key, value] arrays
|
|
58
|
+
r = r.last if r.is_a?(Array) && r.length == 2
|
|
59
|
+
|
|
60
|
+
next unless r.is_a?(Hash)
|
|
61
|
+
|
|
54
62
|
item = r[:item] || r
|
|
55
63
|
op_data = item[:operator]
|
|
56
64
|
operators << extract_operator(op_data[:add_like_op]) if op_data
|
|
@@ -67,14 +75,24 @@ module Expressir
|
|
|
67
75
|
return nil unless ast_data[:factor]
|
|
68
76
|
|
|
69
77
|
factor = Builder.build_factor(ast_data[:factor])
|
|
70
|
-
rhs = ast_data[:rhs]
|
|
78
|
+
rhs = ast_data[:rhs]
|
|
79
|
+
|
|
80
|
+
return factor if rhs.nil? || (rhs.respond_to?(:empty?) && rhs.empty?)
|
|
71
81
|
|
|
72
|
-
|
|
82
|
+
# Handle both formats:
|
|
83
|
+
# - Ruby parser: rhs is Array of {:item => {...}} hashes
|
|
84
|
+
# - Native parser: rhs might be a Hash (merged) or Array
|
|
85
|
+
rhs_array = rhs.is_a?(Array) ? rhs : [rhs]
|
|
73
86
|
|
|
74
87
|
operands = [factor]
|
|
75
88
|
operators = []
|
|
76
89
|
|
|
77
|
-
|
|
90
|
+
rhs_array.each do |r|
|
|
91
|
+
# Handle Hash.each yielding [key, value] arrays
|
|
92
|
+
r = r.last if r.is_a?(Array) && r.length == 2
|
|
93
|
+
|
|
94
|
+
next unless r.is_a?(Hash)
|
|
95
|
+
|
|
78
96
|
item = r[:item] || r
|
|
79
97
|
op_data = item[:multiplication_like_op] || item[:mul_like_op]
|
|
80
98
|
operators << extract_operator(op_data) if op_data
|
|
@@ -192,7 +210,7 @@ module Expressir
|
|
|
192
210
|
|
|
193
211
|
return ref unless qualifiers
|
|
194
212
|
|
|
195
|
-
|
|
213
|
+
Builder.ensure_array(qualifiers).each do |qual|
|
|
196
214
|
qual_result = Builder.build_node(:qualifier, qual)
|
|
197
215
|
ref = apply_qualifier(ref, qual_result)
|
|
198
216
|
end
|
|
@@ -203,7 +221,7 @@ module Expressir
|
|
|
203
221
|
ref = Builder.build_node(:entity_ref, ast_data[:entity_ref])
|
|
204
222
|
return ref unless qualifiers
|
|
205
223
|
|
|
206
|
-
|
|
224
|
+
Builder.ensure_array(qualifiers).each do |qual|
|
|
207
225
|
qual_result = Builder.build_node(:qualifier, qual)
|
|
208
226
|
ref = apply_qualifier(ref, qual_result)
|
|
209
227
|
end
|
|
@@ -267,7 +285,7 @@ module Expressir
|
|
|
267
285
|
else
|
|
268
286
|
Expressir::Model::Expressions::FunctionCall.new(
|
|
269
287
|
function: func_ref,
|
|
270
|
-
parameters:
|
|
288
|
+
parameters: params,
|
|
271
289
|
)
|
|
272
290
|
end
|
|
273
291
|
end
|
|
@@ -307,7 +325,7 @@ module Expressir
|
|
|
307
325
|
|
|
308
326
|
Expressir::Model::Expressions::FunctionCall.new(
|
|
309
327
|
function: entity_ref,
|
|
310
|
-
parameters:
|
|
328
|
+
parameters: params,
|
|
311
329
|
)
|
|
312
330
|
end
|
|
313
331
|
|
|
@@ -397,57 +415,3 @@ module Expressir
|
|
|
397
415
|
end
|
|
398
416
|
end
|
|
399
417
|
end
|
|
400
|
-
|
|
401
|
-
builder = Expressir::Express::Builders::ExpressionBuilder.new
|
|
402
|
-
|
|
403
|
-
Builder.register(:expression) { |d| builder.build_expression(d) }
|
|
404
|
-
Builder.register(:logical_expression) do |d|
|
|
405
|
-
builder.build_logical_expression(d)
|
|
406
|
-
end
|
|
407
|
-
Builder.register(:numeric_expression) do |d|
|
|
408
|
-
builder.build_numeric_expression(d)
|
|
409
|
-
end
|
|
410
|
-
Builder.register(:simple_expression) { |d| builder.build_simple_expression(d) }
|
|
411
|
-
Builder.register(:term) { |d| builder.build_term(d) }
|
|
412
|
-
Builder.register(:factor) { |d| builder.build_factor(d) }
|
|
413
|
-
Builder.register(:simple_factor) { |d| builder.build_simple_factor(d) }
|
|
414
|
-
Builder.register(:simple_factor_expression) do |d|
|
|
415
|
-
builder.build_simple_factor_expression(d)
|
|
416
|
-
end
|
|
417
|
-
Builder.register(:simple_factor_unary_expression) do |d|
|
|
418
|
-
builder.build_simple_factor_unary_expression(d)
|
|
419
|
-
end
|
|
420
|
-
Builder.register(:constant_factor) { |d| builder.build_constant_factor(d) }
|
|
421
|
-
Builder.register(:primary) { |d| builder.build_primary(d) }
|
|
422
|
-
Builder.register(:qualifiable_factor) do |d|
|
|
423
|
-
builder.build_qualifiable_factor(d, nil)
|
|
424
|
-
end
|
|
425
|
-
Builder.register(:population) { |d| builder.build_population(d, nil) }
|
|
426
|
-
Builder.register(:qualifier) { |d| builder.build_qualifier(d) }
|
|
427
|
-
Builder.register(:rel_op_extended) { |d| builder.build_rel_op_extended(d) }
|
|
428
|
-
Builder.register(:function_call) { |d| builder.build_function_call(d) }
|
|
429
|
-
Builder.register(:actual_parameter_list) do |d|
|
|
430
|
-
builder.build_actual_parameter_list(d)
|
|
431
|
-
end
|
|
432
|
-
Builder.register(:parameter) { |d| builder.build_parameter(d) }
|
|
433
|
-
Builder.register(:entity_constructor) do |d|
|
|
434
|
-
builder.build_entity_constructor(d)
|
|
435
|
-
end
|
|
436
|
-
Builder.register(:query_expression) { |d| builder.build_query_expression(d) }
|
|
437
|
-
Builder.register(:aggregate_source) { |d| builder.build_aggregate_source(d) }
|
|
438
|
-
Builder.register(:aggregate_initializer) do |d|
|
|
439
|
-
builder.build_aggregate_initializer(d)
|
|
440
|
-
end
|
|
441
|
-
Builder.register(:element) { |d| builder.build_element(d) }
|
|
442
|
-
Builder.register(:repetition) { |d| builder.build_repetition(d) }
|
|
443
|
-
Builder.register(:interval) { |d| builder.build_interval(d) }
|
|
444
|
-
Builder.register(:interval_low) { |d| builder.build_interval_low(d) }
|
|
445
|
-
Builder.register(:interval_high) { |d| builder.build_interval_high(d) }
|
|
446
|
-
Builder.register(:interval_item) { |d| builder.build_interval_item(d) }
|
|
447
|
-
Builder.register(:interval_op) { |d| builder.send(:extract_interval_op, d) }
|
|
448
|
-
|
|
449
|
-
# Operators
|
|
450
|
-
Builder.register(:add_like_op) { |d| builder.send(:extract_operator, d) }
|
|
451
|
-
Builder.register(:mul_like_op) { |d| builder.send(:extract_operator, d) }
|
|
452
|
-
Builder.register(:unary_op) { |d| builder.send(:extract_unary_op, d) }
|
|
453
|
-
Builder.register(:rel_op) { |d| builder.send(:extract_rel_op, d) }
|
|
@@ -1,14 +1,10 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
require_relative "helpers"
|
|
4
|
-
|
|
5
3
|
module Expressir
|
|
6
4
|
module Express
|
|
7
5
|
module Builders
|
|
8
6
|
# Builds function declaration nodes.
|
|
9
7
|
class FunctionDeclBuilder
|
|
10
|
-
include Helpers
|
|
11
|
-
|
|
12
8
|
def call(ast_data)
|
|
13
9
|
head = ast_data[:function_head]
|
|
14
10
|
algorithm_head = ast_data[:algorithm_head]
|
|
@@ -23,13 +19,21 @@ module Expressir
|
|
|
23
19
|
declarations = Builder.build_children(algorithm_head[:declaration])
|
|
24
20
|
end
|
|
25
21
|
|
|
26
|
-
types = declarations.
|
|
27
|
-
entities = declarations.
|
|
28
|
-
subtype_constraints = declarations.
|
|
29
|
-
functions = declarations.
|
|
30
|
-
procedures = declarations.
|
|
31
|
-
constants =
|
|
32
|
-
|
|
22
|
+
types = declarations.grep(Expressir::Model::Declarations::Type)
|
|
23
|
+
entities = declarations.grep(Expressir::Model::Declarations::Entity)
|
|
24
|
+
subtype_constraints = declarations.grep(Expressir::Model::Declarations::SubtypeConstraint)
|
|
25
|
+
functions = declarations.grep(Expressir::Model::Declarations::Function)
|
|
26
|
+
procedures = declarations.grep(Expressir::Model::Declarations::Procedure)
|
|
27
|
+
constants = if algorithm_head.is_a?(Hash) && algorithm_head[:constant_decl]
|
|
28
|
+
build_constant_decl(algorithm_head[:constant_decl])
|
|
29
|
+
else
|
|
30
|
+
[]
|
|
31
|
+
end
|
|
32
|
+
variables = if algorithm_head.is_a?(Hash) && algorithm_head[:local_decl]
|
|
33
|
+
build_local_decl(algorithm_head[:local_decl])
|
|
34
|
+
else
|
|
35
|
+
[]
|
|
36
|
+
end
|
|
33
37
|
statements = Builder.build_children(stmts)
|
|
34
38
|
|
|
35
39
|
Expressir::Model::Declarations::Function.new(
|
|
@@ -41,8 +45,8 @@ module Expressir
|
|
|
41
45
|
subtype_constraints: subtype_constraints,
|
|
42
46
|
functions: functions,
|
|
43
47
|
procedures: procedures,
|
|
44
|
-
constants:
|
|
45
|
-
variables:
|
|
48
|
+
constants: constants,
|
|
49
|
+
variables: variables,
|
|
46
50
|
statements: statements.compact,
|
|
47
51
|
)
|
|
48
52
|
end
|
|
@@ -62,9 +66,9 @@ module Expressir
|
|
|
62
66
|
end
|
|
63
67
|
|
|
64
68
|
parameters = []
|
|
65
|
-
params_data.
|
|
69
|
+
Builder.ensure_array(params_data).each do |param|
|
|
66
70
|
result = Builder.build({ formal_parameter: param })
|
|
67
|
-
parameters.concat(
|
|
71
|
+
parameters.concat(Builder.ensure_array(result)) if result
|
|
68
72
|
end
|
|
69
73
|
parameters
|
|
70
74
|
end
|
|
@@ -74,11 +78,9 @@ module Expressir
|
|
|
74
78
|
end
|
|
75
79
|
|
|
76
80
|
def build_local_decl(data)
|
|
77
|
-
Builder.build_children(data[:local_variable])
|
|
81
|
+
Builder.build_children(data[:local_variable])
|
|
78
82
|
end
|
|
79
83
|
end
|
|
80
84
|
end
|
|
81
85
|
end
|
|
82
86
|
end
|
|
83
|
-
|
|
84
|
-
Builder.register(:function_decl, Expressir::Express::Builders::FunctionDeclBuilder.new)
|
|
@@ -1,14 +1,10 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
require_relative "helpers"
|
|
4
|
-
|
|
5
3
|
module Expressir
|
|
6
4
|
module Express
|
|
7
5
|
module Builders
|
|
8
6
|
# Builds interface specification nodes (use/reference clauses).
|
|
9
7
|
class InterfaceBuilder
|
|
10
|
-
include Helpers
|
|
11
|
-
|
|
12
8
|
def build_interface_specification(ast_data)
|
|
13
9
|
ast_data = ast_data[:interface_specification] if ast_data[:interface_specification]
|
|
14
10
|
if ast_data[:reference_clause]
|
|
@@ -153,19 +149,3 @@ module Expressir
|
|
|
153
149
|
end
|
|
154
150
|
end
|
|
155
151
|
end
|
|
156
|
-
|
|
157
|
-
builder = Expressir::Express::Builders::InterfaceBuilder.new
|
|
158
|
-
|
|
159
|
-
Builder.register(:interface_specification) do |d|
|
|
160
|
-
builder.build_interface_specification(d)
|
|
161
|
-
end
|
|
162
|
-
Builder.register(:use_clause) { |d| builder.build_use_clause(d) }
|
|
163
|
-
Builder.register(:reference_clause) { |d| builder.build_reference_clause(d) }
|
|
164
|
-
Builder.register(:named_type_or_rename) do |d|
|
|
165
|
-
builder.build_named_type_or_rename(d)
|
|
166
|
-
end
|
|
167
|
-
Builder.register(:resource_or_rename) do |d|
|
|
168
|
-
builder.build_resource_or_rename(d)
|
|
169
|
-
end
|
|
170
|
-
Builder.register(:resource_ref) { |d| builder.build_resource_ref(d) }
|
|
171
|
-
Builder.register(:rename_id) { |d| builder.build_rename_id(d) }
|
|
@@ -1,14 +1,10 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
require_relative "helpers"
|
|
4
|
-
|
|
5
3
|
module Expressir
|
|
6
4
|
module Express
|
|
7
5
|
module Builders
|
|
8
6
|
# Builds inverse_attr_type nodes.
|
|
9
7
|
class InverseAttrTypeBuilder
|
|
10
|
-
include Helpers
|
|
11
|
-
|
|
12
8
|
def call(ast_data)
|
|
13
9
|
bound_spec = ast_data[:bound_spec] || {}
|
|
14
10
|
bound1 = Builder.build_optional(bound_spec[:bound1])
|
|
@@ -32,5 +28,3 @@ module Expressir
|
|
|
32
28
|
end
|
|
33
29
|
end
|
|
34
30
|
end
|
|
35
|
-
|
|
36
|
-
Builder.register(:inverse_attr_type, Expressir::Express::Builders::InverseAttrTypeBuilder.new)
|
|
@@ -1,13 +1,11 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
require_relative "helpers"
|
|
4
|
-
|
|
5
3
|
module Expressir
|
|
6
4
|
module Express
|
|
7
5
|
module Builders
|
|
8
6
|
# Builds literal nodes (integer, real, binary, logical, string).
|
|
9
7
|
class LiteralBuilder
|
|
10
|
-
include Helpers
|
|
8
|
+
include ::Expressir::Express::Builders::Helpers
|
|
11
9
|
|
|
12
10
|
# Integer literal
|
|
13
11
|
def build_integer(ast_data)
|
|
@@ -93,15 +91,3 @@ module Expressir
|
|
|
93
91
|
end
|
|
94
92
|
end
|
|
95
93
|
end
|
|
96
|
-
|
|
97
|
-
builder = Expressir::Express::Builders::LiteralBuilder.new
|
|
98
|
-
Builder.register(:integer_literal) { |d| builder.build_integer(d) }
|
|
99
|
-
Builder.register(:real_literal) { |d| builder.build_real(d) }
|
|
100
|
-
Builder.register(:binary_literal) { |d| builder.build_binary(d) }
|
|
101
|
-
Builder.register(:logical_literal) { |d| builder.build_logical(d) }
|
|
102
|
-
Builder.register(:string_literal) { |d| builder.build_string(d) }
|
|
103
|
-
Builder.register(:simple_string_literal) { |d| builder.build_simple_string(d) }
|
|
104
|
-
Builder.register(:encoded_string_literal) do |d|
|
|
105
|
-
builder.build_encoded_string(d)
|
|
106
|
-
end
|
|
107
|
-
Builder.register(:literal, builder)
|
|
@@ -1,14 +1,10 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
require_relative "helpers"
|
|
4
|
-
|
|
5
3
|
module Expressir
|
|
6
4
|
module Express
|
|
7
5
|
module Builders
|
|
8
6
|
# Builds procedure declaration nodes.
|
|
9
7
|
class ProcedureDeclBuilder
|
|
10
|
-
include Helpers
|
|
11
|
-
|
|
12
8
|
def call(ast_data)
|
|
13
9
|
head = ast_data[:procedure_head]
|
|
14
10
|
algorithm_head = ast_data[:algorithm_head]
|
|
@@ -22,13 +18,21 @@ module Expressir
|
|
|
22
18
|
declarations = Builder.build_children(algorithm_head[:declaration])
|
|
23
19
|
end
|
|
24
20
|
|
|
25
|
-
types = declarations.
|
|
26
|
-
entities = declarations.
|
|
27
|
-
subtype_constraints = declarations.
|
|
28
|
-
functions = declarations.
|
|
29
|
-
procedures = declarations.
|
|
30
|
-
constants =
|
|
31
|
-
|
|
21
|
+
types = declarations.grep(Expressir::Model::Declarations::Type)
|
|
22
|
+
entities = declarations.grep(Expressir::Model::Declarations::Entity)
|
|
23
|
+
subtype_constraints = declarations.grep(Expressir::Model::Declarations::SubtypeConstraint)
|
|
24
|
+
functions = declarations.grep(Expressir::Model::Declarations::Function)
|
|
25
|
+
procedures = declarations.grep(Expressir::Model::Declarations::Procedure)
|
|
26
|
+
constants = if algorithm_head.is_a?(Hash) && algorithm_head[:constant_decl]
|
|
27
|
+
build_constant_decl(algorithm_head[:constant_decl])
|
|
28
|
+
else
|
|
29
|
+
[]
|
|
30
|
+
end
|
|
31
|
+
variables = if algorithm_head.is_a?(Hash) && algorithm_head[:local_decl]
|
|
32
|
+
build_local_decl(algorithm_head[:local_decl])
|
|
33
|
+
else
|
|
34
|
+
[]
|
|
35
|
+
end
|
|
32
36
|
statements = Builder.build_children(stmts)
|
|
33
37
|
|
|
34
38
|
Expressir::Model::Declarations::Procedure.new(
|
|
@@ -39,8 +43,8 @@ module Expressir
|
|
|
39
43
|
subtype_constraints: subtype_constraints,
|
|
40
44
|
functions: functions,
|
|
41
45
|
procedures: procedures,
|
|
42
|
-
constants:
|
|
43
|
-
variables:
|
|
46
|
+
constants: constants,
|
|
47
|
+
variables: variables,
|
|
44
48
|
statements: statements.compact,
|
|
45
49
|
)
|
|
46
50
|
end
|
|
@@ -57,10 +61,9 @@ module Expressir
|
|
|
57
61
|
end
|
|
58
62
|
|
|
59
63
|
parameters = []
|
|
60
|
-
params_data
|
|
61
|
-
params_data.each do |param|
|
|
64
|
+
Builder.ensure_array(params_data).each do |param|
|
|
62
65
|
result = Builder.build({ procedure_head_parameter: param })
|
|
63
|
-
parameters.concat(
|
|
66
|
+
parameters.concat(Builder.ensure_array(result)) if result
|
|
64
67
|
end
|
|
65
68
|
parameters
|
|
66
69
|
end
|
|
@@ -70,11 +73,9 @@ module Expressir
|
|
|
70
73
|
end
|
|
71
74
|
|
|
72
75
|
def build_local_decl(data)
|
|
73
|
-
Builder.build_children(data[:local_variable])
|
|
76
|
+
Builder.build_children(data[:local_variable])
|
|
74
77
|
end
|
|
75
78
|
end
|
|
76
79
|
end
|
|
77
80
|
end
|
|
78
81
|
end
|
|
79
|
-
|
|
80
|
-
Builder.register(:procedure_decl, Expressir::Express::Builders::ProcedureDeclBuilder.new)
|
|
@@ -1,14 +1,10 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
require_relative "helpers"
|
|
4
|
-
|
|
5
3
|
module Expressir
|
|
6
4
|
module Express
|
|
7
5
|
module Builders
|
|
8
6
|
# Builds qualifier nodes (attribute, group, index qualifiers).
|
|
9
7
|
class QualifierBuilder
|
|
10
|
-
include Helpers
|
|
11
|
-
|
|
12
8
|
def build_redeclared_attribute(ast_data)
|
|
13
9
|
qualified_attr = ast_data[:qualified_attribute]
|
|
14
10
|
if qualified_attr.is_a?(Hash)
|
|
@@ -103,26 +99,3 @@ module Expressir
|
|
|
103
99
|
end
|
|
104
100
|
end
|
|
105
101
|
end
|
|
106
|
-
|
|
107
|
-
builder = Expressir::Express::Builders::QualifierBuilder.new
|
|
108
|
-
|
|
109
|
-
Builder.register(:redeclared_attribute) do |d|
|
|
110
|
-
builder.build_redeclared_attribute(d)
|
|
111
|
-
end
|
|
112
|
-
Builder.register(:referenced_attribute) do |d|
|
|
113
|
-
builder.build_referenced_attribute(d)
|
|
114
|
-
end
|
|
115
|
-
Builder.register(:qualified_attribute) do |d|
|
|
116
|
-
builder.build_qualified_attribute(d)
|
|
117
|
-
end
|
|
118
|
-
Builder.register(:group_qualifier) { |d| builder.build_group_qualifier(d) }
|
|
119
|
-
Builder.register(:attribute_qualifier) do |d|
|
|
120
|
-
builder.build_attribute_qualifier(d)
|
|
121
|
-
end
|
|
122
|
-
Builder.register(:index_qualifier) { |d| builder.build_index_qualifier(d) }
|
|
123
|
-
Builder.register(:index1) { |d| builder.build_index1(d) }
|
|
124
|
-
Builder.register(:index2) { |d| builder.build_index2(d) }
|
|
125
|
-
Builder.register(:index) { |d| builder.build_index(d) }
|
|
126
|
-
Builder.register(:enumeration_reference) do |d|
|
|
127
|
-
builder.build_enumeration_reference(d)
|
|
128
|
-
end
|
|
@@ -1,14 +1,12 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
require_relative "helpers"
|
|
4
|
-
|
|
5
3
|
module Expressir
|
|
6
4
|
module Express
|
|
7
5
|
module Builders
|
|
8
6
|
# Builds reference nodes (attribute_ref, entity_ref, etc.).
|
|
9
7
|
# Returns SimpleReference for all reference types.
|
|
10
8
|
class ReferenceBuilder
|
|
11
|
-
include Helpers
|
|
9
|
+
include ::Expressir::Express::Builders::Helpers
|
|
12
10
|
|
|
13
11
|
def call(ast_data)
|
|
14
12
|
id = extract_id_ref(ast_data)
|
|
@@ -18,10 +16,3 @@ module Expressir
|
|
|
18
16
|
end
|
|
19
17
|
end
|
|
20
18
|
end
|
|
21
|
-
|
|
22
|
-
# Register for all reference types
|
|
23
|
-
%i[attribute_ref constant_ref entity_ref enumeration_ref function_ref
|
|
24
|
-
parameter_ref procedure_ref rule_ref rule_label_ref schema_ref
|
|
25
|
-
subtype_constraint_ref type_label_ref type_ref variable_ref].each do |ref_type|
|
|
26
|
-
Builder.register(ref_type, Expressir::Express::Builders::ReferenceBuilder.new)
|
|
27
|
-
end
|
|
@@ -1,14 +1,10 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
require_relative "helpers"
|
|
4
|
-
|
|
5
3
|
module Expressir
|
|
6
4
|
module Express
|
|
7
5
|
module Builders
|
|
8
6
|
# Builds rule declaration nodes.
|
|
9
7
|
class RuleDeclBuilder
|
|
10
|
-
include Helpers
|
|
11
|
-
|
|
12
8
|
def call(ast_data)
|
|
13
9
|
head = ast_data[:rule_head]
|
|
14
10
|
algorithm_head = ast_data[:algorithm_head]
|
|
@@ -23,28 +19,36 @@ module Expressir
|
|
|
23
19
|
declarations = Builder.build_children(algorithm_head[:declaration])
|
|
24
20
|
end
|
|
25
21
|
|
|
26
|
-
types = declarations.
|
|
27
|
-
entities = declarations.
|
|
28
|
-
subtype_constraints = declarations.
|
|
29
|
-
functions = declarations.
|
|
30
|
-
procedures = declarations.
|
|
31
|
-
constants =
|
|
32
|
-
|
|
22
|
+
types = declarations.grep(Expressir::Model::Declarations::Type)
|
|
23
|
+
entities = declarations.grep(Expressir::Model::Declarations::Entity)
|
|
24
|
+
subtype_constraints = declarations.grep(Expressir::Model::Declarations::SubtypeConstraint)
|
|
25
|
+
functions = declarations.grep(Expressir::Model::Declarations::Function)
|
|
26
|
+
procedures = declarations.grep(Expressir::Model::Declarations::Procedure)
|
|
27
|
+
constants = if algorithm_head.is_a?(Hash) && algorithm_head[:constant_decl]
|
|
28
|
+
build_constant_decl(algorithm_head[:constant_decl])
|
|
29
|
+
else
|
|
30
|
+
[]
|
|
31
|
+
end
|
|
32
|
+
variables = if algorithm_head.is_a?(Hash) && algorithm_head[:local_decl]
|
|
33
|
+
build_local_decl(algorithm_head[:local_decl])
|
|
34
|
+
else
|
|
35
|
+
[]
|
|
36
|
+
end
|
|
33
37
|
statements = Builder.build_children(stmts)
|
|
34
38
|
where_rules = where_clause ? Builder.build({ where_clause: where_clause }) : []
|
|
35
39
|
|
|
36
40
|
Expressir::Model::Declarations::Rule.new(
|
|
37
41
|
id: id,
|
|
38
|
-
applies_to:
|
|
42
|
+
applies_to: Builder.ensure_array(applies_to),
|
|
39
43
|
types: types,
|
|
40
44
|
entities: entities,
|
|
41
45
|
subtype_constraints: subtype_constraints,
|
|
42
46
|
functions: functions,
|
|
43
47
|
procedures: procedures,
|
|
44
|
-
constants:
|
|
45
|
-
variables:
|
|
48
|
+
constants: constants,
|
|
49
|
+
variables: variables,
|
|
46
50
|
statements: statements.compact,
|
|
47
|
-
where_rules: [where_rules].flatten
|
|
51
|
+
where_rules: [where_rules].flatten,
|
|
48
52
|
)
|
|
49
53
|
end
|
|
50
54
|
|
|
@@ -70,7 +74,7 @@ module Expressir
|
|
|
70
74
|
refs << Builder.build({ entity_ref: entity_refs[:entity_ref] })
|
|
71
75
|
end
|
|
72
76
|
if entity_refs[:item]
|
|
73
|
-
|
|
77
|
+
Builder.ensure_array(entity_refs[:item]).each do |item|
|
|
74
78
|
if item[:entity_ref]
|
|
75
79
|
refs << Builder.build({ entity_ref: item[:entity_ref] })
|
|
76
80
|
end
|
|
@@ -85,11 +89,9 @@ module Expressir
|
|
|
85
89
|
end
|
|
86
90
|
|
|
87
91
|
def build_local_decl(data)
|
|
88
|
-
Builder.build_children(data[:local_variable])
|
|
92
|
+
Builder.build_children(data[:local_variable])
|
|
89
93
|
end
|
|
90
94
|
end
|
|
91
95
|
end
|
|
92
96
|
end
|
|
93
97
|
end
|
|
94
|
-
|
|
95
|
-
Builder.register(:rule_decl, Expressir::Express::Builders::RuleDeclBuilder.new)
|
|
@@ -1,7 +1,5 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
require_relative "helpers"
|
|
4
|
-
|
|
5
3
|
module Expressir
|
|
6
4
|
module Express
|
|
7
5
|
module Builders
|
|
@@ -18,5 +16,3 @@ module Expressir
|
|
|
18
16
|
end
|
|
19
17
|
end
|
|
20
18
|
end
|
|
21
|
-
|
|
22
|
-
Builder.register(:schema_body_declaration, Expressir::Express::Builders::SchemaBodyDeclBuilder.new)
|
|
@@ -1,14 +1,10 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
require_relative "helpers"
|
|
4
|
-
|
|
5
3
|
module Expressir
|
|
6
4
|
module Express
|
|
7
5
|
module Builders
|
|
8
6
|
# Builds schema_decl nodes into Schema objects.
|
|
9
7
|
class SchemaDeclBuilder
|
|
10
|
-
include Helpers
|
|
11
|
-
|
|
12
8
|
def call(ast_data)
|
|
13
9
|
id = Builder.build_optional(ast_data[:schema_id])
|
|
14
10
|
version = if ast_data[:schema_version_id]
|
|
@@ -26,18 +22,18 @@ module Expressir
|
|
|
26
22
|
declarations = Builder.build_children(body_decls) if body_decls
|
|
27
23
|
end
|
|
28
24
|
|
|
29
|
-
types = declarations.
|
|
30
|
-
entities = declarations.
|
|
31
|
-
subtype_constraints = declarations.
|
|
32
|
-
functions = declarations.
|
|
33
|
-
rules = declarations.
|
|
34
|
-
procedures = declarations.
|
|
25
|
+
types = declarations.grep(Expressir::Model::Declarations::Type)
|
|
26
|
+
entities = declarations.grep(Expressir::Model::Declarations::Entity)
|
|
27
|
+
subtype_constraints = declarations.grep(Expressir::Model::Declarations::SubtypeConstraint)
|
|
28
|
+
functions = declarations.grep(Expressir::Model::Declarations::Function)
|
|
29
|
+
rules = declarations.grep(Expressir::Model::Declarations::Rule)
|
|
30
|
+
procedures = declarations.grep(Expressir::Model::Declarations::Procedure)
|
|
35
31
|
|
|
36
32
|
Expressir::Model::Declarations::Schema.new(
|
|
37
33
|
id: id,
|
|
38
34
|
version: version,
|
|
39
35
|
interfaces: interfaces.compact,
|
|
40
|
-
constants: [constants].flatten
|
|
36
|
+
constants: [constants].flatten,
|
|
41
37
|
types: types,
|
|
42
38
|
entities: entities,
|
|
43
39
|
subtype_constraints: subtype_constraints,
|
|
@@ -58,5 +54,3 @@ module Expressir
|
|
|
58
54
|
end
|
|
59
55
|
end
|
|
60
56
|
end
|
|
61
|
-
|
|
62
|
-
Builder.register(:schema_decl, Expressir::Express::Builders::SchemaDeclBuilder.new)
|
|
@@ -1,14 +1,10 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
require_relative "helpers"
|
|
4
|
-
|
|
5
3
|
module Expressir
|
|
6
4
|
module Express
|
|
7
5
|
module Builders
|
|
8
6
|
# Builds schema_version_id nodes into SchemaVersion objects.
|
|
9
7
|
class SchemaVersionBuilder
|
|
10
|
-
include Helpers
|
|
11
|
-
|
|
12
8
|
def call(ast_data)
|
|
13
9
|
string_val = Builder.build_optional(ast_data[:string_literal])
|
|
14
10
|
value = string_val.is_a?(Expressir::Model::Literals::String) ? string_val.value : string_val.to_s
|
|
@@ -36,5 +32,3 @@ module Expressir
|
|
|
36
32
|
end
|
|
37
33
|
end
|
|
38
34
|
end
|
|
39
|
-
|
|
40
|
-
Builder.register(:schema_version_id, Expressir::Express::Builders::SchemaVersionBuilder.new)
|