expressir 0.1.0 → 0.2.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (112) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/rake.yml +46 -0
  3. data/.github/workflows/release.yml +74 -0
  4. data/.gitignore +3 -0
  5. data/.gitmodules +3 -0
  6. data/Gemfile +2 -0
  7. data/Rakefile +20 -0
  8. data/demo.rb +18 -0
  9. data/exe/generate-parser +48 -0
  10. data/expressir.gemspec +5 -2
  11. data/ext/express-parser/antlrgen/Express.interp +532 -0
  12. data/ext/express-parser/antlrgen/Express.tokens +190 -0
  13. data/ext/express-parser/antlrgen/ExpressBaseListener.cpp +7 -0
  14. data/ext/express-parser/antlrgen/ExpressBaseListener.h +623 -0
  15. data/ext/express-parser/antlrgen/ExpressBaseVisitor.cpp +7 -0
  16. data/ext/express-parser/antlrgen/ExpressBaseVisitor.h +816 -0
  17. data/ext/express-parser/antlrgen/ExpressLexer.cpp +1169 -0
  18. data/ext/express-parser/antlrgen/ExpressLexer.h +85 -0
  19. data/ext/express-parser/antlrgen/ExpressLexer.interp +534 -0
  20. data/ext/express-parser/antlrgen/ExpressLexer.tokens +190 -0
  21. data/ext/express-parser/antlrgen/ExpressListener.cpp +7 -0
  22. data/ext/express-parser/antlrgen/ExpressListener.h +616 -0
  23. data/ext/express-parser/antlrgen/ExpressParser.cpp +17284 -0
  24. data/ext/express-parser/antlrgen/ExpressParser.h +3696 -0
  25. data/ext/express-parser/antlrgen/ExpressVisitor.cpp +7 -0
  26. data/ext/express-parser/antlrgen/ExpressVisitor.h +422 -0
  27. data/ext/express-parser/express_parser.cpp +17931 -0
  28. data/ext/express-parser/extconf.rb +34 -0
  29. data/lib/expressir/express.rb +0 -1
  30. data/lib/expressir/express_exp/formatter.rb +1450 -0
  31. data/lib/expressir/express_exp/parser.rb +36 -0
  32. data/lib/expressir/express_exp/visitor.rb +2451 -0
  33. data/lib/expressir/model.rb +65 -0
  34. data/lib/expressir/model/attribute.rb +27 -0
  35. data/lib/expressir/model/constant.rb +17 -0
  36. data/lib/expressir/model/entity.rb +46 -0
  37. data/lib/expressir/model/enumeration_item.rb +11 -0
  38. data/lib/expressir/model/expressions/aggregate_initializer.rb +13 -0
  39. data/lib/expressir/model/expressions/aggregate_item.rb +15 -0
  40. data/lib/expressir/model/expressions/attribute_reference.rb +15 -0
  41. data/lib/expressir/model/expressions/binary_expression.rb +40 -0
  42. data/lib/expressir/model/expressions/call.rb +15 -0
  43. data/lib/expressir/model/expressions/entity_constructor.rb +15 -0
  44. data/lib/expressir/model/expressions/group_reference.rb +15 -0
  45. data/lib/expressir/model/expressions/index_reference.rb +17 -0
  46. data/lib/expressir/model/expressions/interval.rb +21 -0
  47. data/lib/expressir/model/expressions/query_expression.rb +26 -0
  48. data/lib/expressir/model/expressions/simple_reference.rb +13 -0
  49. data/lib/expressir/model/expressions/unary_expression.rb +19 -0
  50. data/lib/expressir/model/function.rb +62 -0
  51. data/lib/expressir/model/identifier.rb +9 -0
  52. data/lib/expressir/model/interface.rb +18 -0
  53. data/lib/expressir/model/literals/binary.rb +13 -0
  54. data/lib/expressir/model/literals/integer.rb +13 -0
  55. data/lib/expressir/model/literals/logical.rb +17 -0
  56. data/lib/expressir/model/literals/real.rb +13 -0
  57. data/lib/expressir/model/literals/string.rb +15 -0
  58. data/lib/expressir/model/parameter.rb +17 -0
  59. data/lib/expressir/model/procedure.rb +60 -0
  60. data/lib/expressir/model/renamed_ref.rb +13 -0
  61. data/lib/expressir/model/repository.rb +19 -0
  62. data/lib/expressir/model/rule.rb +62 -0
  63. data/lib/expressir/model/schema.rb +67 -0
  64. data/lib/expressir/model/scope.rb +17 -0
  65. data/lib/expressir/model/statements/alias.rb +26 -0
  66. data/lib/expressir/model/statements/assignment.rb +15 -0
  67. data/lib/expressir/model/statements/call.rb +15 -0
  68. data/lib/expressir/model/statements/case.rb +17 -0
  69. data/lib/expressir/model/statements/case_action.rb +15 -0
  70. data/lib/expressir/model/statements/compound.rb +13 -0
  71. data/lib/expressir/model/statements/escape.rb +8 -0
  72. data/lib/expressir/model/statements/if.rb +17 -0
  73. data/lib/expressir/model/statements/null.rb +8 -0
  74. data/lib/expressir/model/statements/repeat.rb +34 -0
  75. data/lib/expressir/model/statements/return.rb +13 -0
  76. data/lib/expressir/model/statements/skip.rb +8 -0
  77. data/lib/expressir/model/subtype_constraint.rb +27 -0
  78. data/lib/expressir/model/type.rb +24 -0
  79. data/lib/expressir/model/types/aggregate.rb +17 -0
  80. data/lib/expressir/model/types/array.rb +21 -0
  81. data/lib/expressir/model/types/bag.rb +17 -0
  82. data/lib/expressir/model/types/binary.rb +15 -0
  83. data/lib/expressir/model/types/boolean.rb +8 -0
  84. data/lib/expressir/model/types/enumeration.rb +19 -0
  85. data/lib/expressir/model/types/generic.rb +13 -0
  86. data/lib/expressir/model/types/generic_entity.rb +13 -0
  87. data/lib/expressir/model/types/integer.rb +8 -0
  88. data/lib/expressir/model/types/list.rb +19 -0
  89. data/lib/expressir/model/types/logical.rb +8 -0
  90. data/lib/expressir/model/types/number.rb +8 -0
  91. data/lib/expressir/model/types/real.rb +13 -0
  92. data/lib/expressir/model/types/select.rb +21 -0
  93. data/lib/expressir/model/types/set.rb +17 -0
  94. data/lib/expressir/model/types/string.rb +15 -0
  95. data/lib/expressir/model/unique.rb +15 -0
  96. data/lib/expressir/model/variable.rb +17 -0
  97. data/lib/expressir/model/where.rb +15 -0
  98. data/lib/expressir/version.rb +1 -1
  99. data/original/examples/syntax/remark.exp +145 -0
  100. data/original/examples/syntax/remark_formatted.exp +174 -0
  101. data/original/examples/syntax/syntax.exp +310 -0
  102. data/original/examples/syntax/syntax_formatted.exp +1187 -0
  103. data/spec/expressir/express_exp/ap233_spec.rb +22 -0
  104. data/spec/expressir/express_exp/format_remark_spec.rb +28 -0
  105. data/spec/expressir/express_exp/format_syntax_spec.rb +28 -0
  106. data/spec/expressir/express_exp/parse_remark_spec.rb +345 -0
  107. data/spec/expressir/express_exp/parse_syntax_spec.rb +2998 -0
  108. data/spec/expressir/model/find_spec.rb +110 -0
  109. metadata +139 -12
  110. data/.github/workflows/macos.yml +0 -38
  111. data/.github/workflows/ubuntu.yml +0 -56
  112. data/.github/workflows/windows.yml +0 -40
@@ -0,0 +1,36 @@
1
+ require 'express_parser'
2
+ require 'expressir/express_exp/visitor'
3
+
4
+ module Expressir
5
+ module ExpressExp
6
+ class Parser
7
+ def self.from_exp(file)
8
+ input = File.read(file)
9
+
10
+ =begin
11
+ char_stream = Antlr4::Runtime::CharStreams.from_string(input, 'String')
12
+ lexer = ::ExpressParser::Lexer.new(char_stream)
13
+ token_stream = Antlr4::Runtime::CommonTokenStream.new(lexer)
14
+ parser = ::ExpressParser::Parser.new(token_stream)
15
+
16
+ # don't attempt to recover from any parsing error
17
+ parser.instance_variable_set(:@_err_handler, Antlr4::Runtime::BailErrorStrategy.new)
18
+
19
+ parse_tree = parser.syntax()
20
+
21
+ visitor = Visitor.new(token_stream)
22
+ repo = visitor.visit(parse_tree)
23
+ =end
24
+
25
+ parser = ::ExpressParser::Parser.parse(input)
26
+
27
+ parse_tree = parser.syntax()
28
+
29
+ visitor = Visitor.new(parser.tokens)
30
+ repo = visitor.visit(parse_tree)
31
+
32
+ repo
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,2451 @@
1
+ require 'express_parser'
2
+ require 'expressir/model'
3
+
4
+ # static shorthands are unwrapped
5
+ # - entity attributes, function/procedure parameters, local variables
6
+ #
7
+ # reference type is not recognized
8
+ # see note in A.1.5 Interpreted identifiers
9
+ # > It is expected that identifiers matching these syntax rules are known to an implementation.
10
+ # > How the implementation obtains this information is of no concern to the definition of the language. One
11
+ # > method of gaining this information is multi-pass parsing: the first pass collects the identifiers from their
12
+ # > declarations, so that subsequent passes are then able to distinguish a veriable_ref from a function_ref,
13
+ # > for example.
14
+ #
15
+ # - xxxRef - merged to SimpleReference
16
+ # - entityConstructor, functionCall - merged to Call
17
+ #
18
+ # difference between generalized and instantiable types is not recognized
19
+ # see note in 8.6.2 Parameter data types
20
+ # > A syntactic construct such as ARRAY[1:3] OF REAL satisfies two syntactic productions —
21
+ # > aggregation_type and general_aggregation_type. It is considered to be instantiable no matter which
22
+ # > production it is required to satisfy in the syntax.
23
+
24
+ module Expressir
25
+ module ExpressExp
26
+ class Visitor < ::ExpressParser::Visitor
27
+ REMARK_CHANNEL = 2
28
+
29
+ def initialize(tokens)
30
+ @tokens = tokens
31
+ @attached_remarks = Set.new
32
+
33
+ super()
34
+ end
35
+
36
+ def visit(ctx)
37
+ result = super(ctx)
38
+ attach_parent(ctx, result)
39
+ attach_remarks(ctx, result)
40
+ result
41
+ end
42
+
43
+ def visit_if(ctx)
44
+ visit(ctx) if ctx
45
+ end
46
+
47
+ def visit_if_map(ctx)
48
+ ctx.map{|ctx2| visit(ctx2)} if ctx
49
+ end
50
+
51
+ def visit_if_map_flatten(ctx)
52
+ ctx.map{|ctx2| visit(ctx2)}.flatten if ctx
53
+ end
54
+
55
+ def attach_parent(ctx, node)
56
+ if node.class.method_defined? :children
57
+ node.children.each do |child_node|
58
+ if child_node.class.method_defined? :parent
59
+ child_node.parent = node
60
+ end
61
+ end
62
+ end
63
+ end
64
+
65
+ def attach_remarks(ctx, node)
66
+ # get remark tokens
67
+ start_index, stop_index = if ctx.instance_of? ::ExpressParser::SyntaxContext
68
+ [0, @tokens.size - 1]
69
+ else
70
+ [ctx.start.token_index, ctx.stop.token_index]
71
+ end
72
+ # puts [start_index, stop_index, ctx.class].inspect
73
+
74
+ remark_tokens = @tokens[start_index..stop_index].select{|x| x.channel == REMARK_CHANNEL}
75
+ if remark_tokens
76
+ remark_tokens.each do |remark_token|
77
+ remark_text = remark_token.text
78
+
79
+ # check if it is tagged remark
80
+ match = if remark_text.start_with?('--')
81
+ remark_text[2..-1].match(/^"([^"]*)"(.*)$/)
82
+ elsif remark_text.start_with?('(*') and remark_text.end_with?('*)')
83
+ remark_text[2..-3].match(/^"([^"]*)"(.*)$/m)
84
+ end
85
+ if !match
86
+ next
87
+ end
88
+
89
+ # don't attach already attached tagged remark
90
+ if @attached_remarks.include? remark_token
91
+ next
92
+ end
93
+
94
+ # attach tagged remark
95
+ remark_tag = match[1]
96
+ remark_content = match[2].strip
97
+
98
+ target_node = nil
99
+ current_node = node
100
+ if current_node.class.method_defined? :find
101
+ target_node = current_node.find(remark_tag)
102
+ end
103
+ while !target_node and current_node.class.method_defined? :parent and current_node.parent.class.method_defined? :find
104
+ current_node = current_node.parent
105
+ target_node = current_node.find(remark_tag)
106
+ end
107
+
108
+ if target_node
109
+ target_node.remarks ||= []
110
+ target_node.remarks << remark_content
111
+
112
+ # mark remark as attached, so that it is not attached again at higher nesting level
113
+ @attached_remarks << remark_token
114
+ end
115
+ end
116
+ end
117
+ end
118
+
119
+ def visit_attribute_ref(ctx)
120
+ ctx__attribute_id = ctx.attribute_id
121
+
122
+ id = visit_if(ctx__attribute_id)
123
+
124
+ Model::Expressions::SimpleReference.new({
125
+ id: id
126
+ })
127
+ end
128
+
129
+ def visit_constant_ref(ctx)
130
+ ctx__constant_id = ctx.constant_id
131
+
132
+ id = visit_if(ctx__constant_id)
133
+
134
+ Model::Expressions::SimpleReference.new({
135
+ id: id
136
+ })
137
+ end
138
+
139
+ def visit_entity_ref(ctx)
140
+ ctx__entity_id = ctx.entity_id
141
+
142
+ id = visit_if(ctx__entity_id)
143
+
144
+ Model::Expressions::SimpleReference.new({
145
+ id: id
146
+ })
147
+ end
148
+
149
+ def visit_enumeration_ref(ctx)
150
+ ctx__enumeration_id = ctx.enumeration_id
151
+
152
+ id = visit_if(ctx__enumeration_id)
153
+
154
+ Model::Expressions::SimpleReference.new({
155
+ id: id
156
+ })
157
+ end
158
+
159
+ def visit_function_ref(ctx)
160
+ ctx__function_id = ctx.function_id
161
+
162
+ id = visit_if(ctx__function_id)
163
+
164
+ Model::Expressions::SimpleReference.new({
165
+ id: id
166
+ })
167
+ end
168
+
169
+ def visit_parameter_ref(ctx)
170
+ ctx__parameter_id = ctx.parameter_id
171
+
172
+ id = visit_if(ctx__parameter_id)
173
+
174
+ Model::Expressions::SimpleReference.new({
175
+ id: id
176
+ })
177
+ end
178
+
179
+ def visit_procedure_ref(ctx)
180
+ ctx__procedure_id = ctx.procedure_id
181
+
182
+ id = visit_if(ctx__procedure_id)
183
+
184
+ Model::Expressions::SimpleReference.new({
185
+ id: id
186
+ })
187
+ end
188
+
189
+ def visit_rule_label_ref(ctx)
190
+ ctx__rule_label_id = ctx.rule_label_id
191
+
192
+ id = visit_if(ctx__rule_label_id)
193
+
194
+ Model::Expressions::SimpleReference.new({
195
+ id: id
196
+ })
197
+ end
198
+
199
+ def visit_rule_ref(ctx)
200
+ ctx__rule_id = ctx.rule_id
201
+
202
+ id = visit_if(ctx__rule_id)
203
+
204
+ Model::Expressions::SimpleReference.new({
205
+ id: id
206
+ })
207
+ end
208
+
209
+ def visit_schema_ref(ctx)
210
+ ctx__schema_id = ctx.schema_id
211
+
212
+ id = visit_if(ctx__schema_id)
213
+
214
+ Model::Expressions::SimpleReference.new({
215
+ id: id
216
+ })
217
+ end
218
+
219
+ def visit_subtype_constraint_ref(ctx)
220
+ ctx__subtype_constraint_id = ctx.subtype_constraint_id
221
+
222
+ id = visit_if(ctx__subtype_constraint_id)
223
+
224
+ Model::Expressions::SimpleReference.new({
225
+ id: id
226
+ })
227
+ end
228
+
229
+ def visit_type_label_ref(ctx)
230
+ ctx__type_label_id = ctx.type_label_id
231
+
232
+ id = visit_if(ctx__type_label_id)
233
+
234
+ Model::Expressions::SimpleReference.new({
235
+ id: id
236
+ })
237
+ end
238
+
239
+ def visit_type_ref(ctx)
240
+ ctx__type_id = ctx.type_id
241
+
242
+ id = visit_if(ctx__type_id)
243
+
244
+ Model::Expressions::SimpleReference.new({
245
+ id: id
246
+ })
247
+ end
248
+
249
+ def visit_variable_ref(ctx)
250
+ ctx__variable_id = ctx.variable_id
251
+
252
+ id = visit_if(ctx__variable_id)
253
+
254
+ Model::Expressions::SimpleReference.new({
255
+ id: id
256
+ })
257
+ end
258
+
259
+ def visit_abstract_entity_declaration(ctx)
260
+ raise 'Invalid state'
261
+ end
262
+
263
+ def visit_abstract_supertype(ctx)
264
+ raise 'Invalid state'
265
+ end
266
+
267
+ def visit_abstract_supertype_declaration(ctx)
268
+ ctx__subtype_constraint = ctx.subtype_constraint
269
+
270
+ visit_if(ctx__subtype_constraint)
271
+ end
272
+
273
+ def visit_actual_parameter_list(ctx)
274
+ ctx__parameter = ctx.parameter
275
+
276
+ visit_if_map(ctx__parameter)
277
+ end
278
+
279
+ def visit_add_like_op(ctx)
280
+ ctx__text = ctx.text
281
+ ctx__ADDITION = ctx__text == '+'
282
+ ctx__SUBTRACTION = ctx__text == '-'
283
+ ctx__OR = ctx.OR
284
+ ctx__XOR = ctx.XOR
285
+
286
+ if ctx__ADDITION
287
+ Model::Expressions::BinaryExpression::ADDITION
288
+ elsif ctx__SUBTRACTION
289
+ Model::Expressions::BinaryExpression::SUBTRACTION
290
+ elsif ctx__OR
291
+ Model::Expressions::BinaryExpression::OR
292
+ elsif ctx__XOR
293
+ Model::Expressions::BinaryExpression::XOR
294
+ else
295
+ raise 'Invalid state'
296
+ end
297
+ end
298
+
299
+ def visit_aggregate_initializer(ctx)
300
+ ctx__element = ctx.element
301
+
302
+ items = visit_if_map(ctx__element)
303
+
304
+ Model::Expressions::AggregateInitializer.new({
305
+ items: items
306
+ })
307
+ end
308
+
309
+ def visit_aggregate_source(ctx)
310
+ ctx__simple_expression = ctx.simple_expression
311
+
312
+ visit_if(ctx__simple_expression)
313
+ end
314
+
315
+ def visit_aggregate_type(ctx)
316
+ ctx__type_label = ctx.type_label
317
+ ctx__parameter_type = ctx.parameter_type
318
+
319
+ id = visit_if(ctx__type_label)
320
+ base_type = visit_if(ctx__parameter_type)
321
+
322
+ Model::Types::Aggregate.new({
323
+ id: id,
324
+ base_type: base_type
325
+ })
326
+ end
327
+
328
+ def visit_aggregation_types(ctx)
329
+ ctx__array_type = ctx.array_type
330
+ ctx__bag_type = ctx.bag_type
331
+ ctx__list_type = ctx.list_type
332
+ ctx__set_type = ctx.set_type
333
+
334
+ visit_if(ctx__array_type || ctx__bag_type || ctx__list_type || ctx__set_type)
335
+ end
336
+
337
+ def visit_algorithm_head(ctx)
338
+ raise 'Invalid state'
339
+ end
340
+
341
+ def visit_alias_stmt(ctx)
342
+ ctx__variable_id = ctx.variable_id
343
+ ctx__general_ref = ctx.general_ref
344
+ ctx__qualifier = ctx.qualifier
345
+ ctx__stmt = ctx.stmt
346
+
347
+ id = visit_if(ctx__variable_id)
348
+ expression = handle_qualified_ref(visit_if(ctx__general_ref), ctx__qualifier)
349
+ statements = visit_if_map(ctx__stmt)
350
+
351
+ Model::Statements::Alias.new({
352
+ id: id,
353
+ expression: expression,
354
+ statements: statements
355
+ })
356
+ end
357
+
358
+ def visit_array_type(ctx)
359
+ ctx__bound_spec = ctx.bound_spec
360
+ ctx__OPTIONAL = ctx.OPTIONAL
361
+ ctx__UNIQUE = ctx.UNIQUE
362
+ ctx__instantiable_type = ctx.instantiable_type
363
+ ctx__bound_spec__bound1 = ctx__bound_spec&.bound1
364
+ ctx__bound_spec__bound2 = ctx__bound_spec&.bound2
365
+
366
+ bound1 = visit_if(ctx__bound_spec__bound1)
367
+ bound2 = visit_if(ctx__bound_spec__bound2)
368
+ optional = !!ctx__OPTIONAL
369
+ unique = !!ctx__UNIQUE
370
+ base_type = visit_if(ctx__instantiable_type)
371
+
372
+ Model::Types::Array.new({
373
+ bound1: bound1,
374
+ bound2: bound2,
375
+ optional: optional,
376
+ unique: unique,
377
+ base_type: base_type
378
+ })
379
+ end
380
+
381
+ def visit_assignment_stmt(ctx)
382
+ ctx__general_ref = ctx.general_ref
383
+ ctx__qualifier = ctx.qualifier
384
+ ctx__expression = ctx.expression
385
+
386
+ ref = handle_qualified_ref(visit_if(ctx__general_ref), ctx__qualifier)
387
+ expression = visit_if(ctx__expression)
388
+
389
+ Model::Statements::Assignment.new({
390
+ ref: ref,
391
+ expression: expression
392
+ })
393
+ end
394
+
395
+ def visit_attribute_decl(ctx)
396
+ ctx__attribute_id = ctx.attribute_id
397
+ ctx__redeclared_attribute = ctx.redeclared_attribute
398
+ ctx__redeclared_attribute__qualified_attribute = ctx__redeclared_attribute&.qualified_attribute
399
+ ctx__redeclared_attribute__attribute_id = ctx__redeclared_attribute&.attribute_id
400
+
401
+ id = visit_if(ctx__attribute_id || ctx__redeclared_attribute__attribute_id)
402
+ supertype_attribute = visit_if(ctx__redeclared_attribute__qualified_attribute)
403
+
404
+ Model::Attribute.new({
405
+ id: id,
406
+ supertype_attribute: supertype_attribute
407
+ })
408
+ end
409
+
410
+ def visit_attribute_id(ctx)
411
+ ctx__SimpleId = ctx.SimpleId
412
+
413
+ handle_simple_id(ctx__SimpleId)
414
+ end
415
+
416
+ def visit_attribute_qualifier(ctx)
417
+ ctx__attribute_ref = ctx.attribute_ref
418
+
419
+ attribute = visit_if(ctx__attribute_ref)
420
+
421
+ Model::Expressions::AttributeReference.new({
422
+ attribute: attribute
423
+ })
424
+ end
425
+
426
+ def visit_attribute_reference(ctx)
427
+ raise 'Invalid state'
428
+ end
429
+
430
+ def visit_bag_type(ctx)
431
+ ctx__bound_spec = ctx.bound_spec
432
+ ctx__instantiable_type = ctx.instantiable_type
433
+ ctx__bound_spec__bound1 = ctx__bound_spec&.bound1
434
+ ctx__bound_spec__bound2 = ctx__bound_spec&.bound2
435
+
436
+ bound1 = visit_if(ctx__bound_spec__bound1)
437
+ bound2 = visit_if(ctx__bound_spec__bound2)
438
+ base_type = visit_if(ctx__instantiable_type)
439
+
440
+ Model::Types::Bag.new({
441
+ bound1: bound1,
442
+ bound2: bound2,
443
+ base_type: base_type
444
+ })
445
+ end
446
+
447
+ def visit_binary_type(ctx)
448
+ ctx__width_spec = ctx.width_spec
449
+ ctx__width_spec__width = ctx__width_spec&.width
450
+ ctx__width_spec__FIXED = ctx__width_spec&.FIXED
451
+
452
+ width = visit_if(ctx__width_spec__width)
453
+ fixed = !!ctx__width_spec__FIXED
454
+
455
+ Model::Types::Binary.new({
456
+ width: width,
457
+ fixed: fixed
458
+ })
459
+ end
460
+
461
+ def visit_boolean_type(ctx)
462
+ Model::Types::Boolean.new
463
+ end
464
+
465
+ def visit_bound1(ctx)
466
+ ctx__numeric_expression = ctx.numeric_expression
467
+
468
+ visit_if(ctx__numeric_expression)
469
+ end
470
+
471
+ def visit_bound2(ctx)
472
+ ctx__numeric_expression = ctx.numeric_expression
473
+
474
+ visit_if(ctx__numeric_expression)
475
+ end
476
+
477
+ def visit_bound_spec(ctx)
478
+ raise 'Invalid state'
479
+ end
480
+
481
+ def visit_built_in_constant(ctx)
482
+ ctx__text = ctx.text
483
+
484
+ id = ctx__text
485
+
486
+ Model::Expressions::SimpleReference.new({
487
+ id: id
488
+ })
489
+ end
490
+
491
+ def visit_built_in_function(ctx)
492
+ ctx__text = ctx.text
493
+
494
+ id = ctx__text
495
+
496
+ Model::Expressions::SimpleReference.new({
497
+ id: id
498
+ })
499
+ end
500
+
501
+ def visit_built_in_procedure(ctx)
502
+ ctx__text = ctx.text
503
+
504
+ id = ctx__text
505
+
506
+ Model::Expressions::SimpleReference.new({
507
+ id: id
508
+ })
509
+ end
510
+
511
+ def visit_case_action(ctx)
512
+ ctx__case_label = ctx.case_label
513
+ ctx__stmt = ctx.stmt
514
+
515
+ labels = visit_if_map(ctx__case_label)
516
+ statement = visit_if(ctx__stmt)
517
+
518
+ Model::Statements::CaseAction.new({
519
+ labels: labels,
520
+ statement: statement
521
+ })
522
+ end
523
+
524
+ def visit_case_label(ctx)
525
+ ctx__expression = ctx.expression
526
+
527
+ visit_if(ctx__expression)
528
+ end
529
+
530
+ def visit_case_stmt(ctx)
531
+ ctx__selector = ctx.selector
532
+ ctx__case_action = ctx.case_action
533
+ ctx__stmt = ctx.stmt
534
+ ctx__selector__expression = ctx__selector&.expression
535
+
536
+ expression = visit_if(ctx__selector__expression)
537
+ actions = visit_if_map_flatten(ctx__case_action)
538
+ otherwise_statement = visit_if(ctx__stmt)
539
+
540
+ Model::Statements::Case.new({
541
+ expression: expression,
542
+ actions: actions,
543
+ otherwise_statement: otherwise_statement
544
+ })
545
+ end
546
+
547
+ def visit_compound_stmt(ctx)
548
+ ctx__stmt = ctx.stmt
549
+
550
+ statements = visit_if_map(ctx__stmt)
551
+
552
+ Model::Statements::Compound.new({
553
+ statements: statements
554
+ })
555
+ end
556
+
557
+ def visit_concrete_types(ctx)
558
+ ctx__aggregation_types = ctx.aggregation_types
559
+ ctx__simple_types = ctx.simple_types
560
+ ctx__type_ref = ctx.type_ref
561
+
562
+ visit_if(ctx__aggregation_types || ctx__simple_types || ctx__type_ref)
563
+ end
564
+
565
+ def visit_constant_body(ctx)
566
+ ctx__constant_id = ctx.constant_id
567
+ ctx__instantiable_type = ctx.instantiable_type
568
+ ctx__expression = ctx.expression
569
+
570
+ id = visit_if(ctx__constant_id)
571
+ type = visit_if(ctx__instantiable_type)
572
+ expression = visit_if(ctx__expression)
573
+
574
+ Model::Constant.new({
575
+ id: id,
576
+ type: type,
577
+ expression: expression
578
+ })
579
+ end
580
+
581
+ def visit_constant_decl(ctx)
582
+ ctx__constant_body = ctx.constant_body
583
+
584
+ visit_if_map(ctx__constant_body)
585
+ end
586
+
587
+ def visit_constant_factor(ctx)
588
+ ctx__built_in_constant = ctx.built_in_constant
589
+ ctx__constant_ref = ctx.constant_ref
590
+
591
+ visit_if(ctx__built_in_constant || ctx__constant_ref)
592
+ end
593
+
594
+ def visit_constant_id(ctx)
595
+ ctx__SimpleId = ctx.SimpleId
596
+
597
+ handle_simple_id(ctx__SimpleId)
598
+ end
599
+
600
+ def visit_constructed_types(ctx)
601
+ ctx__enumeration_type = ctx.enumeration_type
602
+ ctx__select_type = ctx.select_type
603
+
604
+ visit_if(ctx__enumeration_type || ctx__select_type)
605
+ end
606
+
607
+ def visit_declaration(ctx)
608
+ ctx__entity_decl = ctx.entity_decl
609
+ ctx__function_decl = ctx.function_decl
610
+ ctx__procedure_decl = ctx.procedure_decl
611
+ ctx__subtype_constraint_decl = ctx.subtype_constraint_decl
612
+ ctx__type_decl = ctx.type_decl
613
+
614
+ visit_if(ctx__entity_decl || ctx__function_decl || ctx__procedure_decl || ctx__subtype_constraint_decl || ctx__type_decl)
615
+ end
616
+
617
+ def visit_derived_attr(ctx)
618
+ ctx__attribute_decl = ctx.attribute_decl
619
+ ctx__parameter_type = ctx.parameter_type
620
+ ctx__expression = ctx.expression
621
+
622
+ attribute = visit_if(ctx__attribute_decl)
623
+ type = visit_if(ctx__parameter_type)
624
+ expression = visit_if(ctx__expression)
625
+
626
+ Model::Attribute.new({
627
+ id: attribute.id,
628
+ kind: Model::Attribute::DERIVED,
629
+ supertype_attribute: attribute.supertype_attribute,
630
+ type: type,
631
+ expression: expression
632
+ })
633
+ end
634
+
635
+ def visit_derive_clause(ctx)
636
+ ctx__derived_attr = ctx.derived_attr
637
+
638
+ visit_if_map(ctx__derived_attr)
639
+ end
640
+
641
+ def visit_domain_rule(ctx)
642
+ ctx__rule_label_id = ctx.rule_label_id
643
+ ctx__expression = ctx.expression
644
+
645
+ id = visit_if(ctx__rule_label_id)
646
+ expression = visit_if(ctx__expression)
647
+
648
+ Model::Where.new({
649
+ id: id,
650
+ expression: expression
651
+ })
652
+ end
653
+
654
+ def visit_element(ctx)
655
+ ctx__expression = ctx.expression
656
+ ctx__repetition = ctx.repetition
657
+
658
+ if ctx__repetition
659
+ expression = visit_if(ctx__expression)
660
+ repetition = visit_if(ctx__repetition)
661
+
662
+ Model::Expressions::AggregateItem.new({
663
+ expression: expression,
664
+ repetition: repetition
665
+ })
666
+ else
667
+ visit_if(ctx__expression)
668
+ end
669
+ end
670
+
671
+ def visit_entity_body(ctx)
672
+ raise 'Invalid state'
673
+ end
674
+
675
+ def visit_entity_constructor(ctx)
676
+ ctx__entity_ref = ctx.entity_ref
677
+ ctx__expression = ctx.expression
678
+
679
+ ref = visit_if(ctx__entity_ref)
680
+ parameters = visit_if_map(ctx__expression)
681
+
682
+ Model::Expressions::Call.new({
683
+ ref: ref,
684
+ parameters: parameters
685
+ })
686
+ end
687
+
688
+ def visit_entity_decl(ctx)
689
+ ctx__entity_head = ctx.entity_head
690
+ ctx__entity_body = ctx.entity_body
691
+ ctx__entity_head__entity_id = ctx__entity_head&.entity_id
692
+ ctx__entity_head__subsuper = ctx__entity_head&.subsuper
693
+ ctx__entity_head__subsuper__supertype_constraint = ctx__entity_head__subsuper&.supertype_constraint
694
+ ctx__entity_head__subsuper__supertype_constraint__abstract_entity_declaration = ctx__entity_head__subsuper__supertype_constraint&.abstract_entity_declaration
695
+ ctx__entity_head__subsuper__supertype_constraint__abstract_supertype_declaration = ctx__entity_head__subsuper__supertype_constraint&.abstract_supertype_declaration
696
+ ctx__entity_head__subsuper__supertype_constraint__supertype_rule = ctx__entity_head__subsuper__supertype_constraint&.supertype_rule
697
+ ctx__entity_head__subsuper__subtype_declaration = ctx__entity_head__subsuper&.subtype_declaration
698
+ ctx__entity_body__explicit_attr = ctx__entity_body&.explicit_attr
699
+ ctx__entity_body__derive_clause = ctx__entity_body&.derive_clause
700
+ ctx__entity_body__inverse_clause = ctx__entity_body&.inverse_clause
701
+ ctx__entity_body__unique_clause = ctx__entity_body&.unique_clause
702
+ ctx__entity_body__where_clause = ctx__entity_body&.where_clause
703
+
704
+ id = visit_if(ctx__entity_head__entity_id)
705
+ abstract = !!(ctx__entity_head__subsuper__supertype_constraint__abstract_entity_declaration || ctx__entity_head__subsuper__supertype_constraint__abstract_supertype_declaration)
706
+ supertype_expression = visit_if(ctx__entity_head__subsuper__supertype_constraint__abstract_supertype_declaration || ctx__entity_head__subsuper__supertype_constraint__supertype_rule)
707
+ subtype_of = visit_if(ctx__entity_head__subsuper__subtype_declaration)
708
+ attributes = [
709
+ *visit_if_map_flatten(ctx__entity_body__explicit_attr),
710
+ *visit_if(ctx__entity_body__derive_clause),
711
+ *visit_if(ctx__entity_body__inverse_clause)
712
+ ]
713
+ unique = visit_if(ctx__entity_body__unique_clause)
714
+ where = visit_if(ctx__entity_body__where_clause)
715
+
716
+ Model::Entity.new({
717
+ id: id,
718
+ abstract: abstract,
719
+ supertype_expression: supertype_expression,
720
+ subtype_of: subtype_of,
721
+ attributes: attributes,
722
+ unique: unique,
723
+ where: where
724
+ })
725
+ end
726
+
727
+ def visit_entity_head(ctx)
728
+ raise 'Invalid state'
729
+ end
730
+
731
+ def visit_entity_id(ctx)
732
+ ctx__SimpleId = ctx.SimpleId
733
+
734
+ handle_simple_id(ctx__SimpleId)
735
+ end
736
+
737
+ def visit_enumeration_extension(ctx)
738
+ raise 'Invalid state'
739
+ end
740
+
741
+ def visit_enumeration_id(ctx)
742
+ ctx__SimpleId = ctx.SimpleId
743
+
744
+ handle_simple_id(ctx__SimpleId)
745
+ end
746
+
747
+ def visit_enumeration_items(ctx)
748
+ ctx__enumeration_item = ctx.enumeration_item
749
+
750
+ visit_if_map(ctx__enumeration_item)
751
+ end
752
+
753
+ def visit_enumeration_item(ctx)
754
+ ctx__enumeration_id = ctx.enumeration_id
755
+
756
+ id = visit_if(ctx__enumeration_id)
757
+
758
+ Model::EnumerationItem.new({
759
+ id: id
760
+ })
761
+ end
762
+
763
+ def visit_enumeration_reference(ctx)
764
+ ctx__type_ref = ctx.type_ref
765
+ ctx__enumeration_ref = ctx.enumeration_ref
766
+
767
+ if ctx__type_ref
768
+ ref = visit_if(ctx__type_ref)
769
+ attribute = visit_if(ctx__enumeration_ref)
770
+
771
+ Model::Expressions::AttributeReference.new({
772
+ ref: ref,
773
+ attribute: attribute
774
+ })
775
+ else
776
+ visit_if(ctx__enumeration_ref)
777
+ end
778
+ end
779
+
780
+ def visit_enumeration_type(ctx)
781
+ ctx__EXTENSIBLE = ctx.EXTENSIBLE
782
+ ctx__enumeration_items = ctx.enumeration_items
783
+ ctx__enumeration_extension = ctx.enumeration_extension
784
+ ctx__enumeration_extension__type_ref = ctx__enumeration_extension&.type_ref
785
+ ctx__enumeration_extension__enumeration_items = ctx__enumeration_extension&.enumeration_items
786
+
787
+ extensible = !!ctx__EXTENSIBLE
788
+ items = visit_if(ctx__enumeration_items)
789
+ extension_type = visit_if(ctx__enumeration_extension__type_ref)
790
+ extension_items = visit_if(ctx__enumeration_extension__enumeration_items)
791
+
792
+ Model::Types::Enumeration.new({
793
+ extensible: extensible,
794
+ items: items,
795
+ extension_type: extension_type,
796
+ extension_items: extension_items
797
+ })
798
+ end
799
+
800
+ def visit_escape_stmt(ctx)
801
+ Model::Statements::Escape.new
802
+ end
803
+
804
+ def visit_explicit_attr(ctx)
805
+ ctx__attribute_decl = ctx.attribute_decl
806
+ ctx__OPTIONAL = ctx.OPTIONAL
807
+ ctx__parameter_type = ctx.parameter_type
808
+
809
+ attributes = visit_if_map(ctx__attribute_decl)
810
+ optional = !!ctx__OPTIONAL
811
+ type = visit_if(ctx__parameter_type)
812
+
813
+ attributes.map do |attribute|
814
+ Model::Attribute.new({
815
+ id: attribute.id,
816
+ kind: Model::Attribute::EXPLICIT,
817
+ supertype_attribute: attribute.supertype_attribute,
818
+ optional: optional,
819
+ type: type
820
+ })
821
+ end
822
+ end
823
+
824
+ def visit_expression(ctx)
825
+ ctx__simple_expression = ctx.simple_expression
826
+ ctx__rel_op_extended = ctx.rel_op_extended
827
+
828
+ if ctx__simple_expression.length == 2
829
+ operator = visit_if(ctx__rel_op_extended)
830
+ operand1 = visit_if(ctx__simple_expression[0])
831
+ operand2 = visit_if(ctx__simple_expression[1])
832
+
833
+ Model::Expressions::BinaryExpression.new({
834
+ operator: operator,
835
+ operand1: operand1,
836
+ operand2: operand2
837
+ })
838
+ else
839
+ visit_if(ctx__simple_expression[0])
840
+ end
841
+ end
842
+
843
+ def visit_factor(ctx)
844
+ ctx__simple_factor = ctx.simple_factor
845
+
846
+ if ctx__simple_factor.length == 2
847
+ operator = Model::Expressions::BinaryExpression::EXPONENTIATION
848
+ operand1 = visit(ctx__simple_factor[0])
849
+ operand2 = visit(ctx__simple_factor[1])
850
+
851
+ Model::Expressions::BinaryExpression.new({
852
+ operator: operator,
853
+ operand1: operand1,
854
+ operand2: operand2
855
+ })
856
+ elsif ctx__simple_factor.length == 1
857
+ visit_if(ctx__simple_factor[0])
858
+ else
859
+ raise 'Invalid state'
860
+ end
861
+ end
862
+
863
+ def visit_formal_parameter(ctx)
864
+ ctx__parameter_id = ctx.parameter_id
865
+ ctx__parameter_type = ctx.parameter_type
866
+
867
+ ids = visit_if_map(ctx__parameter_id)
868
+ type = visit_if(ctx__parameter_type)
869
+
870
+ ids.map do |id|
871
+ Model::Parameter.new({
872
+ id: id,
873
+ type: type
874
+ })
875
+ end
876
+ end
877
+
878
+ def visit_function_call(ctx)
879
+ ctx__built_in_function = ctx.built_in_function
880
+ ctx__function_ref = ctx.function_ref
881
+ ctx__actual_parameter_list = ctx.actual_parameter_list
882
+
883
+ ref = visit_if(ctx__built_in_function || ctx__function_ref)
884
+ parameters = visit_if(ctx__actual_parameter_list)
885
+
886
+ Model::Expressions::Call.new({
887
+ ref: ref,
888
+ parameters: parameters
889
+ })
890
+ end
891
+
892
+ def visit_function_decl(ctx)
893
+ ctx__function_head = ctx.function_head
894
+ ctx__algorithm_head = ctx.algorithm_head
895
+ ctx__stmt = ctx.stmt
896
+ ctx__function_head__function_id = ctx__function_head&.function_id
897
+ ctx__function_head__formal_parameter = ctx__function_head&.formal_parameter
898
+ ctx__function_head__parameter_type = ctx__function_head&.parameter_type
899
+ ctx__algorithm_head__declaration = ctx__algorithm_head&.declaration
900
+ ctx__algorithm_head__constant_decl = ctx__algorithm_head&.constant_decl
901
+ ctx__algorithm_head__local_decl = ctx__algorithm_head&.local_decl
902
+
903
+ id = visit_if(ctx__function_head__function_id)
904
+ parameters = visit_if_map_flatten(ctx__function_head__formal_parameter)
905
+ return_type = visit_if(ctx__function_head__parameter_type)
906
+ declarations = visit_if_map(ctx__algorithm_head__declaration)
907
+ constants = visit_if(ctx__algorithm_head__constant_decl)
908
+ variables = visit_if(ctx__algorithm_head__local_decl)
909
+ statements = visit_if_map(ctx__stmt)
910
+
911
+ Model::Function.new({
912
+ id: id,
913
+ parameters: parameters,
914
+ return_type: return_type,
915
+ declarations: declarations,
916
+ constants: constants,
917
+ variables: variables,
918
+ statements: statements
919
+ })
920
+ end
921
+
922
+ def visit_function_head(ctx)
923
+ raise 'Invalid state'
924
+ end
925
+
926
+ def visit_function_id(ctx)
927
+ ctx__SimpleId = ctx.SimpleId
928
+
929
+ handle_simple_id(ctx__SimpleId)
930
+ end
931
+
932
+ def visit_generalized_types(ctx)
933
+ ctx__aggregate_type = ctx.aggregate_type
934
+ ctx__general_aggregation_types = ctx.general_aggregation_types
935
+ ctx__generic_entity_type = ctx.generic_entity_type
936
+ ctx__generic_type = ctx.generic_type
937
+
938
+ visit_if(ctx__aggregate_type || ctx__general_aggregation_types || ctx__generic_entity_type || ctx__generic_type)
939
+ end
940
+
941
+ def visit_general_aggregation_types(ctx)
942
+ ctx__general_array_type = ctx.general_array_type
943
+ ctx__general_bag_type = ctx.general_bag_type
944
+ ctx__general_list_type = ctx.general_list_type
945
+ ctx__general_set_type = ctx.general_set_type
946
+
947
+ visit_if(ctx__general_array_type || ctx__general_bag_type || ctx__general_list_type || ctx__general_set_type)
948
+ end
949
+
950
+ def visit_general_array_type(ctx)
951
+ ctx__bound_spec = ctx.bound_spec
952
+ ctx__OPTIONAL = ctx.OPTIONAL
953
+ ctx__UNIQUE = ctx.UNIQUE
954
+ ctx__parameter_type = ctx.parameter_type
955
+ ctx__bound_spec__bound1 = ctx__bound_spec&.bound1
956
+ ctx__bound_spec__bound2 = ctx__bound_spec&.bound2
957
+
958
+ bound1 = visit_if(ctx__bound_spec__bound1)
959
+ bound2 = visit_if(ctx__bound_spec__bound2)
960
+ optional = !!ctx__OPTIONAL
961
+ unique = !!ctx__UNIQUE
962
+ base_type = visit_if(ctx__parameter_type)
963
+
964
+ Model::Types::Array.new({
965
+ bound1: bound1,
966
+ bound2: bound2,
967
+ optional: optional,
968
+ unique: unique,
969
+ base_type: base_type
970
+ })
971
+ end
972
+
973
+ def visit_general_bag_type(ctx)
974
+ ctx__bound_spec = ctx.bound_spec
975
+ ctx__parameter_type = ctx.parameter_type
976
+ ctx__bound_spec__bound1 = ctx__bound_spec&.bound1
977
+ ctx__bound_spec__bound2 = ctx__bound_spec&.bound2
978
+
979
+ bound1 = visit_if(ctx__bound_spec__bound1)
980
+ bound2 = visit_if(ctx__bound_spec__bound2)
981
+ base_type = visit_if(ctx__parameter_type)
982
+
983
+ Model::Types::Bag.new({
984
+ bound1: bound1,
985
+ bound2: bound2,
986
+ base_type: base_type
987
+ })
988
+ end
989
+
990
+ def visit_general_list_type(ctx)
991
+ ctx__bound_spec = ctx.bound_spec
992
+ ctx__UNIQUE = ctx.UNIQUE
993
+ ctx__parameter_type = ctx.parameter_type
994
+ ctx__bound_spec__bound1 = ctx__bound_spec&.bound1
995
+ ctx__bound_spec__bound2 = ctx__bound_spec&.bound2
996
+
997
+ bound1 = visit_if(ctx__bound_spec__bound1)
998
+ bound2 = visit_if(ctx__bound_spec__bound2)
999
+ unique = !!ctx__UNIQUE
1000
+ base_type = visit_if(ctx__parameter_type)
1001
+
1002
+ Model::Types::List.new({
1003
+ bound1: bound1,
1004
+ bound2: bound2,
1005
+ unique: unique,
1006
+ base_type: base_type
1007
+ })
1008
+ end
1009
+
1010
+ def visit_general_ref(ctx)
1011
+ ctx__parameter_ref = ctx.parameter_ref
1012
+ ctx__variable_id = ctx.variable_id
1013
+
1014
+ visit_if(ctx__parameter_ref || ctx__variable_id)
1015
+ end
1016
+
1017
+ def visit_general_set_type(ctx)
1018
+ ctx__bound_spec = ctx.bound_spec
1019
+ ctx__parameter_type = ctx.parameter_type
1020
+ ctx__bound_spec__bound1 = ctx__bound_spec&.bound1
1021
+ ctx__bound_spec__bound2 = ctx__bound_spec&.bound2
1022
+
1023
+ bound1 = visit_if(ctx__bound_spec__bound1)
1024
+ bound2 = visit_if(ctx__bound_spec__bound2)
1025
+ base_type = visit_if(ctx__parameter_type)
1026
+
1027
+ Model::Types::Set.new({
1028
+ bound1: bound1,
1029
+ bound2: bound2,
1030
+ base_type: base_type
1031
+ })
1032
+ end
1033
+
1034
+ def visit_generic_entity_type(ctx)
1035
+ ctx__type_label = ctx.type_label
1036
+
1037
+ id = visit_if(ctx__type_label)
1038
+
1039
+ Model::Types::GenericEntity.new({
1040
+ id: id
1041
+ })
1042
+ end
1043
+
1044
+ def visit_generic_type(ctx)
1045
+ ctx__type_label = ctx.type_label
1046
+
1047
+ id = visit_if(ctx__type_label)
1048
+
1049
+ Model::Types::Generic.new({
1050
+ id: id
1051
+ })
1052
+ end
1053
+
1054
+ def visit_group_qualifier(ctx)
1055
+ ctx__entity_ref = ctx.entity_ref
1056
+
1057
+ entity = visit_if(ctx__entity_ref)
1058
+
1059
+ Model::Expressions::GroupReference.new({
1060
+ entity: entity
1061
+ })
1062
+ end
1063
+
1064
+ def visit_group_reference(ctx)
1065
+ raise 'Invalid state'
1066
+ end
1067
+
1068
+ def visit_if_stmt(ctx)
1069
+ ctx__logical_expression = ctx.logical_expression
1070
+ ctx__if_stmt_statements = ctx.if_stmt_statements
1071
+ ctx__if_stmt_else_statements = ctx.if_stmt_else_statements
1072
+
1073
+ expression = visit_if(ctx__logical_expression)
1074
+ statements = visit_if(ctx__if_stmt_statements)
1075
+ else_statements = visit_if(ctx__if_stmt_else_statements)
1076
+
1077
+ Model::Statements::If.new({
1078
+ expression: expression,
1079
+ statements: statements,
1080
+ else_statements: else_statements
1081
+ })
1082
+ end
1083
+
1084
+ def visit_if_stmt_statements(ctx)
1085
+ ctx__stmt = ctx.stmt
1086
+
1087
+ visit_if_map(ctx__stmt)
1088
+ end
1089
+
1090
+ def visit_if_stmt_else_statements(ctx)
1091
+ ctx__stmt = ctx.stmt
1092
+
1093
+ visit_if_map(ctx__stmt)
1094
+ end
1095
+
1096
+ def visit_increment(ctx)
1097
+ ctx__numeric_expression = ctx.numeric_expression
1098
+
1099
+ visit_if(ctx__numeric_expression)
1100
+ end
1101
+
1102
+ def visit_increment_control(ctx)
1103
+ raise 'Invalid state'
1104
+ end
1105
+
1106
+ def visit_index(ctx)
1107
+ ctx__numeric_expression = ctx.numeric_expression
1108
+
1109
+ visit_if(ctx__numeric_expression)
1110
+ end
1111
+
1112
+ def visit_index1(ctx)
1113
+ ctx__index = ctx.index
1114
+
1115
+ visit_if(ctx__index)
1116
+ end
1117
+
1118
+ def visit_index2(ctx)
1119
+ ctx__index = ctx.index
1120
+
1121
+ visit_if(ctx__index)
1122
+ end
1123
+
1124
+ def visit_index_qualifier(ctx)
1125
+ ctx__index1 = ctx.index1
1126
+ ctx__index2 = ctx.index2
1127
+
1128
+ index1 = visit_if(ctx__index1)
1129
+ index2 = visit_if(ctx__index2)
1130
+
1131
+ Model::Expressions::IndexReference.new({
1132
+ index1: index1,
1133
+ index2: index2
1134
+ })
1135
+ end
1136
+
1137
+ def visit_index_reference(ctx)
1138
+ raise 'Invalid state'
1139
+ end
1140
+
1141
+ def visit_instantiable_type(ctx)
1142
+ ctx__concrete_types = ctx.concrete_types
1143
+ ctx__entity_ref = ctx.entity_ref
1144
+
1145
+ visit_if(ctx__concrete_types || ctx__entity_ref)
1146
+ end
1147
+
1148
+ def visit_integer_type(ctx)
1149
+ Model::Types::Integer.new
1150
+ end
1151
+
1152
+ def visit_interface_specification(ctx)
1153
+ ctx__reference_clause = ctx.reference_clause
1154
+ ctx__use_clause = ctx.use_clause
1155
+
1156
+ visit_if(ctx__reference_clause || ctx__use_clause)
1157
+ end
1158
+
1159
+ def visit_interval(ctx)
1160
+ ctx__interval_low = ctx.interval_low
1161
+ ctx__interval_op = ctx.interval_op
1162
+ ctx__interval_item = ctx.interval_item
1163
+ ctx__interval_high = ctx.interval_high
1164
+
1165
+ low = visit_if(ctx__interval_low)
1166
+ operator1 = visit_if(ctx__interval_op[0])
1167
+ item = visit_if(ctx__interval_item)
1168
+ operator2 = visit_if(ctx__interval_op[1])
1169
+ high = visit_if(ctx__interval_high)
1170
+
1171
+ Model::Expressions::Interval.new({
1172
+ low: low,
1173
+ operator1: operator1,
1174
+ item: item,
1175
+ operator2: operator2,
1176
+ high: high
1177
+ })
1178
+ end
1179
+
1180
+ def visit_interval_high(ctx)
1181
+ ctx__simple_expression = ctx.simple_expression
1182
+
1183
+ visit_if(ctx__simple_expression)
1184
+ end
1185
+
1186
+ def visit_interval_item(ctx)
1187
+ ctx__simple_expression = ctx.simple_expression
1188
+
1189
+ visit_if(ctx__simple_expression)
1190
+ end
1191
+
1192
+ def visit_interval_low(ctx)
1193
+ ctx__simple_expression = ctx.simple_expression
1194
+
1195
+ visit_if(ctx__simple_expression)
1196
+ end
1197
+
1198
+ def visit_interval_op(ctx)
1199
+ ctx__text = ctx.text
1200
+ ctx__LESS_THAN = ctx__text == '<'
1201
+ ctx__LESS_THAN_OR_EQUAL = ctx__text == '<='
1202
+
1203
+ if ctx__LESS_THAN
1204
+ Model::Expressions::BinaryExpression::LESS_THAN
1205
+ elsif ctx__LESS_THAN_OR_EQUAL
1206
+ Model::Expressions::BinaryExpression::LESS_THAN_OR_EQUAL
1207
+ else
1208
+ raise 'Invalid state'
1209
+ end
1210
+ end
1211
+
1212
+ def visit_inverse_attr(ctx)
1213
+ ctx__attribute_decl = ctx.attribute_decl
1214
+ ctx__inverse_attr_type = ctx.inverse_attr_type
1215
+ ctx__entity_ref = ctx.entity_ref
1216
+ ctx__attribute_ref = ctx.attribute_ref
1217
+
1218
+ attribute = visit_if(ctx__attribute_decl)
1219
+ type = visit_if(ctx__inverse_attr_type)
1220
+ expression = if ctx__entity_ref
1221
+ ref = visit(ctx__entity_ref)
1222
+ attribute_ref = visit(ctx__attribute_ref)
1223
+
1224
+ Model::Expressions::AttributeReference.new({
1225
+ ref: ref,
1226
+ attribute: attribute_ref
1227
+ })
1228
+ else
1229
+ visit(ctx__attribute_ref)
1230
+ end
1231
+
1232
+ Model::Attribute.new({
1233
+ id: attribute.id,
1234
+ kind: Model::Attribute::INVERSE,
1235
+ supertype_attribute: attribute.supertype_attribute,
1236
+ type: type,
1237
+ expression: expression
1238
+ })
1239
+ end
1240
+
1241
+ def visit_inverse_attr_type(ctx)
1242
+ ctx__SET = ctx.SET
1243
+ ctx__BAG = ctx.BAG
1244
+ ctx__bound_spec = ctx.bound_spec
1245
+ ctx__entity_ref = ctx.entity_ref
1246
+ ctx__bound_spec__bound1 = ctx__bound_spec&.bound1
1247
+ ctx__bound_spec__bound2 = ctx__bound_spec&.bound2
1248
+
1249
+ if ctx__SET
1250
+ bound1 = visit_if(ctx__bound_spec__bound1)
1251
+ bound2 = visit_if(ctx__bound_spec__bound2)
1252
+ base_type = visit_if(ctx__entity_ref)
1253
+
1254
+ Model::Types::Set.new({
1255
+ bound1: bound1,
1256
+ bound2: bound2,
1257
+ base_type: base_type
1258
+ })
1259
+ elsif ctx__BAG
1260
+ bound1 = visit_if(ctx__bound_spec__bound1)
1261
+ bound2 = visit_if(ctx__bound_spec__bound2)
1262
+ base_type = visit_if(ctx__entity_ref)
1263
+
1264
+ Model::Types::Bag.new({
1265
+ bound1: bound1,
1266
+ bound2: bound2,
1267
+ base_type: base_type
1268
+ })
1269
+ else
1270
+ visit_if(ctx__entity_ref)
1271
+ end
1272
+ end
1273
+
1274
+ def visit_inverse_clause(ctx)
1275
+ ctx__inverse_attr = ctx.inverse_attr
1276
+
1277
+ visit_if_map(ctx__inverse_attr)
1278
+ end
1279
+
1280
+ def visit_list_type(ctx)
1281
+ ctx__bound_spec = ctx.bound_spec
1282
+ ctx__UNIQUE = ctx.UNIQUE
1283
+ ctx__instantiable_type = ctx.instantiable_type
1284
+ ctx__bound_spec__bound1 = ctx__bound_spec&.bound1
1285
+ ctx__bound_spec__bound2 = ctx__bound_spec&.bound2
1286
+
1287
+ bound1 = visit_if(ctx__bound_spec__bound1)
1288
+ bound2 = visit_if(ctx__bound_spec__bound2)
1289
+ unique = !!ctx__UNIQUE
1290
+ base_type = visit_if(ctx__instantiable_type)
1291
+
1292
+ Model::Types::List.new({
1293
+ bound1: bound1,
1294
+ bound2: bound2,
1295
+ unique: unique,
1296
+ base_type: base_type
1297
+ })
1298
+ end
1299
+
1300
+ def visit_literal(ctx)
1301
+ ctx__BinaryLiteral = ctx.BinaryLiteral
1302
+ ctx__IntegerLiteral = ctx.IntegerLiteral
1303
+ ctx__logical_literal = ctx.logical_literal
1304
+ ctx__RealLiteral = ctx.RealLiteral
1305
+ ctx__string_literal = ctx.string_literal
1306
+
1307
+ if ctx__BinaryLiteral
1308
+ handle_binary_literal(ctx__BinaryLiteral)
1309
+ elsif ctx__IntegerLiteral
1310
+ handle_integer_literal(ctx__IntegerLiteral)
1311
+ elsif ctx__logical_literal
1312
+ visit(ctx__logical_literal)
1313
+ elsif ctx__RealLiteral
1314
+ handle_real_literal(ctx__RealLiteral)
1315
+ elsif ctx__string_literal
1316
+ visit(ctx__string_literal)
1317
+ else
1318
+ raise 'Invalid state'
1319
+ end
1320
+ end
1321
+
1322
+ def visit_local_decl(ctx)
1323
+ ctx__local_variable = ctx.local_variable
1324
+
1325
+ visit_if_map_flatten(ctx__local_variable)
1326
+ end
1327
+
1328
+ def visit_local_variable(ctx)
1329
+ ctx__variable_id = ctx.variable_id
1330
+ ctx__parameter_type = ctx.parameter_type
1331
+ ctx__expression = ctx.expression
1332
+
1333
+ ids = visit_if_map(ctx__variable_id)
1334
+ type = visit_if(ctx__parameter_type)
1335
+ expression = visit_if(ctx__expression)
1336
+
1337
+ ids.map do |id|
1338
+ Model::Variable.new({
1339
+ id: id,
1340
+ type: type,
1341
+ expression: expression
1342
+ })
1343
+ end
1344
+ end
1345
+
1346
+ def visit_logical_expression(ctx)
1347
+ ctx__expression = ctx.expression
1348
+
1349
+ visit_if(ctx__expression)
1350
+ end
1351
+
1352
+ def visit_logical_literal(ctx)
1353
+ ctx__TRUE = ctx.TRUE
1354
+ ctx__FALSE = ctx.FALSE
1355
+ ctx__UNKNOWN = ctx.UNKNOWN
1356
+
1357
+ value = if ctx__TRUE
1358
+ Model::Literals::Logical::TRUE
1359
+ elsif ctx__FALSE
1360
+ Model::Literals::Logical::FALSE
1361
+ elsif ctx__UNKNOWN
1362
+ Model::Literals::Logical::UNKNOWN
1363
+ else
1364
+ raise 'Invalid state'
1365
+ end
1366
+
1367
+ Model::Literals::Logical.new({
1368
+ value: value
1369
+ })
1370
+ end
1371
+
1372
+ def visit_logical_type(ctx)
1373
+ Model::Types::Logical.new
1374
+ end
1375
+
1376
+ def visit_multiplication_like_op(ctx)
1377
+ ctx__text = ctx.text
1378
+ ctx__MULTIPLICATION = ctx__text == '*'
1379
+ ctx__REAL_DIVISION = ctx__text == '/'
1380
+ ctx__INTEGER_DIVISION = ctx.DIV
1381
+ ctx__MODULO = ctx.MOD
1382
+ ctx__AND = ctx.AND
1383
+ ctx__COMBINE = ctx__text == '||'
1384
+
1385
+ if ctx__MULTIPLICATION
1386
+ Model::Expressions::BinaryExpression::MULTIPLICATION
1387
+ elsif ctx__REAL_DIVISION
1388
+ Model::Expressions::BinaryExpression::REAL_DIVISION
1389
+ elsif ctx__INTEGER_DIVISION
1390
+ Model::Expressions::BinaryExpression::INTEGER_DIVISION
1391
+ elsif ctx__MODULO
1392
+ Model::Expressions::BinaryExpression::MODULO
1393
+ elsif ctx__AND
1394
+ Model::Expressions::BinaryExpression::AND
1395
+ elsif ctx__COMBINE
1396
+ Model::Expressions::BinaryExpression::COMBINE
1397
+ else
1398
+ raise 'Invalid state'
1399
+ end
1400
+ end
1401
+
1402
+ def visit_named_types(ctx)
1403
+ ctx__entity_ref = ctx.entity_ref
1404
+ ctx__type_ref = ctx.type_ref
1405
+
1406
+ visit_if(ctx__entity_ref || ctx__type_ref)
1407
+ end
1408
+
1409
+ def visit_named_type_or_rename(ctx)
1410
+ ctx__named_types = ctx.named_types
1411
+ ctx__entity_id = ctx.entity_id
1412
+ ctx__type_id = ctx.type_id
1413
+
1414
+ ref = visit_if(ctx__named_types)
1415
+ id = visit_if(ctx__entity_id || ctx__type_id)
1416
+
1417
+ if id
1418
+ Model::RenamedRef.new({
1419
+ ref: ref,
1420
+ id: id
1421
+ })
1422
+ else
1423
+ ref
1424
+ end
1425
+ end
1426
+
1427
+ def visit_null_stmt(ctx)
1428
+ Model::Statements::Null.new
1429
+ end
1430
+
1431
+ def visit_number_type(ctx)
1432
+ Model::Types::Number.new
1433
+ end
1434
+
1435
+ def visit_numeric_expression(ctx)
1436
+ ctx__simple_expression = ctx.simple_expression
1437
+
1438
+ visit_if(ctx__simple_expression)
1439
+ end
1440
+
1441
+ def visit_one_of(ctx)
1442
+ ctx__supertype_expression = ctx.supertype_expression
1443
+
1444
+ ref = Model::Expressions::SimpleReference.new({ id: 'ONEOF' })
1445
+ parameters = visit_if_map(ctx__supertype_expression)
1446
+
1447
+ Model::Expressions::Call.new({
1448
+ ref: ref,
1449
+ parameters: parameters
1450
+ })
1451
+ end
1452
+
1453
+ def visit_parameter(ctx)
1454
+ ctx__expression = ctx.expression
1455
+
1456
+ visit_if(ctx__expression)
1457
+ end
1458
+
1459
+ def visit_parameter_id(ctx)
1460
+ ctx__SimpleId = ctx.SimpleId
1461
+
1462
+ handle_simple_id(ctx__SimpleId)
1463
+ end
1464
+
1465
+ def visit_parameter_type(ctx)
1466
+ ctx__generalized_types = ctx.generalized_types
1467
+ ctx__named_types = ctx.named_types
1468
+ ctx__simple_types = ctx.simple_types
1469
+
1470
+ visit_if(ctx__generalized_types || ctx__named_types || ctx__simple_types)
1471
+ end
1472
+
1473
+ def visit_population(ctx)
1474
+ ctx__entity_ref = ctx.entity_ref
1475
+
1476
+ visit_if(ctx__entity_ref)
1477
+ end
1478
+
1479
+ def visit_precision_spec(ctx)
1480
+ ctx__numeric_expression = ctx.numeric_expression
1481
+
1482
+ visit_if(ctx__numeric_expression)
1483
+ end
1484
+
1485
+ def visit_primary(ctx)
1486
+ ctx__literal = ctx.literal
1487
+ ctx__qualifiable_factor = ctx.qualifiable_factor
1488
+ ctx__qualifier = ctx.qualifier
1489
+
1490
+ if ctx__literal
1491
+ visit(ctx__literal)
1492
+ elsif ctx__qualifiable_factor
1493
+ handle_qualified_ref(visit(ctx__qualifiable_factor), ctx__qualifier)
1494
+ else
1495
+ raise 'Invalid state'
1496
+ end
1497
+ end
1498
+
1499
+ def visit_procedure_call_stmt(ctx)
1500
+ ctx__built_in_procedure = ctx.built_in_procedure
1501
+ ctx__procedure_ref = ctx.procedure_ref
1502
+ ctx__actual_parameter_list = ctx.actual_parameter_list
1503
+
1504
+ ref = visit_if(ctx__built_in_procedure || ctx__procedure_ref)
1505
+ parameters = visit_if(ctx__actual_parameter_list)
1506
+
1507
+ Model::Statements::Call.new({
1508
+ ref: ref,
1509
+ parameters: parameters
1510
+ })
1511
+ end
1512
+
1513
+ def visit_procedure_decl(ctx)
1514
+ ctx__procedure_head = ctx.procedure_head
1515
+ ctx__algorithm_head = ctx.algorithm_head
1516
+ ctx__stmt = ctx.stmt
1517
+ ctx__procedure_head__procedure_id = ctx__procedure_head&.procedure_id
1518
+ ctx__procedure_head__procedure_head_parameter = ctx__procedure_head&.procedure_head_parameter
1519
+ ctx__algorithm_head__declaration = ctx__algorithm_head&.declaration
1520
+ ctx__algorithm_head__constant_decl = ctx__algorithm_head&.constant_decl
1521
+ ctx__algorithm_head__local_decl = ctx__algorithm_head&.local_decl
1522
+
1523
+ id = visit_if(ctx__procedure_head__procedure_id)
1524
+ parameters = visit_if_map_flatten(ctx__procedure_head__procedure_head_parameter)
1525
+ declarations = visit_if_map(ctx__algorithm_head__declaration)
1526
+ constants = visit_if(ctx__algorithm_head__constant_decl)
1527
+ variables = visit_if(ctx__algorithm_head__local_decl)
1528
+ statements = visit_if_map(ctx__stmt)
1529
+
1530
+ Model::Procedure.new({
1531
+ id: id,
1532
+ parameters: parameters,
1533
+ declarations: declarations,
1534
+ constants: constants,
1535
+ variables: variables,
1536
+ statements: statements
1537
+ })
1538
+ end
1539
+
1540
+ def visit_procedure_head(ctx)
1541
+ raise 'Invalid state'
1542
+ end
1543
+
1544
+ def visit_procedure_head_parameter(ctx)
1545
+ ctx__formal_parameter = ctx.formal_parameter
1546
+ ctx__VAR = ctx.VAR
1547
+
1548
+ parameters = visit(ctx__formal_parameter)
1549
+
1550
+ if ctx.VAR
1551
+ parameters.map do |parameter|
1552
+ Model::Parameter.new({
1553
+ id: parameter.id,
1554
+ var: true,
1555
+ type: parameter.type
1556
+ })
1557
+ end
1558
+ else
1559
+ parameters
1560
+ end
1561
+ end
1562
+
1563
+ def visit_procedure_id(ctx)
1564
+ ctx__SimpleId = ctx.SimpleId
1565
+
1566
+ handle_simple_id(ctx__SimpleId)
1567
+ end
1568
+
1569
+ def visit_qualifiable_factor(ctx)
1570
+ ctx__attribute_ref = ctx.attribute_ref
1571
+ ctx__constant_factor = ctx.constant_factor
1572
+ ctx__function_call = ctx.function_call
1573
+ ctx__general_ref = ctx.general_ref
1574
+ ctx__population = ctx.population
1575
+
1576
+ visit_if(ctx__attribute_ref || ctx__constant_factor || ctx__function_call || ctx__general_ref || ctx__population)
1577
+ end
1578
+
1579
+ def visit_qualified_attribute(ctx)
1580
+ ctx__group_qualifier = ctx.group_qualifier
1581
+ ctx__attribute_qualifier = ctx.attribute_qualifier
1582
+
1583
+ id = 'SELF'
1584
+ group_reference = visit_if(ctx__group_qualifier)
1585
+ attribute_reference = visit_if(ctx__attribute_qualifier)
1586
+
1587
+ Model::Expressions::AttributeReference.new({
1588
+ ref: Model::Expressions::GroupReference.new({
1589
+ ref: Model::Expressions::SimpleReference.new({
1590
+ id: id
1591
+ }),
1592
+ entity: group_reference.entity
1593
+ }),
1594
+ attribute: attribute_reference.attribute
1595
+ })
1596
+ end
1597
+
1598
+ def visit_qualifier(ctx)
1599
+ ctx__attribute_qualifier = ctx.attribute_qualifier
1600
+ ctx__group_qualifier = ctx.group_qualifier
1601
+ ctx__index_qualifier = ctx.index_qualifier
1602
+
1603
+ visit_if(ctx__attribute_qualifier || ctx__group_qualifier || ctx__index_qualifier)
1604
+ end
1605
+
1606
+ def visit_query_expression(ctx)
1607
+ ctx__variable_id = ctx.variable_id
1608
+ ctx__aggregate_source = ctx.aggregate_source
1609
+ ctx__logical_expression = ctx.logical_expression
1610
+
1611
+ id = visit_if(ctx__variable_id)
1612
+ source = visit_if(ctx__aggregate_source)
1613
+ expression = visit_if(ctx__logical_expression)
1614
+
1615
+ Model::Expressions::QueryExpression.new({
1616
+ id: id,
1617
+ source: source,
1618
+ expression: expression
1619
+ })
1620
+ end
1621
+
1622
+ def visit_real_type(ctx)
1623
+ ctx__precision_spec = ctx.precision_spec
1624
+
1625
+ precision = visit_if(ctx__precision_spec)
1626
+
1627
+ Model::Types::Real.new({
1628
+ precision: precision
1629
+ })
1630
+ end
1631
+
1632
+ def visit_redeclared_attribute(ctx)
1633
+ raise 'Invalid state'
1634
+ end
1635
+
1636
+ def visit_referenced_attribute(ctx)
1637
+ ctx__attribute_ref = ctx.attribute_ref
1638
+ ctx__qualified_attribute = ctx.qualified_attribute
1639
+
1640
+ visit_if(ctx__attribute_ref || ctx__qualified_attribute)
1641
+ end
1642
+
1643
+ def visit_reference_clause(ctx)
1644
+ ctx__schema_ref = ctx.schema_ref
1645
+ ctx__resource_or_rename = ctx.resource_or_rename
1646
+
1647
+ schema = visit_if(ctx__schema_ref)
1648
+ items = visit_if_map(ctx__resource_or_rename)
1649
+
1650
+ Model::Interface.new({
1651
+ kind: Model::Interface::REFERENCE,
1652
+ schema: schema,
1653
+ items: items
1654
+ })
1655
+ end
1656
+
1657
+ def visit_rel_op(ctx)
1658
+ ctx__text = ctx.text
1659
+ ctx__LESS_THAN = ctx__text == '<'
1660
+ ctx__GREATER_THAN = ctx__text == '>'
1661
+ ctx__LESS_THAN_OR_EQUAL = ctx__text == '<='
1662
+ ctx__GREATER_THAN_OR_EQUAL = ctx__text == '>='
1663
+ ctx__NOT_EQUAL = ctx__text == '<>'
1664
+ ctx__EQUAL = ctx__text == '='
1665
+ ctx__INSTANCE_NOT_EQUAL = ctx__text == ':<>:'
1666
+ ctx__INSTANCE_EQUAL = ctx__text == ':=:'
1667
+
1668
+ if ctx__LESS_THAN
1669
+ Model::Expressions::BinaryExpression::LESS_THAN
1670
+ elsif ctx__GREATER_THAN
1671
+ Model::Expressions::BinaryExpression::GREATER_THAN
1672
+ elsif ctx__LESS_THAN_OR_EQUAL
1673
+ Model::Expressions::BinaryExpression::LESS_THAN_OR_EQUAL
1674
+ elsif ctx__GREATER_THAN_OR_EQUAL
1675
+ Model::Expressions::BinaryExpression::GREATER_THAN_OR_EQUAL
1676
+ elsif ctx__NOT_EQUAL
1677
+ Model::Expressions::BinaryExpression::NOT_EQUAL
1678
+ elsif ctx__EQUAL
1679
+ Model::Expressions::BinaryExpression::EQUAL
1680
+ elsif ctx__INSTANCE_NOT_EQUAL
1681
+ Model::Expressions::BinaryExpression::INSTANCE_NOT_EQUAL
1682
+ elsif ctx__INSTANCE_EQUAL
1683
+ Model::Expressions::BinaryExpression::INSTANCE_EQUAL
1684
+ else
1685
+ raise 'Invalid state'
1686
+ end
1687
+ end
1688
+
1689
+ def visit_rel_op_extended(ctx)
1690
+ ctx__rel_op = ctx.rel_op
1691
+ ctx__IN = ctx.IN
1692
+ ctx__LIKE = ctx.LIKE
1693
+
1694
+ if ctx__rel_op
1695
+ visit(ctx__rel_op)
1696
+ elsif ctx__IN
1697
+ Model::Expressions::BinaryExpression::IN
1698
+ elsif ctx__LIKE
1699
+ Model::Expressions::BinaryExpression::LIKE
1700
+ else
1701
+ raise 'Invalid state'
1702
+ end
1703
+ end
1704
+
1705
+ def visit_rename_id(ctx)
1706
+ ctx__constant_id = ctx.constant_id
1707
+ ctx__entity_id = ctx.entity_id
1708
+ ctx__function_id = ctx.function_id
1709
+ ctx__procedure_id = ctx.procedure_id
1710
+ ctx__type_id = ctx.type_id
1711
+
1712
+ visit_if(ctx__constant_id || ctx__entity_id || ctx__function_id || ctx__procedure_id || ctx__type_id)
1713
+ end
1714
+
1715
+ def visit_repeat_control(ctx)
1716
+ raise 'Invalid state'
1717
+ end
1718
+
1719
+ def visit_repeat_stmt(ctx)
1720
+ ctx__repeat_control = ctx.repeat_control
1721
+ ctx__stmt = ctx.stmt
1722
+ ctx__repeat_control__increment_control = ctx__repeat_control&.increment_control
1723
+ ctx__repeat_control__increment_control__variable_id = ctx__repeat_control__increment_control&.variable_id
1724
+ ctx__repeat_control__increment_control__bound1 = ctx__repeat_control__increment_control&.bound1
1725
+ ctx__repeat_control__increment_control__bound2 = ctx__repeat_control__increment_control&.bound2
1726
+ ctx__repeat_control__increment_control__increment = ctx__repeat_control__increment_control&.increment
1727
+ ctx__repeat_control__while_control = ctx__repeat_control&.while_control
1728
+ ctx__repeat_control__until_control = ctx__repeat_control&.until_control
1729
+
1730
+ id = visit_if(ctx__repeat_control__increment_control__variable_id)
1731
+ bound1 = visit_if(ctx__repeat_control__increment_control__bound1)
1732
+ bound2 = visit_if(ctx__repeat_control__increment_control__bound2)
1733
+ increment = visit_if(ctx__repeat_control__increment_control__increment)
1734
+ while_expression = visit_if(ctx__repeat_control__while_control)
1735
+ until_expression = visit_if(ctx__repeat_control__until_control)
1736
+ statements = visit_if_map(ctx__stmt)
1737
+
1738
+ Model::Statements::Repeat.new({
1739
+ id: id,
1740
+ bound1: bound1,
1741
+ bound2: bound2,
1742
+ increment: increment,
1743
+ while_expression: while_expression,
1744
+ until_expression: until_expression,
1745
+ statements: statements
1746
+ })
1747
+ end
1748
+
1749
+ def visit_repetition(ctx)
1750
+ ctx__numeric_expression = ctx.numeric_expression
1751
+
1752
+ visit_if(ctx__numeric_expression)
1753
+ end
1754
+
1755
+ def visit_resource_or_rename(ctx)
1756
+ ctx__resource_ref = ctx.resource_ref
1757
+ ctx__rename_id = ctx.rename_id
1758
+
1759
+ if ctx__resource_ref
1760
+ if ctx__rename_id
1761
+ ref = visit(ctx__resource_ref)
1762
+ id = visit(ctx__rename_id)
1763
+
1764
+ Model::RenamedRef.new({
1765
+ ref: ref,
1766
+ id: id
1767
+ })
1768
+ else
1769
+ visit(ctx__resource_ref)
1770
+ end
1771
+ else
1772
+ raise 'Invalid state'
1773
+ end
1774
+ end
1775
+
1776
+ def visit_resource_ref(ctx)
1777
+ ctx__constant_ref = ctx.constant_ref
1778
+ ctx__entity_ref = ctx.entity_ref
1779
+ ctx__function_ref = ctx.function_ref
1780
+ ctx__procedure_ref = ctx.procedure_ref
1781
+ ctx__type_ref = ctx.type_ref
1782
+
1783
+ visit_if(ctx__constant_ref || ctx__entity_ref || ctx__function_ref || ctx__procedure_ref || ctx__type_ref)
1784
+ end
1785
+
1786
+ def visit_return_stmt(ctx)
1787
+ ctx__expression = ctx.expression
1788
+
1789
+ expression = visit_if(ctx__expression)
1790
+
1791
+ Model::Statements::Return.new({
1792
+ expression: expression
1793
+ })
1794
+ end
1795
+
1796
+ def visit_rule_decl(ctx)
1797
+ ctx__rule_head = ctx.rule_head
1798
+ ctx__algorithm_head = ctx.algorithm_head
1799
+ ctx__stmt = ctx.stmt
1800
+ ctx__where_clause = ctx.where_clause
1801
+ ctx__rule_head__rule_id = ctx__rule_head&.rule_id
1802
+ ctx__rule_head__entity_ref = ctx__rule_head&.entity_ref
1803
+ ctx__algorithm_head__declaration = ctx__algorithm_head&.declaration
1804
+ ctx__algorithm_head__constant_decl = ctx__algorithm_head&.constant_decl
1805
+ ctx__algorithm_head__local_decl = ctx__algorithm_head&.local_decl
1806
+
1807
+ id = visit_if(ctx__rule_head__rule_id)
1808
+ applies_to = visit_if_map(ctx__rule_head__entity_ref)
1809
+ declarations = visit_if_map(ctx__algorithm_head__declaration)
1810
+ constants = visit_if(ctx__algorithm_head__constant_decl)
1811
+ variables = visit_if(ctx__algorithm_head__local_decl)
1812
+ statements = visit_if_map(ctx__stmt)
1813
+ where = visit_if(ctx__where_clause)
1814
+
1815
+ Model::Rule.new({
1816
+ id: id,
1817
+ applies_to: applies_to,
1818
+ declarations: declarations,
1819
+ constants: constants,
1820
+ variables: variables,
1821
+ statements: statements,
1822
+ where: where
1823
+ })
1824
+ end
1825
+
1826
+ def visit_rule_head(ctx)
1827
+ raise 'Invalid state'
1828
+ end
1829
+
1830
+ def visit_rule_id(ctx)
1831
+ ctx__SimpleId = ctx.SimpleId
1832
+
1833
+ handle_simple_id(ctx__SimpleId)
1834
+ end
1835
+
1836
+ def visit_rule_label_id(ctx)
1837
+ ctx__SimpleId = ctx.SimpleId
1838
+
1839
+ handle_simple_id(ctx__SimpleId)
1840
+ end
1841
+
1842
+ def visit_schema_body(ctx)
1843
+ raise 'Invalid state'
1844
+ end
1845
+
1846
+ def visit_schema_body_declaration(ctx)
1847
+ ctx__declaration = ctx.declaration
1848
+ ctx__rule_decl = ctx.rule_decl
1849
+
1850
+ visit_if(ctx__declaration || ctx__rule_decl)
1851
+ end
1852
+
1853
+ def visit_schema_decl(ctx)
1854
+ ctx__schema_id = ctx.schema_id
1855
+ ctx__schema_version_id = ctx.schema_version_id
1856
+ ctx__schema_body = ctx.schema_body
1857
+ ctx__schema_body__interface_specification = ctx__schema_body&.interface_specification
1858
+ ctx__schema_body__constant_decl = ctx__schema_body&.constant_decl
1859
+ ctx__schema_body__schema_body_declaration = ctx__schema_body&.schema_body_declaration
1860
+
1861
+ id = visit_if(ctx__schema_id)
1862
+ version = visit_if(ctx__schema_version_id)
1863
+ interfaces = visit_if_map(ctx__schema_body__interface_specification)
1864
+ constants = visit_if(ctx__schema_body__constant_decl)
1865
+ declarations = visit_if_map(ctx__schema_body__schema_body_declaration)
1866
+
1867
+ Model::Schema.new({
1868
+ id: id,
1869
+ version: version,
1870
+ interfaces: interfaces,
1871
+ constants: constants,
1872
+ declarations: declarations
1873
+ })
1874
+ end
1875
+
1876
+ def visit_schema_id(ctx)
1877
+ ctx__SimpleId = ctx.SimpleId
1878
+
1879
+ handle_simple_id(ctx__SimpleId)
1880
+ end
1881
+
1882
+ def visit_schema_version_id(ctx)
1883
+ ctx__string_literal = ctx.string_literal
1884
+
1885
+ visit_if(ctx__string_literal)
1886
+ end
1887
+
1888
+ def visit_selector(ctx)
1889
+ raise 'Invalid state'
1890
+ end
1891
+
1892
+ def visit_select_extension(ctx)
1893
+ ctx__named_types = ctx.named_types
1894
+
1895
+ visit_if_map(ctx__named_types)
1896
+ end
1897
+
1898
+ def visit_select_list(ctx)
1899
+ ctx__named_types = ctx.named_types
1900
+
1901
+ visit_if_map(ctx__named_types)
1902
+ end
1903
+
1904
+ def visit_select_type(ctx)
1905
+ ctx__EXTENSIBLE = ctx.EXTENSIBLE
1906
+ ctx__GENERIC_ENTITY = ctx.GENERIC_ENTITY
1907
+ ctx__select_list = ctx.select_list
1908
+ ctx__select_extension = ctx.select_extension
1909
+ ctx__select_extension__type_ref = ctx.select_extension&.type_ref
1910
+ ctx__select_extension__select_list = ctx__select_extension&.select_list
1911
+
1912
+ extensible = !!ctx__EXTENSIBLE
1913
+ generic_entity = !!ctx__GENERIC_ENTITY
1914
+ items = visit_if(ctx__select_list)
1915
+ extension_type = visit_if(ctx__select_extension__type_ref)
1916
+ extension_items = visit_if(ctx__select_extension__select_list)
1917
+
1918
+ Model::Types::Select.new({
1919
+ extensible: extensible,
1920
+ generic_entity: generic_entity,
1921
+ items: items,
1922
+ extension_type: extension_type,
1923
+ extension_items: extension_items
1924
+ })
1925
+ end
1926
+
1927
+ def visit_set_type(ctx)
1928
+ ctx__bound_spec = ctx.bound_spec
1929
+ ctx__instantiable_type = ctx.instantiable_type
1930
+ ctx__bound_spec__bound1 = ctx__bound_spec&.bound1
1931
+ ctx__bound_spec__bound2 = ctx__bound_spec&.bound2
1932
+
1933
+ bound1 = visit_if(ctx__bound_spec__bound1)
1934
+ bound2 = visit_if(ctx__bound_spec__bound2)
1935
+ base_type = visit_if(ctx__instantiable_type)
1936
+
1937
+ Model::Types::Set.new({
1938
+ bound1: bound1,
1939
+ bound2: bound2,
1940
+ base_type: base_type
1941
+ })
1942
+ end
1943
+
1944
+ def visit_simple_expression(ctx)
1945
+ ctx__term = ctx.term
1946
+ ctx__add_like_op = ctx.add_like_op
1947
+
1948
+ if ctx__term
1949
+ if ctx__term.length >= 2
1950
+ if ctx__add_like_op and ctx__add_like_op.length == ctx__term.length - 1
1951
+ operands = ctx__term.map(&self.method(:visit))
1952
+ operators = ctx__add_like_op.map(&self.method(:visit))
1953
+
1954
+ handle_binary_expression(operands, operators)
1955
+ else
1956
+ raise 'Invalid state'
1957
+ end
1958
+ elsif ctx__term.length == 1
1959
+ visit(ctx__term[0])
1960
+ else
1961
+ raise 'Invalid state'
1962
+ end
1963
+ end
1964
+ end
1965
+
1966
+ def visit_simple_factor(ctx)
1967
+ ctx__aggregate_initializer = ctx.aggregate_initializer
1968
+ ctx__entity_constructor = ctx.entity_constructor
1969
+ ctx__enumeration_reference = ctx.enumeration_reference
1970
+ ctx__interval = ctx.interval
1971
+ ctx__query_expression = ctx.query_expression
1972
+ ctx__simple_factor_expression = ctx.simple_factor_expression
1973
+ ctx__simple_factor_unary_expression = ctx.simple_factor_unary_expression
1974
+
1975
+ visit_if(ctx__aggregate_initializer || ctx__entity_constructor || ctx__enumeration_reference || ctx__interval || ctx__query_expression || ctx__simple_factor_expression || ctx__simple_factor_unary_expression)
1976
+ end
1977
+
1978
+ def visit_simple_factor_expression(ctx)
1979
+ ctx__expression = ctx.expression
1980
+ ctx__primary = ctx.primary
1981
+
1982
+ visit_if(ctx__expression || ctx__primary)
1983
+ end
1984
+
1985
+ def visit_simple_factor_unary_expression(ctx)
1986
+ ctx__unary_op = ctx.unary_op
1987
+ ctx__simple_factor_expression = ctx.simple_factor_expression
1988
+
1989
+ operator = visit_if(ctx__unary_op)
1990
+ operand = visit_if(ctx__simple_factor_expression)
1991
+
1992
+ Model::Expressions::UnaryExpression.new({
1993
+ operator: operator,
1994
+ operand: operand
1995
+ })
1996
+ end
1997
+
1998
+ def visit_simple_types(ctx)
1999
+ ctx__binary_type = ctx.binary_type
2000
+ ctx__boolean_type = ctx.boolean_type
2001
+ ctx__integer_type = ctx.integer_type
2002
+ ctx__logical_type = ctx.logical_type
2003
+ ctx__number_type = ctx.number_type
2004
+ ctx__real_type = ctx.real_type
2005
+ ctx__string_type = ctx.string_type
2006
+
2007
+ visit_if(ctx__binary_type || ctx__boolean_type || ctx__integer_type || ctx__logical_type || ctx__number_type || ctx__real_type || ctx__string_type)
2008
+ end
2009
+
2010
+ def visit_skip_stmt(ctx)
2011
+ Model::Statements::Skip.new
2012
+ end
2013
+
2014
+ def visit_stmt(ctx)
2015
+ ctx__alias_stmt = ctx.alias_stmt
2016
+ ctx__assignment_stmt = ctx.assignment_stmt
2017
+ ctx__case_stmt = ctx.case_stmt
2018
+ ctx__compound_stmt = ctx.compound_stmt
2019
+ ctx__escape_stmt = ctx.escape_stmt
2020
+ ctx__if_stmt = ctx.if_stmt
2021
+ ctx__null_stmt = ctx.null_stmt
2022
+ ctx__procedure_call_stmt = ctx.procedure_call_stmt
2023
+ ctx__repeat_stmt = ctx.repeat_stmt
2024
+ ctx__return_stmt = ctx.return_stmt
2025
+ ctx__skip_stmt = ctx.skip_stmt
2026
+
2027
+ visit_if(ctx__alias_stmt || ctx__assignment_stmt || ctx__case_stmt || ctx__compound_stmt || ctx__escape_stmt || ctx__if_stmt || ctx__null_stmt || ctx__procedure_call_stmt || ctx__repeat_stmt || ctx__return_stmt || ctx__skip_stmt)
2028
+ end
2029
+
2030
+ def visit_string_literal(ctx)
2031
+ ctx__SimpleStringLiteral = ctx.SimpleStringLiteral
2032
+ ctx__EncodedStringLiteral = ctx.EncodedStringLiteral
2033
+
2034
+ if ctx__SimpleStringLiteral
2035
+ handle_simple_string_literal(ctx__SimpleStringLiteral)
2036
+ elsif ctx__EncodedStringLiteral
2037
+ handle_encoded_string_literal(ctx__EncodedStringLiteral)
2038
+ else
2039
+ raise 'Invalid state'
2040
+ end
2041
+ end
2042
+
2043
+ def visit_string_type(ctx)
2044
+ ctx__width_spec = ctx.width_spec
2045
+ ctx__width_spec__width = ctx__width_spec&.width
2046
+ ctx__width_spec__FIXED = ctx__width_spec&.FIXED
2047
+
2048
+ width = visit_if(ctx__width_spec__width)
2049
+ fixed = !!ctx__width_spec__FIXED
2050
+
2051
+ Model::Types::String.new({
2052
+ width: width,
2053
+ fixed: fixed
2054
+ })
2055
+ end
2056
+
2057
+ def visit_subsuper(ctx)
2058
+ raise 'Invalid state'
2059
+ end
2060
+
2061
+ def visit_subtype_constraint(ctx)
2062
+ ctx__supertype_expression = ctx.supertype_expression
2063
+
2064
+ visit_if(ctx__supertype_expression)
2065
+ end
2066
+
2067
+ def visit_subtype_constraint_body(ctx)
2068
+ raise 'Invalid state'
2069
+ end
2070
+
2071
+ def visit_subtype_constraint_decl(ctx)
2072
+ ctx__subtype_constraint_head = ctx.subtype_constraint_head
2073
+ ctx__subtype_constraint_body = ctx.subtype_constraint_body
2074
+ ctx__subtype_constraint_head__subtype_constraint_id = ctx__subtype_constraint_head&.subtype_constraint_id
2075
+ ctx__subtype_constraint_head__entity_ref = ctx__subtype_constraint_head&.entity_ref
2076
+ ctx__subtype_constraint_body__abstract_supertype = ctx__subtype_constraint_body&.abstract_supertype
2077
+ ctx__subtype_constraint_body__total_over = ctx__subtype_constraint_body&.total_over
2078
+ ctx__subtype_constraint_body__supertype_expression = ctx__subtype_constraint_body&.supertype_expression
2079
+
2080
+ id = visit_if(ctx__subtype_constraint_head__subtype_constraint_id)
2081
+ applies_to = visit_if(ctx__subtype_constraint_head__entity_ref)
2082
+ abstract = !!ctx__subtype_constraint_body__abstract_supertype
2083
+ total_over = visit_if(ctx__subtype_constraint_body__total_over)
2084
+ supertype_expression = visit_if(ctx__subtype_constraint_body__supertype_expression)
2085
+
2086
+ Model::SubtypeConstraint.new({
2087
+ id: id,
2088
+ applies_to: applies_to,
2089
+ abstract: abstract,
2090
+ total_over: total_over,
2091
+ supertype_expression: supertype_expression
2092
+ })
2093
+ end
2094
+
2095
+ def visit_subtype_constraint_head(ctx)
2096
+ raise 'Invalid state'
2097
+ end
2098
+
2099
+ def visit_subtype_constraint_id(ctx)
2100
+ ctx__SimpleId = ctx.SimpleId
2101
+
2102
+ handle_simple_id(ctx__SimpleId)
2103
+ end
2104
+
2105
+ def visit_subtype_declaration(ctx)
2106
+ ctx__entity_ref = ctx.entity_ref
2107
+
2108
+ visit_if_map(ctx__entity_ref)
2109
+ end
2110
+
2111
+ def visit_supertype_constraint(ctx)
2112
+ raise 'Invalid state'
2113
+ end
2114
+
2115
+ def visit_supertype_expression(ctx)
2116
+ ctx__supertype_factor = ctx.supertype_factor
2117
+ ctx__ANDOR = ctx.ANDOR
2118
+
2119
+ if ctx__supertype_factor
2120
+ if ctx__supertype_factor.length >= 2
2121
+ if ctx__ANDOR and ctx__ANDOR.length == ctx__supertype_factor.length - 1
2122
+ operands = ctx__supertype_factor.map(&self.method(:visit))
2123
+ operators = ctx__ANDOR.map{Model::Expressions::BinaryExpression::ANDOR}
2124
+
2125
+ handle_binary_expression(operands, operators)
2126
+ else
2127
+ raise 'Invalid state'
2128
+ end
2129
+ elsif ctx__supertype_factor.length == 1
2130
+ visit(ctx__supertype_factor[0])
2131
+ else
2132
+ raise 'Invalid state'
2133
+ end
2134
+ end
2135
+ end
2136
+
2137
+ def visit_supertype_factor(ctx)
2138
+ ctx__supertype_term = ctx.supertype_term
2139
+ ctx__AND = ctx.AND
2140
+
2141
+ if ctx__supertype_term
2142
+ if ctx__supertype_term.length >= 2
2143
+ if ctx__AND and ctx__AND.length == ctx__supertype_term.length - 1
2144
+ operands = ctx__supertype_term.map(&self.method(:visit))
2145
+ operators = ctx__AND.map{Model::Expressions::BinaryExpression::AND}
2146
+
2147
+ handle_binary_expression(operands, operators)
2148
+ else
2149
+ raise 'Invalid state'
2150
+ end
2151
+ elsif ctx__supertype_term.length == 1
2152
+ visit(ctx__supertype_term[0])
2153
+ else
2154
+ raise 'Invalid state'
2155
+ end
2156
+ end
2157
+ end
2158
+
2159
+ def visit_supertype_rule(ctx)
2160
+ ctx__subtype_constraint = ctx.subtype_constraint
2161
+
2162
+ visit_if(ctx__subtype_constraint)
2163
+ end
2164
+
2165
+ def visit_supertype_term(ctx)
2166
+ ctx__entity_ref = ctx.entity_ref
2167
+ ctx__one_of = ctx.one_of
2168
+ ctx__supertype_expression = ctx.supertype_expression
2169
+
2170
+ visit_if(ctx__entity_ref || ctx__one_of || ctx__supertype_expression)
2171
+ end
2172
+
2173
+ def visit_syntax(ctx)
2174
+ ctx__schema_decl = ctx.schema_decl
2175
+
2176
+ schemas = visit_if_map(ctx__schema_decl)
2177
+
2178
+ Model::Repository.new({
2179
+ schemas: schemas
2180
+ })
2181
+ end
2182
+
2183
+ def visit_term(ctx)
2184
+ ctx__factor = ctx.factor
2185
+ ctx__multiplication_like_op = ctx.multiplication_like_op
2186
+
2187
+ if ctx__factor
2188
+ if ctx__factor.length >= 2
2189
+ if ctx__multiplication_like_op and ctx__multiplication_like_op.length == ctx__factor.length - 1
2190
+ operands = ctx__factor.map(&self.method(:visit))
2191
+ operators = ctx__multiplication_like_op.map(&self.method(:visit))
2192
+
2193
+ handle_binary_expression(operands, operators)
2194
+ else
2195
+ raise 'Invalid state'
2196
+ end
2197
+ elsif ctx__factor.length == 1
2198
+ visit(ctx__factor[0])
2199
+ else
2200
+ raise 'Invalid state'
2201
+ end
2202
+ end
2203
+ end
2204
+
2205
+ def visit_total_over(ctx)
2206
+ ctx__entity_ref = ctx.entity_ref
2207
+
2208
+ visit_if_map(ctx__entity_ref)
2209
+ end
2210
+
2211
+ def visit_type_decl(ctx)
2212
+ ctx__type_id = ctx.type_id
2213
+ ctx__underlying_type = ctx.underlying_type
2214
+ ctx__where_clause = ctx.where_clause
2215
+
2216
+ id = visit_if(ctx__type_id)
2217
+ type = visit_if(ctx__underlying_type)
2218
+ where = visit_if(ctx__where_clause)
2219
+
2220
+ Model::Type.new({
2221
+ id: id,
2222
+ type: type,
2223
+ where: where
2224
+ })
2225
+ end
2226
+
2227
+ def visit_type_id(ctx)
2228
+ ctx__SimpleId = ctx.SimpleId
2229
+
2230
+ handle_simple_id(ctx__SimpleId)
2231
+ end
2232
+
2233
+ def visit_type_label(ctx)
2234
+ ctx__type_label_id = ctx.type_label_id
2235
+ ctx__type_label_ref = ctx.type_label_ref
2236
+
2237
+ visit_if(ctx__type_label_id || ctx__type_label_ref)
2238
+ end
2239
+
2240
+ def visit_type_label_id(ctx)
2241
+ ctx__SimpleId = ctx.SimpleId
2242
+
2243
+ handle_simple_id(ctx__SimpleId)
2244
+ end
2245
+
2246
+ def visit_unary_op(ctx)
2247
+ ctx__text = ctx.text
2248
+ ctx__PLUS = ctx__text == '+'
2249
+ ctx__MINUS = ctx__text == '-'
2250
+ ctx__NOT = ctx.NOT
2251
+
2252
+ if ctx__PLUS
2253
+ Model::Expressions::UnaryExpression::PLUS
2254
+ elsif ctx__MINUS
2255
+ Model::Expressions::UnaryExpression::MINUS
2256
+ elsif ctx__NOT
2257
+ Model::Expressions::UnaryExpression::NOT
2258
+ else
2259
+ raise 'Invalid state'
2260
+ end
2261
+ end
2262
+
2263
+ def visit_underlying_type(ctx)
2264
+ ctx__concrete_types = ctx.concrete_types
2265
+ ctx__constructed_types = ctx.constructed_types
2266
+
2267
+ visit_if(ctx__concrete_types || ctx__constructed_types)
2268
+ end
2269
+
2270
+ def visit_unique_clause(ctx)
2271
+ ctx__unique_rule = ctx.unique_rule
2272
+
2273
+ visit_if_map(ctx__unique_rule)
2274
+ end
2275
+
2276
+ def visit_unique_rule(ctx)
2277
+ ctx__rule_label_id = ctx.rule_label_id
2278
+ ctx__referenced_attribute = ctx.referenced_attribute
2279
+
2280
+ id = visit_if(ctx__rule_label_id)
2281
+ attributes = visit_if_map(ctx__referenced_attribute)
2282
+
2283
+ Model::Unique.new({
2284
+ id: id,
2285
+ attributes: attributes
2286
+ })
2287
+ end
2288
+
2289
+ def visit_until_control(ctx)
2290
+ ctx__logical_expression = ctx.logical_expression
2291
+
2292
+ visit_if(ctx__logical_expression)
2293
+ end
2294
+
2295
+ def visit_use_clause(ctx)
2296
+ ctx__schema_ref = ctx.schema_ref
2297
+ ctx__named_type_or_rename = ctx.named_type_or_rename
2298
+
2299
+ schema = visit_if(ctx__schema_ref)
2300
+ items = visit_if_map(ctx__named_type_or_rename)
2301
+
2302
+ Model::Interface.new({
2303
+ kind: Model::Interface::USE,
2304
+ schema: schema,
2305
+ items: items
2306
+ })
2307
+ end
2308
+
2309
+ def visit_variable_id(ctx)
2310
+ ctx__SimpleId = ctx.SimpleId
2311
+
2312
+ handle_simple_id(ctx__SimpleId)
2313
+ end
2314
+
2315
+ def visit_where_clause(ctx)
2316
+ ctx__domain_rule = ctx.domain_rule
2317
+
2318
+ visit_if_map(ctx__domain_rule)
2319
+ end
2320
+
2321
+ def visit_while_control(ctx)
2322
+ ctx__logical_expression = ctx.logical_expression
2323
+
2324
+ visit_if(ctx__logical_expression)
2325
+ end
2326
+
2327
+ def visit_width(ctx)
2328
+ ctx__numeric_expression = ctx.numeric_expression
2329
+
2330
+ visit_if(ctx__numeric_expression)
2331
+ end
2332
+
2333
+ def visit_width_spec(ctx)
2334
+ raise 'Invalid state'
2335
+ end
2336
+
2337
+ private
2338
+
2339
+ def handle_binary_expression(operands, operators)
2340
+ if operands.length != operators.length + 1
2341
+ raise 'Invalid state'
2342
+ end
2343
+
2344
+ expression = Model::Expressions::BinaryExpression.new({
2345
+ operator: operators[0],
2346
+ operand1: operands[0],
2347
+ operand2: operands[1]
2348
+ })
2349
+ operators[1..(operators.length - 1)].each_with_index do |operator, i|
2350
+ expression = Model::Expressions::BinaryExpression.new({
2351
+ operator: operator,
2352
+ operand1: expression,
2353
+ operand2: operands[i + 2]
2354
+ })
2355
+ end
2356
+ expression
2357
+ end
2358
+
2359
+ def handle_qualified_ref(ref, qualifiers)
2360
+ qualifiers.reduce(ref) do |ref, ctx|
2361
+ ctx__attribute_qualifier = ctx.attribute_qualifier
2362
+ ctx__group_qualifier = ctx.group_qualifier
2363
+ ctx__index_qualifier = ctx.index_qualifier
2364
+
2365
+ if ctx__attribute_qualifier
2366
+ attribute_reference = visit_if(ctx__attribute_qualifier)
2367
+
2368
+ Model::Expressions::AttributeReference.new({
2369
+ ref: ref,
2370
+ attribute: attribute_reference.attribute
2371
+ })
2372
+ elsif ctx__group_qualifier
2373
+ group_reference = visit_if(ctx__group_qualifier)
2374
+
2375
+ Model::Expressions::GroupReference.new({
2376
+ ref: ref,
2377
+ entity: group_reference.entity
2378
+ })
2379
+ elsif ctx__index_qualifier
2380
+ index_reference = visit_if(ctx__index_qualifier)
2381
+
2382
+ Model::Expressions::IndexReference.new({
2383
+ ref: ref,
2384
+ index1: index_reference.index1,
2385
+ index2: index_reference.index2
2386
+ })
2387
+ else
2388
+ raise 'Invalid state'
2389
+ end
2390
+ end
2391
+ end
2392
+
2393
+ def handle_binary_literal(ctx)
2394
+ ctx__text = ctx.text
2395
+
2396
+ value = ctx__text[1..(ctx__text.length - 1)]
2397
+
2398
+ Model::Literals::Binary.new({
2399
+ value: value
2400
+ })
2401
+ end
2402
+
2403
+ def handle_integer_literal(ctx)
2404
+ ctx__text = ctx.text
2405
+
2406
+ value = ctx__text
2407
+
2408
+ Model::Literals::Integer.new({
2409
+ value: value
2410
+ })
2411
+ end
2412
+
2413
+ def handle_real_literal(ctx)
2414
+ ctx__text = ctx.text
2415
+
2416
+ value = ctx__text
2417
+
2418
+ Model::Literals::Real.new({
2419
+ value: value
2420
+ })
2421
+ end
2422
+
2423
+ def handle_simple_id(ctx)
2424
+ ctx__text = ctx.text
2425
+
2426
+ ctx__text
2427
+ end
2428
+
2429
+ def handle_simple_string_literal(ctx)
2430
+ ctx__text = ctx.text
2431
+
2432
+ value = ctx__text[1..(ctx__text.length - 2)]
2433
+
2434
+ Model::Literals::String.new({
2435
+ value: value
2436
+ })
2437
+ end
2438
+
2439
+ def handle_encoded_string_literal(ctx)
2440
+ ctx__text = ctx.text
2441
+
2442
+ value = ctx__text[1..(ctx__text.length - 2)]
2443
+
2444
+ Model::Literals::String.new({
2445
+ value: value,
2446
+ encoded: true
2447
+ })
2448
+ end
2449
+ end
2450
+ end
2451
+ end