expressir 0.2.2 → 0.2.3

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 (86) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/lib/expressir/express_exp/formatter.rb +1444 -0
  4. data/lib/expressir/express_exp/visitor.rb +288 -280
  5. data/lib/expressir/model.rb +13 -42
  6. data/lib/expressir/model/{derived.rb → attribute.rb} +13 -4
  7. data/lib/expressir/model/constant.rb +2 -1
  8. data/lib/expressir/model/entity.rb +22 -17
  9. data/lib/expressir/model/enumeration_item.rb +2 -1
  10. data/lib/expressir/model/expressions/aggregate_initializer.rb +9 -9
  11. data/lib/expressir/model/expressions/aggregate_item.rb +15 -0
  12. data/lib/expressir/model/expressions/{attribute_qualifier.rb → attribute_reference.rb} +3 -1
  13. data/lib/expressir/model/expressions/binary_expression.rb +40 -0
  14. data/lib/expressir/model/expressions/{function_call.rb → call.rb} +3 -3
  15. data/lib/expressir/model/expressions/entity_constructor.rb +11 -11
  16. data/lib/expressir/model/expressions/{group_qualifier.rb → group_reference.rb} +3 -1
  17. data/lib/expressir/model/expressions/{index_qualifier.rb → index_reference.rb} +3 -1
  18. data/lib/expressir/model/expressions/interval.rb +17 -17
  19. data/lib/expressir/model/expressions/query_expression.rb +26 -0
  20. data/lib/expressir/model/expressions/simple_reference.rb +13 -0
  21. data/lib/expressir/model/expressions/{expression.rb → unary_expression.rb} +7 -3
  22. data/lib/expressir/model/function.rb +14 -6
  23. data/lib/expressir/model/{reference.rb → interface.rb} +6 -1
  24. data/lib/expressir/model/literals/logical.rb +4 -0
  25. data/lib/expressir/model/parameter.rb +4 -3
  26. data/lib/expressir/model/procedure.rb +14 -6
  27. data/lib/expressir/model/repository.rb +1 -1
  28. data/lib/expressir/model/rule.rb +16 -8
  29. data/lib/expressir/model/schema.rb +22 -6
  30. data/lib/expressir/model/statements/alias.rb +3 -2
  31. data/lib/expressir/model/statements/{procedure_call.rb → call.rb} +3 -3
  32. data/lib/expressir/model/statements/case.rb +2 -2
  33. data/lib/expressir/model/statements/case_action.rb +2 -2
  34. data/lib/expressir/model/statements/repeat.rb +3 -2
  35. data/lib/expressir/model/subtype_constraint.rb +6 -5
  36. data/lib/expressir/model/type.rb +3 -2
  37. data/lib/expressir/model/types/aggregate.rb +2 -1
  38. data/lib/expressir/model/types/generic.rb +2 -1
  39. data/lib/expressir/model/types/generic_entity.rb +2 -1
  40. data/lib/expressir/model/unique.rb +2 -1
  41. data/lib/expressir/model/{local.rb → variable.rb} +3 -2
  42. data/lib/expressir/model/where.rb +2 -1
  43. data/lib/expressir/version.rb +1 -1
  44. data/original/examples/syntax/remark.exp +126 -108
  45. data/original/examples/syntax/remark_formatted.exp +172 -0
  46. data/original/examples/syntax/syntax.exp +287 -277
  47. data/original/examples/syntax/syntax_formatted.exp +1176 -0
  48. data/spec/expressir/express_exp/format_remark_spec.rb +28 -0
  49. data/spec/expressir/express_exp/format_syntax_spec.rb +28 -0
  50. data/spec/expressir/express_exp/{remark_spec.rb → parse_remark_spec.rb} +80 -36
  51. data/spec/expressir/express_exp/parse_syntax_spec.rb +2998 -0
  52. metadata +22 -46
  53. data/lib/expressir/model/explicit.rb +0 -19
  54. data/lib/expressir/model/expressions/aggregate_element.rb +0 -15
  55. data/lib/expressir/model/expressions/qualified_ref.rb +0 -15
  56. data/lib/expressir/model/expressions/query.rb +0 -25
  57. data/lib/expressir/model/inverse.rb +0 -19
  58. data/lib/expressir/model/operators/addition.rb +0 -8
  59. data/lib/expressir/model/operators/and.rb +0 -8
  60. data/lib/expressir/model/operators/andor.rb +0 -8
  61. data/lib/expressir/model/operators/combine.rb +0 -8
  62. data/lib/expressir/model/operators/equal.rb +0 -8
  63. data/lib/expressir/model/operators/exponentiation.rb +0 -8
  64. data/lib/expressir/model/operators/greater_than.rb +0 -8
  65. data/lib/expressir/model/operators/greater_than_or_equal.rb +0 -8
  66. data/lib/expressir/model/operators/in.rb +0 -8
  67. data/lib/expressir/model/operators/instance_equal.rb +0 -8
  68. data/lib/expressir/model/operators/instance_not_equal.rb +0 -8
  69. data/lib/expressir/model/operators/integer_division.rb +0 -8
  70. data/lib/expressir/model/operators/less_than.rb +0 -8
  71. data/lib/expressir/model/operators/less_than_or_equal.rb +0 -8
  72. data/lib/expressir/model/operators/like.rb +0 -8
  73. data/lib/expressir/model/operators/modulo.rb +0 -8
  74. data/lib/expressir/model/operators/multiplication.rb +0 -8
  75. data/lib/expressir/model/operators/not.rb +0 -8
  76. data/lib/expressir/model/operators/not_equal.rb +0 -8
  77. data/lib/expressir/model/operators/oneof.rb +0 -8
  78. data/lib/expressir/model/operators/or.rb +0 -8
  79. data/lib/expressir/model/operators/real_division.rb +0 -8
  80. data/lib/expressir/model/operators/subtraction.rb +0 -8
  81. data/lib/expressir/model/operators/unary_minus.rb +0 -8
  82. data/lib/expressir/model/operators/unary_plus.rb +0 -8
  83. data/lib/expressir/model/operators/xor.rb +0 -8
  84. data/lib/expressir/model/ref.rb +0 -11
  85. data/lib/expressir/model/use.rb +0 -13
  86. data/spec/expressir/express_exp/syntax_spec.rb +0 -2992
@@ -1,7 +1,8 @@
1
1
  require 'expressir/express_exp/generated/ExpressBaseVisitor'
2
2
  require 'expressir/model'
3
3
 
4
- # issues:
4
+ # static shorthands are unwrapped
5
+ # - entity attributes, function/procedure parameters, local variables
5
6
  #
6
7
  # reference type is not recognized
7
8
  # see note in A.1.5 Interpreted identifiers
@@ -11,8 +12,8 @@ require 'expressir/model'
11
12
  # > declarations, so that subsequent passes are then able to distinguish a veriable_ref from a function_ref,
12
13
  # > for example.
13
14
  #
14
- # - xxxRef - merged to Ref
15
- # - entityConstructor, functionCall, procedureCall
15
+ # - xxxRef - merged to SimpleReference
16
+ # - entityConstructor, functionCall - merged to Call
16
17
  #
17
18
  # difference between generalized and instantiable types is not recognized
18
19
  # see note in 8.6.2 Parameter data types
@@ -32,11 +33,22 @@ module Expressir
32
33
 
33
34
  def visit(ctx)
34
35
  result = super(ctx)
36
+ attach_parent(ctx, result)
35
37
  attach_remarks(ctx, result)
36
38
  result
37
39
  end
38
40
 
39
- def attach_remarks(ctx, item)
41
+ def attach_parent(ctx, node)
42
+ if node.class.method_defined? :children
43
+ node.children.each do |child_node|
44
+ if child_node.class.method_defined? :parent
45
+ child_node.parent = node
46
+ end
47
+ end
48
+ end
49
+ end
50
+
51
+ def attach_remarks(ctx, node)
40
52
  # get remark tokens
41
53
  start_index, stop_index = if ctx.instance_of? Generated::ExpressParser::SyntaxContext
42
54
  [0, @tokens.size - 1]
@@ -66,16 +78,16 @@ module Expressir
66
78
  end
67
79
 
68
80
  # attach tagged remark
69
- remark_tag = match[1]
81
+ remark_tag = match[1].downcase
70
82
  remark_content = match[2].strip
71
83
 
72
- current_item = item
84
+ current_node = node
73
85
  remark_tag.split('.').each do |id|
74
- if current_item
75
- if current_item.class.method_defined? :scope_items
76
- current_item = current_item.scope_items.find{|x| x.id == id}
86
+ if current_node
87
+ if current_node.class.method_defined? :children
88
+ current_node = current_node.children.find{|x| x.id.downcase == id}
77
89
  else
78
- current_item = nil
90
+ current_node = nil
79
91
  break
80
92
  end
81
93
  else
@@ -83,9 +95,9 @@ module Expressir
83
95
  end
84
96
  end
85
97
 
86
- if current_item
87
- current_item.remarks ||= []
88
- current_item.remarks << remark_content
98
+ if current_node
99
+ current_node.remarks ||= []
100
+ current_node.remarks << remark_content
89
101
 
90
102
  # mark remark as attached, so that it is not attached again at higher nesting level
91
103
  @attached_remarks << remark_token
@@ -97,7 +109,7 @@ module Expressir
97
109
  def visitAttributeRef(ctx)
98
110
  id = visit(ctx.attributeId())
99
111
 
100
- Model::Ref.new({
112
+ Model::Expressions::SimpleReference.new({
101
113
  id: id
102
114
  })
103
115
  end
@@ -105,7 +117,7 @@ module Expressir
105
117
  def visitConstantRef(ctx)
106
118
  id = visit(ctx.constantId())
107
119
 
108
- Model::Ref.new({
120
+ Model::Expressions::SimpleReference.new({
109
121
  id: id
110
122
  })
111
123
  end
@@ -113,7 +125,7 @@ module Expressir
113
125
  def visitEntityRef(ctx)
114
126
  id = visit(ctx.entityId())
115
127
 
116
- Model::Ref.new({
128
+ Model::Expressions::SimpleReference.new({
117
129
  id: id
118
130
  })
119
131
  end
@@ -121,7 +133,7 @@ module Expressir
121
133
  def visitEnumerationRef(ctx)
122
134
  id = visit(ctx.enumerationId())
123
135
 
124
- Model::Ref.new({
136
+ Model::Expressions::SimpleReference.new({
125
137
  id: id
126
138
  })
127
139
  end
@@ -129,7 +141,7 @@ module Expressir
129
141
  def visitFunctionRef(ctx)
130
142
  id = visit(ctx.functionId())
131
143
 
132
- Model::Ref.new({
144
+ Model::Expressions::SimpleReference.new({
133
145
  id: id
134
146
  })
135
147
  end
@@ -137,7 +149,7 @@ module Expressir
137
149
  def visitParameterRef(ctx)
138
150
  id = visit(ctx.parameterId())
139
151
 
140
- Model::Ref.new({
152
+ Model::Expressions::SimpleReference.new({
141
153
  id: id
142
154
  })
143
155
  end
@@ -145,7 +157,7 @@ module Expressir
145
157
  def visitProcedureRef(ctx)
146
158
  id = visit(ctx.procedureId())
147
159
 
148
- Model::Ref.new({
160
+ Model::Expressions::SimpleReference.new({
149
161
  id: id
150
162
  })
151
163
  end
@@ -153,7 +165,7 @@ module Expressir
153
165
  def visitRuleLabelRef(ctx)
154
166
  id = visit(ctx.ruleLabelId())
155
167
 
156
- Model::Ref.new({
168
+ Model::Expressions::SimpleReference.new({
157
169
  id: id
158
170
  })
159
171
  end
@@ -161,7 +173,7 @@ module Expressir
161
173
  def visitRuleRef(ctx)
162
174
  id = visit(ctx.ruleId())
163
175
 
164
- Model::Ref.new({
176
+ Model::Expressions::SimpleReference.new({
165
177
  id: id
166
178
  })
167
179
  end
@@ -169,7 +181,7 @@ module Expressir
169
181
  def visitSchemaRef(ctx)
170
182
  id = visit(ctx.schemaId())
171
183
 
172
- Model::Ref.new({
184
+ Model::Expressions::SimpleReference.new({
173
185
  id: id
174
186
  })
175
187
  end
@@ -177,7 +189,7 @@ module Expressir
177
189
  def visitSubtypeConstraintRef(ctx)
178
190
  id = visit(ctx.subtypeConstraintId())
179
191
 
180
- Model::Ref.new({
192
+ Model::Expressions::SimpleReference.new({
181
193
  id: id
182
194
  })
183
195
  end
@@ -185,7 +197,7 @@ module Expressir
185
197
  def visitTypeLabelRef(ctx)
186
198
  id = visit(ctx.typeLabelId())
187
199
 
188
- Model::Ref.new({
200
+ Model::Expressions::SimpleReference.new({
189
201
  id: id
190
202
  })
191
203
  end
@@ -193,7 +205,7 @@ module Expressir
193
205
  def visitTypeRef(ctx)
194
206
  id = visit(ctx.typeId())
195
207
 
196
- Model::Ref.new({
208
+ Model::Expressions::SimpleReference.new({
197
209
  id: id
198
210
  })
199
211
  end
@@ -201,7 +213,7 @@ module Expressir
201
213
  def visitVariableRef(ctx)
202
214
  id = visit(ctx.variableId())
203
215
 
204
- Model::Ref.new({
216
+ Model::Expressions::SimpleReference.new({
205
217
  id: id
206
218
  })
207
219
  end
@@ -224,13 +236,13 @@ module Expressir
224
236
 
225
237
  def visitAddLikeOp(ctx)
226
238
  if ctx.text == '+'
227
- Model::Operators::Addition.new()
239
+ Model::Expressions::BinaryExpression::ADDITION
228
240
  elsif ctx.text == '-'
229
- Model::Operators::Subtraction.new()
241
+ Model::Expressions::BinaryExpression::SUBTRACTION
230
242
  elsif ctx.OR()
231
- Model::Operators::Or.new()
243
+ Model::Expressions::BinaryExpression::OR
232
244
  elsif ctx.XOR()
233
- Model::Operators::Xor.new()
245
+ Model::Expressions::BinaryExpression::XOR
234
246
  else
235
247
  raise 'Invalid state'
236
248
  end
@@ -280,17 +292,7 @@ module Expressir
280
292
 
281
293
  def visitAliasStmt(ctx)
282
294
  id = visit(ctx.variableId())
283
- expression = if ctx.qualifier().length > 0
284
- ref = visit(ctx.generalRef())
285
- qualifiers = ctx.qualifier().map{|ctx| visit(ctx)}
286
-
287
- Model::Expressions::QualifiedRef.new({
288
- ref: ref,
289
- qualifiers: qualifiers
290
- })
291
- else
292
- visit(ctx.generalRef())
293
- end
295
+ expression = handleQualifiedRef(visit(ctx.generalRef()), ctx.qualifier())
294
296
  statements = ctx.stmt().map{|ctx| visit(ctx)}
295
297
 
296
298
  Model::Statements::Alias.new({
@@ -317,20 +319,9 @@ module Expressir
317
319
  end
318
320
 
319
321
  def visitAssignmentStmt(ctx)
322
+ ref = handleQualifiedRef(visit(ctx.generalRef()), ctx.qualifier())
320
323
  expression = visit(ctx.expression())
321
324
 
322
- ref = if ctx.qualifier().length > 0
323
- ref = visit(ctx.generalRef())
324
- qualifiers = ctx.qualifier().map{|ctx| visit(ctx)}
325
-
326
- Model::Expressions::QualifiedRef.new({
327
- ref: ref,
328
- qualifiers: qualifiers
329
- })
330
- else
331
- visit(ctx.generalRef())
332
- end
333
-
334
325
  Model::Statements::Assignment.new({
335
326
  ref: ref,
336
327
  expression: expression
@@ -345,20 +336,16 @@ module Expressir
345
336
  handleSimpleId(ctx.SimpleId())
346
337
  end
347
338
 
348
- def visitAttributeQualifier(ctx)
349
- attribute = visit(ctx.attributeRef())
350
-
351
- Model::Expressions::AttributeQualifier.new({
352
- attribute: attribute
353
- })
339
+ def visitAttributeReference(ctx)
340
+ raise 'Invalid state'
354
341
  end
355
342
 
356
343
  def visitBagType(ctx)
357
- bound1, bound2 = if ctx.boundSpec()
358
- [
359
- visit(ctx.boundSpec().bound1().numericExpression().simpleExpression()),
360
- visit(ctx.boundSpec().bound2().numericExpression().simpleExpression())
361
- ]
344
+ bound1 = if ctx.boundSpec()
345
+ visit(ctx.boundSpec().bound1().numericExpression().simpleExpression())
346
+ end
347
+ bound2 = if ctx.boundSpec()
348
+ visit(ctx.boundSpec().bound2().numericExpression().simpleExpression())
362
349
  end
363
350
  base_type = visit(ctx.instantiableType())
364
351
 
@@ -402,7 +389,7 @@ module Expressir
402
389
  def visitBuiltInConstant(ctx)
403
390
  id = ctx.text
404
391
 
405
- Model::Ref.new({
392
+ Model::Expressions::SimpleReference.new({
406
393
  id: id
407
394
  })
408
395
  end
@@ -410,7 +397,7 @@ module Expressir
410
397
  def visitBuiltInFunction(ctx)
411
398
  id = ctx.text
412
399
 
413
- Model::Ref.new({
400
+ Model::Expressions::SimpleReference.new({
414
401
  id: id
415
402
  })
416
403
  end
@@ -418,21 +405,19 @@ module Expressir
418
405
  def visitBuiltInProcedure(ctx)
419
406
  id = ctx.text
420
407
 
421
- Model::Ref.new({
408
+ Model::Expressions::SimpleReference.new({
422
409
  id: id
423
410
  })
424
411
  end
425
412
 
426
413
  def visitCaseAction(ctx)
427
- expressions = ctx.caseLabel().map{|ctx| visit(ctx.expression())}
414
+ labels = ctx.caseLabel().map{|ctx| visit(ctx.expression())}
428
415
  statement = visit(ctx.stmt())
429
416
 
430
- expressions.map do |expression|
431
- Model::Statements::CaseAction.new({
432
- expression: expression,
433
- statement: statement
434
- })
435
- end
417
+ Model::Statements::CaseAction.new({
418
+ labels: labels,
419
+ statement: statement
420
+ })
436
421
  end
437
422
 
438
423
  def visitCaseLabel(ctx)
@@ -440,14 +425,14 @@ module Expressir
440
425
  end
441
426
 
442
427
  def visitCaseStmt(ctx)
443
- selector = visit(ctx.selector().expression())
428
+ expression = visit(ctx.selector().expression())
444
429
  actions = ctx.caseAction().map{|ctx| visit(ctx)}.flatten
445
430
  otherwise_statement = if ctx.stmt()
446
431
  visit(ctx.stmt())
447
432
  end
448
433
 
449
434
  Model::Statements::Case.new({
450
- selector: selector,
435
+ expression: expression,
451
436
  actions: actions,
452
437
  otherwise_statement: otherwise_statement
453
438
  })
@@ -530,20 +515,21 @@ module Expressir
530
515
  end
531
516
 
532
517
  def visitDerivedAttr(ctx)
518
+ supertype_attribute = if ctx.attributeDecl().redeclaredAttribute() && ctx.attributeDecl().redeclaredAttribute().qualifiedAttribute()
519
+ visit(ctx.attributeDecl().redeclaredAttribute().qualifiedAttribute())
520
+ end
533
521
  id = if ctx.attributeDecl().attributeId()
534
522
  visit(ctx.attributeDecl().attributeId())
535
523
  elsif ctx.attributeDecl().redeclaredAttribute() && ctx.attributeDecl().redeclaredAttribute().attributeId()
536
524
  visit(ctx.attributeDecl().redeclaredAttribute().attributeId())
537
525
  end
538
- supertype_attribute = if ctx.attributeDecl().redeclaredAttribute() && ctx.attributeDecl().redeclaredAttribute().qualifiedAttribute()
539
- visit(ctx.attributeDecl().redeclaredAttribute().qualifiedAttribute())
540
- end
541
526
  type = visit(ctx.parameterType())
542
527
  expression = visit(ctx.expression())
543
528
 
544
- Model::Derived.new({
545
- id: id,
529
+ Model::Attribute.new({
530
+ kind: Model::Attribute::DERIVED,
546
531
  supertype_attribute: supertype_attribute,
532
+ id: id,
547
533
  type: type,
548
534
  expression: expression
549
535
  })
@@ -570,7 +556,7 @@ module Expressir
570
556
  expression = visit(ctx.expression())
571
557
  repetition = visit(ctx.repetition().numericExpression().simpleExpression())
572
558
 
573
- Model::Expressions::AggregateElement.new({
559
+ Model::Expressions::AggregateItem.new({
574
560
  expression: expression,
575
561
  repetition: repetition
576
562
  })
@@ -584,11 +570,11 @@ module Expressir
584
570
  end
585
571
 
586
572
  def visitEntityConstructor(ctx)
587
- entity = visit(ctx.entityRef())
573
+ ref = visit(ctx.entityRef())
588
574
  parameters = ctx.expression().map{|ctx| visit(ctx)}
589
575
 
590
- Model::Expressions::EntityConstructor.new({
591
- entity: entity,
576
+ Model::Expressions::Call.new({
577
+ ref: ref,
592
578
  parameters: parameters
593
579
  })
594
580
  end
@@ -596,26 +582,25 @@ module Expressir
596
582
  def visitEntityDecl(ctx)
597
583
  id = visit(ctx.entityHead().entityId())
598
584
  abstract = if ctx.entityHead().subsuper().supertypeConstraint()
599
- !!ctx.entityHead().subsuper().supertypeConstraint().abstractEntityDeclaration()
600
- end
601
- abstract_supertype = if ctx.entityHead().subsuper().supertypeConstraint()
602
- !!ctx.entityHead().subsuper().supertypeConstraint().abstractSupertypeDeclaration()
585
+ !!ctx.entityHead().subsuper().supertypeConstraint().abstractEntityDeclaration() || !!ctx.entityHead().subsuper().supertypeConstraint().abstractSupertypeDeclaration()
603
586
  end
604
- supertypes = if ctx.entityHead().subsuper().subtypeDeclaration()
605
- ctx.entityHead().subsuper().subtypeDeclaration().entityRef().map{|ctx| visit(ctx)}
606
- end
607
- subtype_expression = if ctx.entityHead().subsuper().supertypeConstraint() && ctx.entityHead().subsuper().supertypeConstraint().abstractSupertypeDeclaration() && ctx.entityHead().subsuper().supertypeConstraint().abstractSupertypeDeclaration().subtypeConstraint()
587
+ supertype_expression = if ctx.entityHead().subsuper().supertypeConstraint() && ctx.entityHead().subsuper().supertypeConstraint().abstractSupertypeDeclaration() && ctx.entityHead().subsuper().supertypeConstraint().abstractSupertypeDeclaration().subtypeConstraint()
608
588
  visit(ctx.entityHead().subsuper().supertypeConstraint().abstractSupertypeDeclaration().subtypeConstraint().supertypeExpression())
609
589
  elsif ctx.entityHead().subsuper().supertypeConstraint() && ctx.entityHead().subsuper().supertypeConstraint().supertypeRule()
610
590
  visit(ctx.entityHead().subsuper().supertypeConstraint().supertypeRule().subtypeConstraint().supertypeExpression())
611
591
  end
612
- explicit = ctx.entityBody().explicitAttr().map{|ctx| visit(ctx)}.flatten
613
- derived = if ctx.entityBody().deriveClause()
614
- ctx.entityBody().deriveClause().derivedAttr().map{|ctx| visit(ctx)}
615
- end
616
- inverse = if ctx.entityBody().inverseClause()
617
- ctx.entityBody().inverseClause().inverseAttr().map{|ctx| visit(ctx)}
592
+ subtype_of = if ctx.entityHead().subsuper().subtypeDeclaration()
593
+ ctx.entityHead().subsuper().subtypeDeclaration().entityRef().map{|ctx| visit(ctx)}
618
594
  end
595
+ attributes = [
596
+ *ctx.entityBody().explicitAttr().map{|ctx| visit(ctx)}.flatten,
597
+ *if ctx.entityBody().deriveClause()
598
+ ctx.entityBody().deriveClause().derivedAttr().map{|ctx| visit(ctx)}
599
+ end,
600
+ *if ctx.entityBody().inverseClause()
601
+ ctx.entityBody().inverseClause().inverseAttr().map{|ctx| visit(ctx)}
602
+ end
603
+ ]
619
604
  unique = if ctx.entityBody().uniqueClause()
620
605
  ctx.entityBody().uniqueClause().uniqueRule().map{|ctx| visit(ctx)}
621
606
  end
@@ -626,12 +611,9 @@ module Expressir
626
611
  Model::Entity.new({
627
612
  id: id,
628
613
  abstract: abstract,
629
- abstract_supertype: abstract_supertype,
630
- supertypes: supertypes,
631
- subtype_expression: subtype_expression,
632
- explicit: explicit,
633
- derived: derived,
634
- inverse: inverse,
614
+ supertype_expression: supertype_expression,
615
+ subtype_of: subtype_of,
616
+ attributes: attributes,
635
617
  unique: unique,
636
618
  where: where
637
619
  })
@@ -661,14 +643,10 @@ module Expressir
661
643
  if ctx.typeRef()
662
644
  ref = visit(ctx.typeRef())
663
645
  attribute = visit(ctx.enumerationRef())
664
- attribute_qualifier = Model::Expressions::AttributeQualifier.new({
665
- attribute: attribute
666
- })
667
- qualifiers = [attribute_qualifier]
668
646
 
669
- Model::Expressions::QualifiedRef.new({
647
+ Model::Expressions::AttributeReference.new({
670
648
  ref: ref,
671
- qualifiers: qualifiers
649
+ attribute: attribute
672
650
  })
673
651
  else
674
652
  visit(ctx.enumerationRef())
@@ -705,17 +683,19 @@ module Expressir
705
683
  type = visit(ctx.parameterType())
706
684
 
707
685
  decls.map do |decl|
686
+ supertype_attribute = if decl.redeclaredAttribute() && decl.redeclaredAttribute().qualifiedAttribute()
687
+ visit(decl.redeclaredAttribute().qualifiedAttribute())
688
+ end
708
689
  id = if decl.attributeId()
709
690
  visit(decl.attributeId())
710
691
  elsif decl.redeclaredAttribute() && decl.redeclaredAttribute().attributeId()
711
692
  visit(decl.redeclaredAttribute().attributeId())
712
693
  end
713
- supertype_attribute = if decl.redeclaredAttribute() && decl.redeclaredAttribute().qualifiedAttribute()
714
- visit(decl.redeclaredAttribute().qualifiedAttribute())
715
- end
716
- Model::Explicit.new({
717
- id: id,
694
+
695
+ Model::Attribute.new({
696
+ kind: Model::Attribute::EXPLICIT,
718
697
  supertype_attribute: supertype_attribute,
698
+ id: id,
719
699
  optional: optional,
720
700
  type: type
721
701
  })
@@ -725,11 +705,13 @@ module Expressir
725
705
  def visitExpression(ctx)
726
706
  if ctx.relOpExtended()
727
707
  operator = visit(ctx.relOpExtended())
728
- operands = ctx.simpleExpression().map{|ctx| visit(ctx)}
708
+ operand1 = visit(ctx.simpleExpression()[0])
709
+ operand2 = visit(ctx.simpleExpression()[1])
729
710
 
730
- Model::Expressions::Expression.new({
711
+ Model::Expressions::BinaryExpression.new({
731
712
  operator: operator,
732
- operands: operands
713
+ operand1: operand1,
714
+ operand2: operand2
733
715
  })
734
716
  else
735
717
  visit(ctx.simpleExpression()[0])
@@ -738,12 +720,14 @@ module Expressir
738
720
 
739
721
  def visitFactor(ctx)
740
722
  if ctx.child_at(1) && ctx.child_at(1).text == '**'
741
- operator = Model::Operators::Exponentiation.new()
742
- operands = ctx.simpleFactor().map{|ctx| visit(ctx)}
723
+ operator = Model::Expressions::BinaryExpression::EXPONENTIATION
724
+ operand1 = visit(ctx.simpleFactor()[0])
725
+ operand2 = visit(ctx.simpleFactor()[1])
743
726
 
744
- Model::Expressions::Expression.new({
727
+ Model::Expressions::BinaryExpression.new({
745
728
  operator: operator,
746
- operands: operands
729
+ operand1: operand1,
730
+ operand2: operand2
747
731
  })
748
732
  else
749
733
  visit(ctx.simpleFactor()[0])
@@ -763,7 +747,7 @@ module Expressir
763
747
  end
764
748
 
765
749
  def visitFunctionCall(ctx)
766
- function = if ctx.builtInFunction()
750
+ ref = if ctx.builtInFunction()
767
751
  visit(ctx.builtInFunction())
768
752
  elsif ctx.functionRef()
769
753
  visit(ctx.functionRef())
@@ -774,8 +758,8 @@ module Expressir
774
758
  ctx.actualParameterList().parameter().map{|ctx| visit(ctx.expression)}
775
759
  end
776
760
 
777
- Model::Expressions::FunctionCall.new({
778
- function: function,
761
+ Model::Expressions::Call.new({
762
+ ref: ref,
779
763
  parameters: parameters
780
764
  })
781
765
  end
@@ -788,7 +772,7 @@ module Expressir
788
772
  constants = if ctx.algorithmHead().constantDecl()
789
773
  ctx.algorithmHead().constantDecl().constantBody().map{|ctx| visit(ctx)}
790
774
  end
791
- locals = if ctx.algorithmHead().localDecl()
775
+ variables = if ctx.algorithmHead().localDecl()
792
776
  ctx.algorithmHead().localDecl().localVariable().map{|ctx| visit(ctx)}.flatten
793
777
  end
794
778
  declarations = ctx.algorithmHead().declaration().map{|ctx| visit(ctx)}
@@ -800,7 +784,7 @@ module Expressir
800
784
  return_type: return_type,
801
785
  declarations: declarations,
802
786
  constants: constants,
803
- locals: locals,
787
+ variables: variables,
804
788
  statements: statements
805
789
  })
806
790
  end
@@ -842,11 +826,11 @@ module Expressir
842
826
  end
843
827
 
844
828
  def visitGeneralArrayType(ctx)
845
- bound1, bound2 = if ctx.boundSpec()
846
- [
847
- visit(ctx.boundSpec().bound1().numericExpression().simpleExpression()),
848
- visit(ctx.boundSpec().bound2().numericExpression().simpleExpression())
849
- ]
829
+ bound1 = if ctx.boundSpec()
830
+ visit(ctx.boundSpec().bound1().numericExpression().simpleExpression())
831
+ end
832
+ bound2 = if ctx.boundSpec()
833
+ visit(ctx.boundSpec().bound2().numericExpression().simpleExpression())
850
834
  end
851
835
  optional = !!ctx.OPTIONAL()
852
836
  unique = !!ctx.UNIQUE()
@@ -862,11 +846,11 @@ module Expressir
862
846
  end
863
847
 
864
848
  def visitGeneralBagType(ctx)
865
- bound1, bound2 = if ctx.boundSpec()
866
- [
867
- visit(ctx.boundSpec().bound1().numericExpression().simpleExpression()),
868
- visit(ctx.boundSpec().bound2().numericExpression().simpleExpression())
869
- ]
849
+ bound1 = if ctx.boundSpec()
850
+ visit(ctx.boundSpec().bound1().numericExpression().simpleExpression())
851
+ end
852
+ bound2 = if ctx.boundSpec()
853
+ visit(ctx.boundSpec().bound2().numericExpression().simpleExpression())
870
854
  end
871
855
  base_type = visit(ctx.parameterType())
872
856
 
@@ -878,11 +862,11 @@ module Expressir
878
862
  end
879
863
 
880
864
  def visitGeneralListType(ctx)
881
- bound1, bound2 = if ctx.boundSpec()
882
- [
883
- visit(ctx.boundSpec().bound1().numericExpression().simpleExpression()),
884
- visit(ctx.boundSpec().bound2().numericExpression().simpleExpression())
885
- ]
865
+ bound1 = if ctx.boundSpec()
866
+ visit(ctx.boundSpec().bound1().numericExpression().simpleExpression())
867
+ end
868
+ bound2 = if ctx.boundSpec()
869
+ visit(ctx.boundSpec().bound2().numericExpression().simpleExpression())
886
870
  end
887
871
  unique = !!ctx.UNIQUE()
888
872
  base_type = visit(ctx.parameterType())
@@ -906,11 +890,11 @@ module Expressir
906
890
  end
907
891
 
908
892
  def visitGeneralSetType(ctx)
909
- bound1, bound2 = if ctx.boundSpec()
910
- [
911
- visit(ctx.boundSpec().bound1().numericExpression().simpleExpression()),
912
- visit(ctx.boundSpec().bound2().numericExpression().simpleExpression())
913
- ]
893
+ bound1 = if ctx.boundSpec()
894
+ visit(ctx.boundSpec().bound1().numericExpression().simpleExpression())
895
+ end
896
+ bound2 = if ctx.boundSpec()
897
+ visit(ctx.boundSpec().bound2().numericExpression().simpleExpression())
914
898
  end
915
899
  base_type = visit(ctx.parameterType())
916
900
 
@@ -941,12 +925,8 @@ module Expressir
941
925
  })
942
926
  end
943
927
 
944
- def visitGroupQualifier(ctx)
945
- entity = visit(ctx.entityRef())
946
-
947
- Model::Expressions::GroupQualifier.new({
948
- entity: entity
949
- })
928
+ def visitGroupReference(ctx)
929
+ raise 'Invalid state'
950
930
  end
951
931
 
952
932
  def visitIfStmt(ctx)
@@ -993,16 +973,8 @@ module Expressir
993
973
  raise 'Invalid state'
994
974
  end
995
975
 
996
- def visitIndexQualifier(ctx)
997
- index1 = visit(ctx.index1().index().numericExpression().simpleExpression())
998
- index2 = if ctx.index2()
999
- visit(ctx.index2().index().numericExpression().simpleExpression())
1000
- end
1001
-
1002
- Model::Expressions::IndexQualifier.new({
1003
- index1: index1,
1004
- index2: index2
1005
- })
976
+ def visitIndexReference(ctx)
977
+ raise 'Invalid state'
1006
978
  end
1007
979
 
1008
980
  def visitInstantiableType(ctx)
@@ -1059,29 +1031,29 @@ module Expressir
1059
1031
 
1060
1032
  def visitIntervalOp(ctx)
1061
1033
  if ctx.text == '<'
1062
- Model::Operators::LessThan.new()
1034
+ Model::Expressions::BinaryExpression::LESS_THAN
1063
1035
  elsif ctx.text == '<='
1064
- Model::Operators::LessThanOrEqual.new()
1036
+ Model::Expressions::BinaryExpression::LESS_THAN_OR_EQUAL
1065
1037
  else
1066
1038
  raise 'Invalid state'
1067
1039
  end
1068
1040
  end
1069
1041
 
1070
1042
  def visitInverseAttr(ctx)
1043
+ supertype_attribute = if ctx.attributeDecl().redeclaredAttribute() && ctx.attributeDecl().redeclaredAttribute().qualifiedAttribute()
1044
+ visit(ctx.attributeDecl().redeclaredAttribute().qualifiedAttribute())
1045
+ end
1071
1046
  id = if ctx.attributeDecl().attributeId()
1072
1047
  visit(ctx.attributeDecl().attributeId())
1073
1048
  elsif ctx.attributeDecl().redeclaredAttribute() && ctx.attributeDecl().redeclaredAttribute().attributeId()
1074
1049
  visit(ctx.attributeDecl().redeclaredAttribute().attributeId())
1075
1050
  end
1076
- supertype_attribute = if ctx.attributeDecl().redeclaredAttribute() && ctx.attributeDecl().redeclaredAttribute().qualifiedAttribute()
1077
- visit(ctx.attributeDecl().redeclaredAttribute().qualifiedAttribute())
1078
- end
1079
1051
  type = if ctx.SET()
1080
- bound1, bound2 = if ctx.boundSpec()
1081
- [
1082
- visit(ctx.boundSpec().bound1().numericExpression().simpleExpression()),
1083
- visit(ctx.boundSpec().bound2().numericExpression().simpleExpression())
1084
- ]
1052
+ bound1 = if ctx.boundSpec()
1053
+ visit(ctx.boundSpec().bound1().numericExpression().simpleExpression())
1054
+ end
1055
+ bound2 = if ctx.boundSpec()
1056
+ visit(ctx.boundSpec().bound2().numericExpression().simpleExpression())
1085
1057
  end
1086
1058
  base_type = visit(ctx.entityRef()[0])
1087
1059
 
@@ -1091,11 +1063,11 @@ module Expressir
1091
1063
  base_type: base_type
1092
1064
  })
1093
1065
  elsif ctx.BAG()
1094
- bound1, bound2 = if ctx.boundSpec()
1095
- [
1096
- visit(ctx.boundSpec().bound1().numericExpression().simpleExpression()),
1097
- visit(ctx.boundSpec().bound2().numericExpression().simpleExpression())
1098
- ]
1066
+ bound1 = if ctx.boundSpec()
1067
+ visit(ctx.boundSpec().bound1().numericExpression().simpleExpression())
1068
+ end
1069
+ bound2 = if ctx.boundSpec()
1070
+ visit(ctx.boundSpec().bound2().numericExpression().simpleExpression())
1099
1071
  end
1100
1072
  base_type = visit(ctx.entityRef()[0])
1101
1073
 
@@ -1107,27 +1079,24 @@ module Expressir
1107
1079
  else
1108
1080
  visit(ctx.entityRef()[0])
1109
1081
  end
1110
- attribute = if ctx.entityRef()[1]
1082
+ expression = if ctx.entityRef()[1]
1111
1083
  ref = visit(ctx.entityRef()[1])
1112
1084
  attribute = visit(ctx.attributeRef())
1113
- attribute_qualifier = Model::Expressions::AttributeQualifier.new({
1114
- attribute: attribute
1115
- })
1116
- qualifiers = [attribute_qualifier]
1117
1085
 
1118
- Model::Expressions::QualifiedRef.new({
1086
+ Model::Expressions::AttributeReference.new({
1119
1087
  ref: ref,
1120
- qualifiers: qualifiers
1088
+ attribute: attribute
1121
1089
  })
1122
1090
  else
1123
1091
  visit(ctx.attributeRef())
1124
1092
  end
1125
1093
 
1126
- Model::Inverse.new({
1127
- id: id,
1094
+ Model::Attribute.new({
1095
+ kind: Model::Attribute::INVERSE,
1128
1096
  supertype_attribute: supertype_attribute,
1097
+ id: id,
1129
1098
  type: type,
1130
- attribute: attribute
1099
+ expression: expression
1131
1100
  })
1132
1101
  end
1133
1102
 
@@ -1136,11 +1105,11 @@ module Expressir
1136
1105
  end
1137
1106
 
1138
1107
  def visitListType(ctx)
1139
- bound1, bound2 = if ctx.boundSpec()
1140
- [
1141
- visit(ctx.boundSpec().bound1().numericExpression().simpleExpression()),
1142
- visit(ctx.boundSpec().bound2().numericExpression().simpleExpression())
1143
- ]
1108
+ bound1 = if ctx.boundSpec()
1109
+ visit(ctx.boundSpec().bound1().numericExpression().simpleExpression())
1110
+ end
1111
+ bound2 = if ctx.boundSpec()
1112
+ visit(ctx.boundSpec().bound2().numericExpression().simpleExpression())
1144
1113
  end
1145
1114
  unique = !!ctx.UNIQUE()
1146
1115
  base_type = visit(ctx.instantiableType())
@@ -1181,7 +1150,7 @@ module Expressir
1181
1150
  end
1182
1151
 
1183
1152
  ids.map do |id|
1184
- Model::Local.new({
1153
+ Model::Variable.new({
1185
1154
  id: id,
1186
1155
  type: type,
1187
1156
  expression: expression
@@ -1195,11 +1164,11 @@ module Expressir
1195
1164
 
1196
1165
  def visitLogicalLiteral(ctx)
1197
1166
  value = if ctx.TRUE()
1198
- true
1167
+ Model::Literals::Logical::TRUE
1199
1168
  elsif ctx.FALSE()
1200
- false
1169
+ Model::Literals::Logical::FALSE
1201
1170
  elsif ctx.UNKNOWN()
1202
- nil
1171
+ Model::Literals::Logical::UNKNOWN
1203
1172
  else
1204
1173
  raise 'Invalid state'
1205
1174
  end
@@ -1215,17 +1184,17 @@ module Expressir
1215
1184
 
1216
1185
  def visitMultiplicationLikeOp(ctx)
1217
1186
  if ctx.text == '*'
1218
- Model::Operators::Multiplication.new()
1187
+ Model::Expressions::BinaryExpression::MULTIPLICATION
1219
1188
  elsif ctx.text == '/'
1220
- Model::Operators::RealDivision.new()
1189
+ Model::Expressions::BinaryExpression::REAL_DIVISION
1221
1190
  elsif ctx.DIV()
1222
- Model::Operators::IntegerDivision.new()
1191
+ Model::Expressions::BinaryExpression::INTEGER_DIVISION
1223
1192
  elsif ctx.MOD()
1224
- Model::Operators::Modulo.new()
1193
+ Model::Expressions::BinaryExpression::MODULO
1225
1194
  elsif ctx.AND()
1226
- Model::Operators::And.new()
1195
+ Model::Expressions::BinaryExpression::AND
1227
1196
  elsif ctx.text == '||'
1228
- Model::Operators::Combine.new()
1197
+ Model::Expressions::BinaryExpression::COMBINE
1229
1198
  else
1230
1199
  raise 'Invalid state'
1231
1200
  end
@@ -1272,12 +1241,12 @@ module Expressir
1272
1241
  end
1273
1242
 
1274
1243
  def visitOneOf(ctx)
1275
- operator = Model::Operators::Oneof.new()
1276
- operands = ctx.supertypeExpression().map{|ctx| visit(ctx)}
1244
+ ref = Model::Expressions::SimpleReference.new({ id: 'ONEOF' })
1245
+ parameters = ctx.supertypeExpression().map{|ctx| visit(ctx)}
1277
1246
 
1278
- Model::Expressions::Expression.new({
1279
- operator: operator,
1280
- operands: operands
1247
+ Model::Expressions::Call.new({
1248
+ ref: ref,
1249
+ parameters: parameters
1281
1250
  })
1282
1251
  end
1283
1252
 
@@ -1313,14 +1282,14 @@ module Expressir
1313
1282
  if ctx.literal()
1314
1283
  visit(ctx.literal())
1315
1284
  elsif ctx.qualifiableFactor()
1316
- visit(ctx.qualifiableFactor())
1285
+ handleQualifiedRef(visit(ctx.qualifiableFactor()), ctx.qualifier())
1317
1286
  else
1318
1287
  raise 'Invalid state'
1319
1288
  end
1320
1289
  end
1321
1290
 
1322
1291
  def visitProcedureCallStmt(ctx)
1323
- procedure = if ctx.builtInProcedure()
1292
+ ref = if ctx.builtInProcedure()
1324
1293
  visit(ctx.builtInProcedure())
1325
1294
  elsif ctx.procedureRef()
1326
1295
  visit(ctx.procedureRef())
@@ -1331,8 +1300,8 @@ module Expressir
1331
1300
  ctx.actualParameterList().parameter().map{|ctx| visit(ctx.expression)}
1332
1301
  end
1333
1302
 
1334
- Model::Statements::ProcedureCall.new({
1335
- procedure: procedure,
1303
+ Model::Statements::Call.new({
1304
+ ref: ref,
1336
1305
  parameters: parameters
1337
1306
  })
1338
1307
  end
@@ -1346,9 +1315,9 @@ module Expressir
1346
1315
  if var.text == 'VAR'
1347
1316
  parameters.map do |parameter|
1348
1317
  Model::Parameter.new({
1318
+ var: true,
1349
1319
  id: parameter.id,
1350
- type: parameter.type,
1351
- var: true
1320
+ type: parameter.type
1352
1321
  })
1353
1322
  end
1354
1323
  else
@@ -1359,7 +1328,7 @@ module Expressir
1359
1328
  constants = if ctx.algorithmHead().constantDecl()
1360
1329
  ctx.algorithmHead().constantDecl().constantBody().map{|ctx| visit(ctx)}
1361
1330
  end
1362
- locals = if ctx.algorithmHead().localDecl()
1331
+ variables = if ctx.algorithmHead().localDecl()
1363
1332
  ctx.algorithmHead().localDecl().localVariable().map{|ctx| visit(ctx)}.flatten
1364
1333
  end
1365
1334
  statements = ctx.stmt().map{|ctx| visit(ctx)}
@@ -1369,7 +1338,7 @@ module Expressir
1369
1338
  parameters: parameters,
1370
1339
  declarations: declarations,
1371
1340
  constants: constants,
1372
- locals: locals,
1341
+ variables: variables,
1373
1342
  statements: statements
1374
1343
  })
1375
1344
  end
@@ -1400,18 +1369,17 @@ module Expressir
1400
1369
 
1401
1370
  def visitQualifiedAttribute(ctx)
1402
1371
  id = ctx.SELF().text
1403
-
1404
- ref = Model::Ref.new({
1405
- id: id
1406
- })
1407
-
1408
- group_qualifier = visit(ctx.groupQualifier())
1409
- attribute_qualifier = visit(ctx.attributeQualifier())
1410
- qualifiers = [group_qualifier, attribute_qualifier]
1411
-
1412
- Model::Expressions::QualifiedRef.new({
1413
- ref: ref,
1414
- qualifiers: qualifiers
1372
+ entity = visit(ctx.groupQualifier().entityRef())
1373
+ attribute = visit(ctx.attributeQualifier().attributeRef())
1374
+
1375
+ Model::Expressions::AttributeReference.new({
1376
+ ref: Model::Expressions::GroupReference.new({
1377
+ ref: Model::Expressions::SimpleReference.new({
1378
+ id: id
1379
+ }),
1380
+ entity: entity
1381
+ }),
1382
+ attribute: attribute
1415
1383
  })
1416
1384
  end
1417
1385
 
@@ -1432,7 +1400,7 @@ module Expressir
1432
1400
  source = visit(ctx.aggregateSource().simpleExpression())
1433
1401
  expression = visit(ctx.logicalExpression().expression())
1434
1402
 
1435
- Model::Expressions::Query.new({
1403
+ Model::Expressions::QueryExpression.new({
1436
1404
  id: id,
1437
1405
  source: source,
1438
1406
  expression: expression
@@ -1467,7 +1435,8 @@ module Expressir
1467
1435
  schema = visit(ctx.schemaRef())
1468
1436
  items = ctx.resourceOrRename().map{|ctx| visit(ctx)}
1469
1437
 
1470
- Model::Reference.new({
1438
+ Model::Interface.new({
1439
+ kind: Model::Interface::REFERENCE,
1471
1440
  schema: schema,
1472
1441
  items: items
1473
1442
  })
@@ -1475,21 +1444,21 @@ module Expressir
1475
1444
 
1476
1445
  def visitRelOp(ctx)
1477
1446
  if ctx.text == '<'
1478
- Model::Operators::LessThan.new()
1447
+ Model::Expressions::BinaryExpression::LESS_THAN
1479
1448
  elsif ctx.text == '>'
1480
- Model::Operators::GreaterThan.new()
1449
+ Model::Expressions::BinaryExpression::GREATER_THAN
1481
1450
  elsif ctx.text == '<='
1482
- Model::Operators::LessThanOrEqual.new()
1451
+ Model::Expressions::BinaryExpression::LESS_THAN_OR_EQUAL
1483
1452
  elsif ctx.text == '>='
1484
- Model::Operators::GreaterThanOrEqual.new()
1453
+ Model::Expressions::BinaryExpression::GREATER_THAN_OR_EQUAL
1485
1454
  elsif ctx.text == '<>'
1486
- Model::Operators::NotEqual.new()
1455
+ Model::Expressions::BinaryExpression::NOT_EQUAL
1487
1456
  elsif ctx.text == '='
1488
- Model::Operators::Equal.new()
1457
+ Model::Expressions::BinaryExpression::EQUAL
1489
1458
  elsif ctx.text == ':<>:'
1490
- Model::Operators::InstanceNotEqual.new()
1459
+ Model::Expressions::BinaryExpression::INSTANCE_NOT_EQUAL
1491
1460
  elsif ctx.text == ':=:'
1492
- Model::Operators::InstanceEqual.new()
1461
+ Model::Expressions::BinaryExpression::INSTANCE_EQUAL
1493
1462
  else
1494
1463
  raise 'Invalid state'
1495
1464
  end
@@ -1499,9 +1468,9 @@ module Expressir
1499
1468
  if ctx.relOp()
1500
1469
  visit(ctx.relOp())
1501
1470
  elsif ctx.IN()
1502
- Model::Operators::In.new()
1471
+ Model::Expressions::BinaryExpression::IN
1503
1472
  elsif ctx.LIKE()
1504
- Model::Operators::Like.new()
1473
+ Model::Expressions::BinaryExpression::LIKE
1505
1474
  else
1506
1475
  raise 'Invalid state'
1507
1476
  end
@@ -1531,11 +1500,11 @@ module Expressir
1531
1500
  id = if ctx.repeatControl().incrementControl()
1532
1501
  visit(ctx.repeatControl().incrementControl().variableId())
1533
1502
  end
1534
- bound1, bound2 = if ctx.repeatControl().incrementControl()
1535
- [
1536
- visit(ctx.repeatControl().incrementControl().bound1().numericExpression().simpleExpression()),
1537
- visit(ctx.repeatControl().incrementControl().bound2().numericExpression().simpleExpression())
1538
- ]
1503
+ bound1 = if ctx.repeatControl().incrementControl()
1504
+ visit(ctx.repeatControl().incrementControl().bound1().numericExpression().simpleExpression())
1505
+ end
1506
+ bound2 = if ctx.repeatControl().incrementControl()
1507
+ visit(ctx.repeatControl().incrementControl().bound2().numericExpression().simpleExpression())
1539
1508
  end
1540
1509
  increment = if ctx.repeatControl().incrementControl() && ctx.repeatControl().incrementControl().increment()
1541
1510
  visit(ctx.repeatControl().incrementControl().increment().numericExpression().simpleExpression())
@@ -1594,7 +1563,9 @@ module Expressir
1594
1563
  end
1595
1564
 
1596
1565
  def visitReturnStmt(ctx)
1597
- expression = visit(ctx.expression())
1566
+ expression = if ctx.expression()
1567
+ visit(ctx.expression())
1568
+ end
1598
1569
 
1599
1570
  Model::Statements::Return.new({
1600
1571
  expression: expression
@@ -1608,20 +1579,20 @@ module Expressir
1608
1579
  constants = if ctx.algorithmHead().constantDecl()
1609
1580
  ctx.algorithmHead().constantDecl().constantBody().map{|ctx| visit(ctx)}
1610
1581
  end
1611
- locals = if ctx.algorithmHead().localDecl()
1582
+ variables = if ctx.algorithmHead().localDecl()
1612
1583
  ctx.algorithmHead().localDecl().localVariable().map{|ctx| visit(ctx)}.flatten
1613
1584
  end
1614
- where = ctx.whereClause().domainRule().map{|ctx| visit(ctx)}
1615
1585
  statements = ctx.stmt().map{|ctx| visit(ctx)}
1586
+ where = ctx.whereClause().domainRule().map{|ctx| visit(ctx)}
1616
1587
 
1617
1588
  Model::Rule.new({
1618
1589
  id: id,
1619
1590
  applies_to: applies_to,
1620
1591
  declarations: declarations,
1621
1592
  constants: constants,
1622
- locals: locals,
1623
- where: where,
1624
- statements: statements
1593
+ variables: variables,
1594
+ statements: statements,
1595
+ where: where
1625
1596
  })
1626
1597
  end
1627
1598
 
@@ -1650,16 +1621,17 @@ module Expressir
1650
1621
  constants = if ctx.schemaBody().constantDecl()
1651
1622
  ctx.schemaBody().constantDecl().constantBody().map{|ctx| visit(ctx)}
1652
1623
  end
1653
- declarations = ctx.schemaBody().declaration().map{|ctx| visit(ctx)}
1654
- rules = ctx.schemaBody().ruleDecl().map{|ctx| visit(ctx)}
1624
+ declarations = [
1625
+ *ctx.schemaBody().declaration().map{|ctx| visit(ctx)},
1626
+ *ctx.schemaBody().ruleDecl().map{|ctx| visit(ctx)}
1627
+ ]
1655
1628
 
1656
1629
  Model::Schema.new({
1657
1630
  id: id,
1658
1631
  version: version,
1659
1632
  interfaces: interfaces,
1660
1633
  constants: constants,
1661
- declarations: declarations,
1662
- rules: rules
1634
+ declarations: declarations
1663
1635
  })
1664
1636
  end
1665
1637
 
@@ -1706,11 +1678,11 @@ module Expressir
1706
1678
  end
1707
1679
 
1708
1680
  def visitSetType(ctx)
1709
- bound1, bound2 = if ctx.boundSpec()
1710
- [
1711
- visit(ctx.boundSpec().bound1().numericExpression().simpleExpression()),
1712
- visit(ctx.boundSpec().bound2().numericExpression().simpleExpression())
1713
- ]
1681
+ bound1 = if ctx.boundSpec()
1682
+ visit(ctx.boundSpec().bound1().numericExpression().simpleExpression())
1683
+ end
1684
+ bound2 = if ctx.boundSpec()
1685
+ visit(ctx.boundSpec().bound2().numericExpression().simpleExpression())
1714
1686
  end
1715
1687
  base_type = visit(ctx.instantiableType())
1716
1688
 
@@ -1751,17 +1723,17 @@ module Expressir
1751
1723
  operator = visit(ctx.unaryOp())
1752
1724
  operand = visit(ctx.expression())
1753
1725
 
1754
- Model::Expressions::Expression.new({
1726
+ Model::Expressions::UnaryExpression.new({
1755
1727
  operator: operator,
1756
- operands: [operand]
1728
+ operand: operand
1757
1729
  })
1758
1730
  elsif ctx.unaryOp() && ctx.primary()
1759
1731
  operator = visit(ctx.unaryOp())
1760
1732
  operand = visit(ctx.primary())
1761
1733
 
1762
- Model::Expressions::Expression.new({
1734
+ Model::Expressions::UnaryExpression.new({
1763
1735
  operator: operator,
1764
- operands: [operand]
1736
+ operand: operand
1765
1737
  })
1766
1738
  else
1767
1739
  raise 'Invalid state'
@@ -1859,20 +1831,20 @@ module Expressir
1859
1831
  def visitSubtypeConstraintDecl(ctx)
1860
1832
  id = visit(ctx.subtypeConstraintHead().subtypeConstraintId())
1861
1833
  applies_to = visit(ctx.subtypeConstraintHead().entityRef())
1862
- abstract_supertype = !!ctx.subtypeConstraintBody().abstractSupertype()
1834
+ abstract = !!ctx.subtypeConstraintBody().abstractSupertype()
1863
1835
  total_over = if ctx.subtypeConstraintBody().totalOver()
1864
1836
  ctx.subtypeConstraintBody().totalOver().entityRef().map{|ctx| visit(ctx)}
1865
1837
  end
1866
- subtype_expression = if ctx.subtypeConstraintBody().supertypeExpression()
1838
+ supertype_expression = if ctx.subtypeConstraintBody().supertypeExpression()
1867
1839
  visit(ctx.subtypeConstraintBody().supertypeExpression())
1868
1840
  end
1869
1841
 
1870
1842
  Model::SubtypeConstraint.new({
1871
1843
  id: id,
1872
1844
  applies_to: applies_to,
1873
- abstract_supertype: abstract_supertype,
1845
+ abstract: abstract,
1874
1846
  total_over: total_over,
1875
- subtype_expression: subtype_expression
1847
+ supertype_expression: supertype_expression
1876
1848
  })
1877
1849
  end
1878
1850
 
@@ -1895,7 +1867,7 @@ module Expressir
1895
1867
  def visitSupertypeExpression(ctx)
1896
1868
  if ctx.supertypeFactor().length >= 2
1897
1869
  operands = ctx.supertypeFactor().map{|ctx| visit(ctx)}
1898
- operators = ctx.ANDOR().map{|ctx| Model::Operators::Andor.new()}
1870
+ operators = ctx.ANDOR().map{|ctx| Model::Expressions::BinaryExpression::ANDOR}
1899
1871
 
1900
1872
  handleBinaryExpression(operands, operators)
1901
1873
  else
@@ -1906,7 +1878,7 @@ module Expressir
1906
1878
  def visitSupertypeFactor(ctx)
1907
1879
  if ctx.supertypeTerm().length >= 2
1908
1880
  operands = ctx.supertypeTerm().map{|ctx| visit(ctx)}
1909
- operators = ctx.AND().map{|ctx| Model::Operators::And.new()}
1881
+ operators = ctx.AND().map{|ctx| Model::Expressions::BinaryExpression::AND}
1910
1882
 
1911
1883
  handleBinaryExpression(operands, operators)
1912
1884
  else
@@ -1987,11 +1959,11 @@ module Expressir
1987
1959
 
1988
1960
  def visitUnaryOp(ctx)
1989
1961
  if ctx.text == '+'
1990
- Model::Operators::UnaryPlus.new()
1962
+ Model::Expressions::UnaryExpression::PLUS
1991
1963
  elsif ctx.text == '-'
1992
- Model::Operators::UnaryMinus.new()
1964
+ Model::Expressions::UnaryExpression::MINUS
1993
1965
  elsif ctx.NOT()
1994
- Model::Operators::Not.new()
1966
+ Model::Expressions::UnaryExpression::NOT
1995
1967
  else
1996
1968
  raise 'Invalid state'
1997
1969
  end
@@ -2031,7 +2003,8 @@ module Expressir
2031
2003
  schema = visit(ctx.schemaRef())
2032
2004
  items = ctx.namedTypeOrRename().map{|ctx| visit(ctx)}
2033
2005
 
2034
- Model::Use.new({
2006
+ Model::Interface.new({
2007
+ kind: Model::Interface::USE,
2035
2008
  schema: schema,
2036
2009
  items: items
2037
2010
  })
@@ -2072,19 +2045,54 @@ module Expressir
2072
2045
  raise 'Invalid state'
2073
2046
  end
2074
2047
 
2075
- expression = Model::Expressions::Expression.new({
2048
+ expression = Model::Expressions::BinaryExpression.new({
2076
2049
  operator: operators[0],
2077
- operands: [operands[0], operands[1]]
2050
+ operand1: operands[0],
2051
+ operand2: operands[1]
2078
2052
  })
2079
2053
  operators[1..(operators.length - 1)].each_with_index do |operator, i|
2080
- expression = Model::Expressions::Expression.new({
2054
+ expression = Model::Expressions::BinaryExpression.new({
2081
2055
  operator: operator,
2082
- operands: [expression, operands[i + 2]]
2056
+ operand1: expression,
2057
+ operand2: operands[i + 2]
2083
2058
  })
2084
2059
  end
2085
2060
  expression
2086
2061
  end
2087
2062
 
2063
+ def handleQualifiedRef(ref, qualifiers)
2064
+ qualifiers.reduce(ref) do |ref, ctx|
2065
+ if ctx.attributeQualifier()
2066
+ attribute = visit(ctx.attributeQualifier().attributeRef())
2067
+
2068
+ Model::Expressions::AttributeReference.new({
2069
+ ref: ref,
2070
+ attribute: attribute
2071
+ })
2072
+ elsif ctx.groupQualifier()
2073
+ entity = visit(ctx.groupQualifier().entityRef())
2074
+
2075
+ Model::Expressions::GroupReference.new({
2076
+ ref: ref,
2077
+ entity: entity
2078
+ })
2079
+ elsif ctx.indexQualifier()
2080
+ index1 = visit(ctx.indexQualifier().index1().index().numericExpression().simpleExpression())
2081
+ index2 = if ctx.indexQualifier().index2()
2082
+ visit(ctx.indexQualifier().index2().index().numericExpression().simpleExpression())
2083
+ end
2084
+
2085
+ Model::Expressions::IndexReference.new({
2086
+ ref: ref,
2087
+ index1: index1,
2088
+ index2: index2
2089
+ })
2090
+ else
2091
+ raise 'Invalid state'
2092
+ end
2093
+ end
2094
+ end
2095
+
2088
2096
  def handleBinaryLiteral(ctx)
2089
2097
  value = ctx.text[1..(ctx.text.length - 1)]
2090
2098