expressir 0.2.8-x64-mingw32 → 0.2.13-x64-mingw32

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 (105) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/release.yml +1 -7
  3. data/exe/format +20 -0
  4. data/expressir.gemspec +3 -2
  5. data/lib/expressir/express_exp/2.4/express_parser.so +0 -0
  6. data/lib/expressir/express_exp/2.5/express_parser.so +0 -0
  7. data/lib/expressir/express_exp/2.6/express_parser.so +0 -0
  8. data/lib/expressir/express_exp/2.7/express_parser.so +0 -0
  9. data/lib/expressir/express_exp/3.0/express_parser.so +0 -0
  10. data/lib/expressir/express_exp/formatter.rb +147 -110
  11. data/lib/expressir/express_exp/hyperlink_formatter.rb +25 -0
  12. data/lib/expressir/express_exp/parser.rb +14 -1
  13. data/lib/expressir/express_exp/schema_head_formatter.rb +14 -0
  14. data/lib/expressir/express_exp/visitor.rb +197 -111
  15. data/lib/expressir/model.rb +3 -1
  16. data/lib/expressir/model/attribute.rb +5 -1
  17. data/lib/expressir/model/constant.rb +5 -1
  18. data/lib/expressir/model/entity.rb +14 -20
  19. data/lib/expressir/model/enumeration_item.rb +5 -1
  20. data/lib/expressir/model/expressions/aggregate_initializer.rb +4 -2
  21. data/lib/expressir/model/expressions/aggregate_item.rb +3 -1
  22. data/lib/expressir/model/expressions/attribute_reference.rb +3 -1
  23. data/lib/expressir/model/expressions/binary_expression.rb +3 -1
  24. data/lib/expressir/model/expressions/call.rb +4 -2
  25. data/lib/expressir/model/expressions/entity_constructor.rb +4 -2
  26. data/lib/expressir/model/expressions/group_reference.rb +3 -1
  27. data/lib/expressir/model/expressions/index_reference.rb +3 -1
  28. data/lib/expressir/model/expressions/interval.rb +3 -1
  29. data/lib/expressir/model/expressions/query_expression.rb +5 -2
  30. data/lib/expressir/model/expressions/simple_reference.rb +3 -1
  31. data/lib/expressir/model/expressions/unary_expression.rb +3 -1
  32. data/lib/expressir/model/function.rb +28 -39
  33. data/lib/expressir/model/identifier.rb +1 -3
  34. data/lib/expressir/model/informal_proposition.rb +15 -0
  35. data/lib/expressir/model/interface.rb +4 -2
  36. data/lib/expressir/model/literals/binary.rb +3 -1
  37. data/lib/expressir/model/literals/integer.rb +3 -1
  38. data/lib/expressir/model/literals/logical.rb +3 -1
  39. data/lib/expressir/model/literals/real.rb +3 -1
  40. data/lib/expressir/model/literals/string.rb +3 -1
  41. data/lib/expressir/model/model_element.rb +140 -0
  42. data/lib/expressir/model/parameter.rb +5 -1
  43. data/lib/expressir/model/procedure.rb +29 -40
  44. data/lib/expressir/model/renamed_ref.rb +3 -1
  45. data/lib/expressir/model/repository.rb +5 -5
  46. data/lib/expressir/model/rule.rb +33 -41
  47. data/lib/expressir/model/schema.rb +44 -46
  48. data/lib/expressir/model/statements/alias.rb +6 -3
  49. data/lib/expressir/model/statements/assignment.rb +3 -1
  50. data/lib/expressir/model/statements/call.rb +4 -2
  51. data/lib/expressir/model/statements/case.rb +4 -2
  52. data/lib/expressir/model/statements/case_action.rb +4 -2
  53. data/lib/expressir/model/statements/compound.rb +4 -2
  54. data/lib/expressir/model/statements/escape.rb +1 -1
  55. data/lib/expressir/model/statements/if.rb +5 -3
  56. data/lib/expressir/model/statements/null.rb +1 -1
  57. data/lib/expressir/model/statements/repeat.rb +6 -3
  58. data/lib/expressir/model/statements/return.rb +3 -1
  59. data/lib/expressir/model/statements/skip.rb +1 -1
  60. data/lib/expressir/model/subtype_constraint.rb +5 -2
  61. data/lib/expressir/model/type.rb +11 -4
  62. data/lib/expressir/model/types/aggregate.rb +5 -1
  63. data/lib/expressir/model/types/array.rb +3 -1
  64. data/lib/expressir/model/types/bag.rb +3 -1
  65. data/lib/expressir/model/types/binary.rb +3 -1
  66. data/lib/expressir/model/types/boolean.rb +1 -1
  67. data/lib/expressir/model/types/enumeration.rb +5 -3
  68. data/lib/expressir/model/types/generic.rb +5 -1
  69. data/lib/expressir/model/types/generic_entity.rb +5 -1
  70. data/lib/expressir/model/types/integer.rb +1 -1
  71. data/lib/expressir/model/types/list.rb +3 -1
  72. data/lib/expressir/model/types/logical.rb +1 -1
  73. data/lib/expressir/model/types/number.rb +1 -1
  74. data/lib/expressir/model/types/real.rb +3 -1
  75. data/lib/expressir/model/types/select.rb +5 -3
  76. data/lib/expressir/model/types/set.rb +3 -1
  77. data/lib/expressir/model/types/string.rb +3 -1
  78. data/lib/expressir/model/unique.rb +6 -2
  79. data/lib/expressir/model/variable.rb +5 -1
  80. data/lib/expressir/model/where.rb +5 -1
  81. data/lib/expressir/version.rb +1 -1
  82. data/original/examples/syntax/hyperlink.exp +8 -0
  83. data/original/examples/syntax/hyperlink_formatted.exp +19 -0
  84. data/original/examples/syntax/remark.exp +63 -20
  85. data/original/examples/syntax/remark_formatted.exp +62 -24
  86. data/original/examples/syntax/simple.exp +3 -0
  87. data/original/examples/syntax/source.exp +16 -0
  88. data/original/examples/syntax/syntax.exp +201 -190
  89. data/original/examples/syntax/syntax_formatted.exp +370 -799
  90. data/spec/expressir/express_exp/{format_remark_spec.rb → formatter/remark_spec.rb} +2 -2
  91. data/spec/expressir/express_exp/{format_syntax_spec.rb → formatter/syntax_spec.rb} +2 -2
  92. data/spec/expressir/express_exp/hyperlink_formatter_spec.rb +24 -0
  93. data/spec/expressir/express_exp/parser/head_source_spec.rb +38 -0
  94. data/spec/expressir/express_exp/parser/multiple_spec.rb +32 -0
  95. data/spec/expressir/express_exp/{parse_remark_spec.rb → parser/remark_spec.rb} +120 -55
  96. data/spec/expressir/express_exp/{source_spec.rb → parser/source_spec.rb} +3 -6
  97. data/spec/expressir/express_exp/parser/syntax_spec.rb +3080 -0
  98. data/spec/expressir/express_exp/schema_head_formatter_spec.rb +36 -0
  99. data/spec/expressir/model/{find_spec.rb → model_element/find_spec.rb} +26 -8
  100. data/spec/expressir/model/model_element/hash_spec.rb +66 -0
  101. metadata +38 -13
  102. data/lib/expressir/model/scope.rb +0 -32
  103. data/spec/expressir/express_exp/ap233_spec.rb +0 -22
  104. data/spec/expressir/express_exp/find_spec.rb +0 -28
  105. data/spec/expressir/express_exp/parse_syntax_spec.rb +0 -3003
@@ -0,0 +1,25 @@
1
+ require "expressir/express_exp/formatter"
2
+
3
+ module Expressir
4
+ module ExpressExp
5
+ class HyperlinkFormatter < Formatter
6
+ def format_expressions_simple_reference(node)
7
+ return node.id if node.parent.is_a? Model::Expressions::AttributeReference
8
+
9
+ # skip hyperlink if target node can't be found
10
+ target_node = node.find(node.id)
11
+ return node.id unless target_node
12
+
13
+ # skip hyperlink for implicit scopes
14
+ return node.id if target_node.is_a? Model::Statements::Alias or target_node.is_a? Model::Statements::Repeat or target_node.is_a? Model::Expressions::QueryExpression
15
+
16
+ # skip hyperlink if this node and target node are in the same main item
17
+ node_path_parts = node.path.split(".")
18
+ target_node_path_parts = target_node.path.split(".")
19
+ return node.id if node_path_parts[0..1] == target_node_path_parts[0..1]
20
+
21
+ "{{{<<express:#{target_node.path},#{node.id}>>}}}"
22
+ end
23
+ end
24
+ end
25
+ end
@@ -9,7 +9,7 @@ require 'expressir/express_exp/visitor'
9
9
  module Expressir
10
10
  module ExpressExp
11
11
  class Parser
12
- def self.from_exp(file)
12
+ def self.from_file(file)
13
13
  input = File.read(file)
14
14
 
15
15
  =begin
@@ -36,6 +36,19 @@ module Expressir
36
36
 
37
37
  repo
38
38
  end
39
+
40
+ def self.from_files(files)
41
+ schemas = files.map{|file| self.from_file(file).schemas}.flatten
42
+
43
+ Model::Repository.new({
44
+ schemas: schemas
45
+ })
46
+ end
47
+
48
+ # deprecated
49
+ def self.from_exp(file)
50
+ self.from_file(file)
51
+ end
39
52
  end
40
53
  end
41
54
  end
@@ -0,0 +1,14 @@
1
+ require "expressir/express_exp/formatter"
2
+
3
+ module Expressir
4
+ module ExpressExp
5
+ class SchemaHeadFormatter < Formatter
6
+ def format_schema(node)
7
+ [
8
+ "SCHEMA #{node.id}#{node.version ? " #{format(node.version)}" : ""};",
9
+ *node.interfaces.map{|x| format(x)}
10
+ ].join("\n")
11
+ end
12
+ end
13
+ end
14
+ end
@@ -5,10 +5,8 @@ rescue LoadError
5
5
  require_relative "express_parser"
6
6
  end
7
7
  require "expressir/model"
8
+ require "set"
8
9
 
9
- # static shorthands are unwrapped
10
- # - entity attributes, function/procedure parameters, local variables
11
- #
12
10
  # reference type is not recognized
13
11
  # see note in A.1.5 Interpreted identifiers
14
12
  # > It is expected that identifiers matching these syntax rules are known to an implementation.
@@ -16,7 +14,7 @@ require "expressir/model"
16
14
  # > method of gaining this information is multi-pass parsing: the first pass collects the identifiers from their
17
15
  # > declarations, so that subsequent passes are then able to distinguish a veriable_ref from a function_ref,
18
16
  # > for example.
19
- #
17
+ # - such multi-pass parsing is not implemented yet
20
18
  # - xxxRef - merged to SimpleReference
21
19
  # - entityConstructor, functionCall - merged to Call
22
20
  #
@@ -25,6 +23,13 @@ require "expressir/model"
25
23
  # > A syntactic construct such as ARRAY[1:3] OF REAL satisfies two syntactic productions —
26
24
  # > aggregation_type and general_aggregation_type. It is considered to be instantiable no matter which
27
25
  # > production it is required to satisfy in the syntax.
26
+ #
27
+ # static shorthands are unwrapped
28
+ # - entity attributes, function/procedure parameters, local variables
29
+ #
30
+ # all access to ctx members must happen before calling other visitor code
31
+ # - prevents segfault in ANTLR4 C++ runtime, not sure why they are caused
32
+ # - e.g. see visit_schema_decl
28
33
 
29
34
  module Expressir
30
35
  module ExpressExp
@@ -33,33 +38,52 @@ module Expressir
33
38
 
34
39
  def initialize(tokens)
35
40
  @tokens = tokens
36
- @attached_remarks = Set.new
41
+ @attached_remark_tokens = ::Set.new
37
42
 
38
43
  super()
39
44
  end
40
45
 
41
46
  def visit(ctx)
42
- result = super(ctx)
43
- attach_source(ctx, result)
44
- attach_parent(ctx, result)
45
- attach_remarks(ctx, result)
46
- result
47
+ node = super(ctx)
48
+ attach_source(ctx, node)
49
+ attach_remarks(ctx, node)
50
+ node
47
51
  end
48
52
 
49
- def visit_if(ctx)
50
- visit(ctx) if ctx
53
+ def visit_if(ctx, default = nil)
54
+ if ctx
55
+ visit(ctx)
56
+ else
57
+ default
58
+ end
51
59
  end
52
60
 
53
61
  def visit_if_map(ctx)
54
- ctx.map{|ctx2| visit(ctx2)} if ctx
62
+ if ctx
63
+ ctx.map{|ctx2| visit(ctx2)}
64
+ else
65
+ []
66
+ end
55
67
  end
56
68
 
57
69
  def visit_if_map_flatten(ctx)
58
- ctx.map{|ctx2| visit(ctx2)}.flatten if ctx
70
+ if ctx
71
+ ctx.map{|ctx2| visit(ctx2)}.flatten
72
+ else
73
+ []
74
+ end
75
+ end
76
+
77
+ def get_tokens_source(tokens)
78
+ if tokens.last.text == '<EOF>'
79
+ tokens.pop
80
+ end
81
+
82
+ tokens.map{|x| x.text}.join('').force_encoding('UTF-8')
59
83
  end
60
84
 
61
85
  def get_tokens(ctx)
62
- start_index, stop_index = if ctx.instance_of? ::ExpressParser::SyntaxContext
86
+ start_index, stop_index = if ctx.is_a? ::ExpressParser::SyntaxContext
63
87
  [0, @tokens.size - 1]
64
88
  else
65
89
  [ctx.start.token_index, ctx.stop.token_index]
@@ -68,66 +92,94 @@ module Expressir
68
92
  @tokens[start_index..stop_index]
69
93
  end
70
94
 
95
+ def get_head_tokens(ctx)
96
+ start_index, stop_index = if ctx.is_a? ::ExpressParser::SchemaDeclContext
97
+ start_index = ctx.start.token_index
98
+ stop_index = if ctx.schema_body.interface_specification.length > 0
99
+ ctx.schema_body.interface_specification.last.stop.token_index
100
+ elsif ctx.schema_version_id
101
+ ctx.schema_version_id.stop.token_index + 1
102
+ else
103
+ ctx.schema_id.stop.token_index + 1
104
+ end
105
+
106
+ [start_index, stop_index]
107
+ end
108
+
109
+ if start_index and stop_index
110
+ @tokens[start_index..stop_index]
111
+ end
112
+ end
113
+
71
114
  def attach_source(ctx, node)
72
115
  if node.class.method_defined? :source
73
- source_tokens = get_tokens(ctx).select{|x| x.text != '<EOF>'}
74
- node.source = source_tokens.map{|x| x.text}.join('').force_encoding('UTF-8')
116
+ tokens = get_tokens(ctx)
117
+ node.source = get_tokens_source(tokens)
75
118
  end
76
- end
77
119
 
78
- def attach_parent(ctx, node)
79
- if node.class.method_defined? :children
80
- node.children.each do |child_node|
81
- if child_node.class.method_defined? :parent
82
- child_node.parent = node
83
- end
84
- end
120
+ if node.class.method_defined? :head_source
121
+ tokens = get_head_tokens(ctx)
122
+ node.head_source = get_tokens_source(tokens)
85
123
  end
86
124
  end
87
125
 
126
+ def find_remark_target(node, path)
127
+ target_node = node.find(path)
128
+ return target_node if target_node
129
+
130
+ # check if path should create implicit informal proposal
131
+ # see https://github.com/lutaml/expressir/issues/50
132
+ rest, _, current_path = path.rpartition(".") # get last path part
133
+ _, _, current_path = current_path.rpartition(":") # ignore prefix
134
+
135
+ # match informal proposition id
136
+ informal_proposition_id = current_path.match(/^IP\d+$/).to_a[0]
137
+ return unless informal_proposition_id
138
+
139
+ # find informal proposition target
140
+ target_node = node.find(rest)
141
+ return unless target_node and target_node.class.method_defined? :informal_propositions
142
+
143
+ # create implicit informal proposition
144
+ informal_proposition = Model::InformalProposition.new({
145
+ id: informal_proposition_id
146
+ })
147
+ target_node.informal_propositions << informal_proposition
148
+ informal_proposition.parent = target_node
149
+ informal_proposition
150
+ end
151
+
88
152
  def attach_remarks(ctx, node)
89
153
  remark_tokens = get_tokens(ctx).select{|x| x.channel == REMARK_CHANNEL}
90
- if remark_tokens
91
- remark_tokens.each do |remark_token|
92
- remark_text = remark_token.text
93
-
94
- # check if it is tagged remark
95
- match = if remark_text.start_with?('--')
96
- remark_text[2..-1].match(/^"([^"]*)"(.*)$/)
97
- elsif remark_text.start_with?('(*') and remark_text.end_with?('*)')
98
- remark_text[2..-3].match(/^"([^"]*)"(.*)$/m)
99
- end
100
- if !match
101
- next
102
- end
103
154
 
104
- # don't attach already attached tagged remark
105
- if @attached_remarks.include? remark_token
106
- next
107
- end
155
+ # skip already attached remarks
156
+ remark_tokens = remark_tokens.select{|x| !@attached_remark_tokens.include?(x)}
108
157
 
109
- # attach tagged remark
110
- remark_tag = match[1]
111
- remark_content = match[2].strip.force_encoding('UTF-8')
158
+ # parse remarks, find remark targets
159
+ tagged_remark_tokens = remark_tokens.map do |remark_token|
160
+ _, remark_tag, remark_text = if remark_token.text.start_with?('--')
161
+ remark_token.text.match(/^--"([^"]*)"(.*)$/).to_a
162
+ else
163
+ remark_token.text.match(/^\(\*"([^"]*)"(.*)\*\)$/m).to_a
164
+ end
112
165
 
113
- target_node = nil
114
- current_node = node
115
- if current_node.class.method_defined? :find
116
- target_node = current_node.find(remark_tag)
117
- end
118
- while !target_node and current_node.class.method_defined? :parent and current_node.parent.class.method_defined? :find
119
- current_node = current_node.parent
120
- target_node = current_node.find(remark_tag)
121
- end
166
+ if remark_tag
167
+ remark_target = find_remark_target(node, remark_tag)
168
+ end
169
+ if remark_text
170
+ remark_text = remark_text.strip.force_encoding('UTF-8')
171
+ end
122
172
 
123
- if target_node
124
- target_node.remarks ||= []
125
- target_node.remarks << remark_content
173
+ [remark_token, remark_target, remark_text]
174
+ end.select{|x| x[1]}
126
175
 
127
- # mark remark as attached, so that it is not attached again at higher nesting level
128
- @attached_remarks << remark_token
129
- end
130
- end
176
+ tagged_remark_tokens.each do |remark_token, remark_target, remark_text|
177
+ # attach remark
178
+ remark_target.remarks ||= []
179
+ remark_target.remarks << remark_text
180
+
181
+ # mark remark as attached, so that it is not attached again at higher nesting level
182
+ @attached_remark_tokens << remark_token
131
183
  end
132
184
  end
133
185
 
@@ -380,8 +432,8 @@ module Expressir
380
432
 
381
433
  bound1 = visit_if(ctx__bound_spec__bound1)
382
434
  bound2 = visit_if(ctx__bound_spec__bound2)
383
- optional = !!ctx__OPTIONAL
384
- unique = !!ctx__UNIQUE
435
+ optional = ctx__OPTIONAL && true
436
+ unique = ctx__UNIQUE && true
385
437
  base_type = visit_if(ctx__instantiable_type)
386
438
 
387
439
  Model::Types::Array.new({
@@ -465,7 +517,7 @@ module Expressir
465
517
  ctx__width_spec__FIXED = ctx__width_spec&.FIXED
466
518
 
467
519
  width = visit_if(ctx__width_spec__width)
468
- fixed = !!ctx__width_spec__FIXED
520
+ fixed = ctx__width_spec__FIXED && true
469
521
 
470
522
  Model::Types::Binary.new({
471
523
  width: width,
@@ -717,16 +769,16 @@ module Expressir
717
769
  ctx__entity_body__where_clause = ctx__entity_body&.where_clause
718
770
 
719
771
  id = visit_if(ctx__entity_head__entity_id)
720
- abstract = !!(ctx__entity_head__subsuper__supertype_constraint__abstract_entity_declaration || ctx__entity_head__subsuper__supertype_constraint__abstract_supertype_declaration)
772
+ abstract = (ctx__entity_head__subsuper__supertype_constraint__abstract_entity_declaration || ctx__entity_head__subsuper__supertype_constraint__abstract_supertype_declaration) && true
721
773
  supertype_expression = visit_if(ctx__entity_head__subsuper__supertype_constraint__abstract_supertype_declaration || ctx__entity_head__subsuper__supertype_constraint__supertype_rule)
722
- subtype_of = visit_if(ctx__entity_head__subsuper__subtype_declaration)
774
+ subtype_of = visit_if(ctx__entity_head__subsuper__subtype_declaration, [])
723
775
  attributes = [
724
776
  *visit_if_map_flatten(ctx__entity_body__explicit_attr),
725
777
  *visit_if(ctx__entity_body__derive_clause),
726
778
  *visit_if(ctx__entity_body__inverse_clause)
727
779
  ]
728
- unique = visit_if(ctx__entity_body__unique_clause)
729
- where = visit_if(ctx__entity_body__where_clause)
780
+ unique = visit_if(ctx__entity_body__unique_clause, [])
781
+ where = visit_if(ctx__entity_body__where_clause, [])
730
782
 
731
783
  Model::Entity.new({
732
784
  id: id,
@@ -799,10 +851,10 @@ module Expressir
799
851
  ctx__enumeration_extension__type_ref = ctx__enumeration_extension&.type_ref
800
852
  ctx__enumeration_extension__enumeration_items = ctx__enumeration_extension&.enumeration_items
801
853
 
802
- extensible = !!ctx__EXTENSIBLE
803
- items = visit_if(ctx__enumeration_items)
854
+ extensible = ctx__EXTENSIBLE && true
855
+ items = visit_if(ctx__enumeration_items, [])
804
856
  extension_type = visit_if(ctx__enumeration_extension__type_ref)
805
- extension_items = visit_if(ctx__enumeration_extension__enumeration_items)
857
+ extension_items = visit_if(ctx__enumeration_extension__enumeration_items, [])
806
858
 
807
859
  Model::Types::Enumeration.new({
808
860
  extensible: extensible,
@@ -822,7 +874,7 @@ module Expressir
822
874
  ctx__parameter_type = ctx.parameter_type
823
875
 
824
876
  attributes = visit_if_map(ctx__attribute_decl)
825
- optional = !!ctx__OPTIONAL
877
+ optional = ctx__OPTIONAL && true
826
878
  type = visit_if(ctx__parameter_type)
827
879
 
828
880
  attributes.map do |attribute|
@@ -896,7 +948,7 @@ module Expressir
896
948
  ctx__actual_parameter_list = ctx.actual_parameter_list
897
949
 
898
950
  ref = visit_if(ctx__built_in_function || ctx__function_ref)
899
- parameters = visit_if(ctx__actual_parameter_list)
951
+ parameters = visit_if(ctx__actual_parameter_list, [])
900
952
 
901
953
  Model::Expressions::Call.new({
902
954
  ref: ref,
@@ -919,15 +971,24 @@ module Expressir
919
971
  parameters = visit_if_map_flatten(ctx__function_head__formal_parameter)
920
972
  return_type = visit_if(ctx__function_head__parameter_type)
921
973
  declarations = visit_if_map(ctx__algorithm_head__declaration)
922
- constants = visit_if(ctx__algorithm_head__constant_decl)
923
- variables = visit_if(ctx__algorithm_head__local_decl)
974
+ types = declarations.select{|x| x.is_a? Model::Type}
975
+ entities = declarations.select{|x| x.is_a? Model::Entity}
976
+ subtype_constraints = declarations.select{|x| x.is_a? Model::SubtypeConstraint}
977
+ functions = declarations.select{|x| x.is_a? Model::Function}
978
+ procedures = declarations.select{|x| x.is_a? Model::Procedure}
979
+ constants = visit_if(ctx__algorithm_head__constant_decl, [])
980
+ variables = visit_if(ctx__algorithm_head__local_decl, [])
924
981
  statements = visit_if_map(ctx__stmt)
925
982
 
926
983
  Model::Function.new({
927
984
  id: id,
928
985
  parameters: parameters,
929
986
  return_type: return_type,
930
- declarations: declarations,
987
+ types: types,
988
+ entities: entities,
989
+ subtype_constraints: subtype_constraints,
990
+ functions: functions,
991
+ procedures: procedures,
931
992
  constants: constants,
932
993
  variables: variables,
933
994
  statements: statements
@@ -972,8 +1033,8 @@ module Expressir
972
1033
 
973
1034
  bound1 = visit_if(ctx__bound_spec__bound1)
974
1035
  bound2 = visit_if(ctx__bound_spec__bound2)
975
- optional = !!ctx__OPTIONAL
976
- unique = !!ctx__UNIQUE
1036
+ optional = ctx__OPTIONAL && true
1037
+ unique = ctx__UNIQUE && true
977
1038
  base_type = visit_if(ctx__parameter_type)
978
1039
 
979
1040
  Model::Types::Array.new({
@@ -1011,7 +1072,7 @@ module Expressir
1011
1072
 
1012
1073
  bound1 = visit_if(ctx__bound_spec__bound1)
1013
1074
  bound2 = visit_if(ctx__bound_spec__bound2)
1014
- unique = !!ctx__UNIQUE
1075
+ unique = ctx__UNIQUE && true
1015
1076
  base_type = visit_if(ctx__parameter_type)
1016
1077
 
1017
1078
  Model::Types::List.new({
@@ -1086,8 +1147,8 @@ module Expressir
1086
1147
  ctx__if_stmt_else_statements = ctx.if_stmt_else_statements
1087
1148
 
1088
1149
  expression = visit_if(ctx__logical_expression)
1089
- statements = visit_if(ctx__if_stmt_statements)
1090
- else_statements = visit_if(ctx__if_stmt_else_statements)
1150
+ statements = visit_if(ctx__if_stmt_statements, [])
1151
+ else_statements = visit_if(ctx__if_stmt_else_statements, [])
1091
1152
 
1092
1153
  Model::Statements::If.new({
1093
1154
  expression: expression,
@@ -1301,7 +1362,7 @@ module Expressir
1301
1362
 
1302
1363
  bound1 = visit_if(ctx__bound_spec__bound1)
1303
1364
  bound2 = visit_if(ctx__bound_spec__bound2)
1304
- unique = !!ctx__UNIQUE
1365
+ unique = ctx__UNIQUE && true
1305
1366
  base_type = visit_if(ctx__instantiable_type)
1306
1367
 
1307
1368
  Model::Types::List.new({
@@ -1517,7 +1578,7 @@ module Expressir
1517
1578
  ctx__actual_parameter_list = ctx.actual_parameter_list
1518
1579
 
1519
1580
  ref = visit_if(ctx__built_in_procedure || ctx__procedure_ref)
1520
- parameters = visit_if(ctx__actual_parameter_list)
1581
+ parameters = visit_if(ctx__actual_parameter_list, [])
1521
1582
 
1522
1583
  Model::Statements::Call.new({
1523
1584
  ref: ref,
@@ -1538,14 +1599,23 @@ module Expressir
1538
1599
  id = visit_if(ctx__procedure_head__procedure_id)
1539
1600
  parameters = visit_if_map_flatten(ctx__procedure_head__procedure_head_parameter)
1540
1601
  declarations = visit_if_map(ctx__algorithm_head__declaration)
1541
- constants = visit_if(ctx__algorithm_head__constant_decl)
1542
- variables = visit_if(ctx__algorithm_head__local_decl)
1602
+ types = declarations.select{|x| x.is_a? Model::Type}
1603
+ entities = declarations.select{|x| x.is_a? Model::Entity}
1604
+ subtype_constraints = declarations.select{|x| x.is_a? Model::SubtypeConstraint}
1605
+ functions = declarations.select{|x| x.is_a? Model::Function}
1606
+ procedures = declarations.select{|x| x.is_a? Model::Procedure}
1607
+ constants = visit_if(ctx__algorithm_head__constant_decl, [])
1608
+ variables = visit_if(ctx__algorithm_head__local_decl, [])
1543
1609
  statements = visit_if_map(ctx__stmt)
1544
1610
 
1545
1611
  Model::Procedure.new({
1546
1612
  id: id,
1547
1613
  parameters: parameters,
1548
- declarations: declarations,
1614
+ types: types,
1615
+ entities: entities,
1616
+ subtype_constraints: subtype_constraints,
1617
+ functions: functions,
1618
+ procedures: procedures,
1549
1619
  constants: constants,
1550
1620
  variables: variables,
1551
1621
  statements: statements
@@ -1771,20 +1841,16 @@ module Expressir
1771
1841
  ctx__resource_ref = ctx.resource_ref
1772
1842
  ctx__rename_id = ctx.rename_id
1773
1843
 
1774
- if ctx__resource_ref
1775
- if ctx__rename_id
1776
- ref = visit(ctx__resource_ref)
1777
- id = visit(ctx__rename_id)
1844
+ ref = visit_if(ctx__resource_ref)
1845
+ id = visit_if(ctx__rename_id)
1778
1846
 
1779
- Model::RenamedRef.new({
1780
- ref: ref,
1781
- id: id
1782
- })
1783
- else
1784
- visit(ctx__resource_ref)
1785
- end
1847
+ if id
1848
+ Model::RenamedRef.new({
1849
+ ref: ref,
1850
+ id: id
1851
+ })
1786
1852
  else
1787
- raise 'Invalid state'
1853
+ ref
1788
1854
  end
1789
1855
  end
1790
1856
 
@@ -1822,15 +1888,24 @@ module Expressir
1822
1888
  id = visit_if(ctx__rule_head__rule_id)
1823
1889
  applies_to = visit_if_map(ctx__rule_head__entity_ref)
1824
1890
  declarations = visit_if_map(ctx__algorithm_head__declaration)
1825
- constants = visit_if(ctx__algorithm_head__constant_decl)
1826
- variables = visit_if(ctx__algorithm_head__local_decl)
1891
+ types = declarations.select{|x| x.is_a? Model::Type}
1892
+ entities = declarations.select{|x| x.is_a? Model::Entity}
1893
+ subtype_constraints = declarations.select{|x| x.is_a? Model::SubtypeConstraint}
1894
+ functions = declarations.select{|x| x.is_a? Model::Function}
1895
+ procedures = declarations.select{|x| x.is_a? Model::Procedure}
1896
+ constants = visit_if(ctx__algorithm_head__constant_decl, [])
1897
+ variables = visit_if(ctx__algorithm_head__local_decl, [])
1827
1898
  statements = visit_if_map(ctx__stmt)
1828
- where = visit_if(ctx__where_clause)
1899
+ where = visit_if(ctx__where_clause, [])
1829
1900
 
1830
1901
  Model::Rule.new({
1831
1902
  id: id,
1832
1903
  applies_to: applies_to,
1833
- declarations: declarations,
1904
+ types: types,
1905
+ entities: entities,
1906
+ subtype_constraints: subtype_constraints,
1907
+ functions: functions,
1908
+ procedures: procedures,
1834
1909
  constants: constants,
1835
1910
  variables: variables,
1836
1911
  statements: statements,
@@ -1876,15 +1951,26 @@ module Expressir
1876
1951
  id = visit_if(ctx__schema_id)
1877
1952
  version = visit_if(ctx__schema_version_id)
1878
1953
  interfaces = visit_if_map(ctx__schema_body__interface_specification)
1879
- constants = visit_if(ctx__schema_body__constant_decl)
1954
+ constants = visit_if(ctx__schema_body__constant_decl, [])
1880
1955
  declarations = visit_if_map(ctx__schema_body__schema_body_declaration)
1956
+ types = declarations.select{|x| x.is_a? Model::Type}
1957
+ entities = declarations.select{|x| x.is_a? Model::Entity}
1958
+ subtype_constraints = declarations.select{|x| x.is_a? Model::SubtypeConstraint}
1959
+ functions = declarations.select{|x| x.is_a? Model::Function}
1960
+ procedures = declarations.select{|x| x.is_a? Model::Procedure}
1961
+ rules = declarations.select{|x| x.is_a? Model::Rule}
1881
1962
 
1882
1963
  Model::Schema.new({
1883
1964
  id: id,
1884
1965
  version: version,
1885
1966
  interfaces: interfaces,
1886
1967
  constants: constants,
1887
- declarations: declarations
1968
+ types: types,
1969
+ entities: entities,
1970
+ subtype_constraints: subtype_constraints,
1971
+ functions: functions,
1972
+ procedures: procedures,
1973
+ rules: rules
1888
1974
  })
1889
1975
  end
1890
1976
 
@@ -1924,11 +2010,11 @@ module Expressir
1924
2010
  ctx__select_extension__type_ref = ctx.select_extension&.type_ref
1925
2011
  ctx__select_extension__select_list = ctx__select_extension&.select_list
1926
2012
 
1927
- extensible = !!ctx__EXTENSIBLE
1928
- generic_entity = !!ctx__GENERIC_ENTITY
1929
- items = visit_if(ctx__select_list)
2013
+ extensible = ctx__EXTENSIBLE && true
2014
+ generic_entity = ctx__GENERIC_ENTITY && true
2015
+ items = visit_if(ctx__select_list, [])
1930
2016
  extension_type = visit_if(ctx__select_extension__type_ref)
1931
- extension_items = visit_if(ctx__select_extension__select_list)
2017
+ extension_items = visit_if(ctx__select_extension__select_list, [])
1932
2018
 
1933
2019
  Model::Types::Select.new({
1934
2020
  extensible: extensible,
@@ -2061,7 +2147,7 @@ module Expressir
2061
2147
  ctx__width_spec__FIXED = ctx__width_spec&.FIXED
2062
2148
 
2063
2149
  width = visit_if(ctx__width_spec__width)
2064
- fixed = !!ctx__width_spec__FIXED
2150
+ fixed = ctx__width_spec__FIXED && true
2065
2151
 
2066
2152
  Model::Types::String.new({
2067
2153
  width: width,
@@ -2094,7 +2180,7 @@ module Expressir
2094
2180
 
2095
2181
  id = visit_if(ctx__subtype_constraint_head__subtype_constraint_id)
2096
2182
  applies_to = visit_if(ctx__subtype_constraint_head__entity_ref)
2097
- abstract = !!ctx__subtype_constraint_body__abstract_supertype
2183
+ abstract = ctx__subtype_constraint_body__abstract_supertype && true
2098
2184
  total_over = visit_if(ctx__subtype_constraint_body__total_over)
2099
2185
  supertype_expression = visit_if(ctx__subtype_constraint_body__supertype_expression)
2100
2186
 
@@ -2230,7 +2316,7 @@ module Expressir
2230
2316
 
2231
2317
  id = visit_if(ctx__type_id)
2232
2318
  type = visit_if(ctx__underlying_type)
2233
- where = visit_if(ctx__where_clause)
2319
+ where = visit_if(ctx__where_clause, [])
2234
2320
 
2235
2321
  Model::Type.new({
2236
2322
  id: id,