expressir 0.2.8-x86-mingw32 → 0.2.13-x86-mingw32

Sign up to get free protection for your applications and to get access to all the features.
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,