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
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: c438f9b44921fb248523db30283521d956c70f616c3118b257539c814b71cba5
4
- data.tar.gz: 0d5f09ecdfbf07065b5c56f8233a6c321fe8e0b3d4907460e1d6e3aa18104007
3
+ metadata.gz: 843dcf34e7a34f2c8061e48c708bea2c16d54b773e96f781937c0fef7df2367d
4
+ data.tar.gz: 74039ed222ac962849d6e2e79ee6596ab26e7da6d4396bba89ab07f6f9b2917f
5
5
  SHA512:
6
- metadata.gz: 2dc2fd2b680c36be20a61e51720fc6e39149a0bbf96850c1aa694162389501475966ce71892fab3edd1f7abb0e4008f9c9a1887362d5fa1d00ab0c1caaa281c3
7
- data.tar.gz: afd5ad40bce378f54d84fe4572f41e9673c2cf4434e0c4d56c01ed1a26ae565e0d1b9b706479a2aa5ca5a07c448a2b1223da21c6880ce7c3e3f557a80a5fabdd
6
+ metadata.gz: 38109ed8b49e910c3af2410c6df591d71298211ae8f95d7fdbb08f73aec6b11b56761410d4a3793f0c34f8c0e56a31796bad0b1281e71c79d7175d6c1d5378ec
7
+ data.tar.gz: eb61333805b6199136e48a4136dd012292b96874f2ae25089f65b56f1f3208a0f31bee5e127b0a3666d573dd4be37c51e8f712c99eb6a8f3045dfb2cd3ffc86d
data/.gitignore CHANGED
@@ -10,6 +10,7 @@
10
10
  /.idea
11
11
  /lib/expressir/express_exp/generated/*.interp
12
12
  /lib/expressir/express_exp/generated/*.tokens
13
+ /original/examples/syntax/*-pretty.exp
13
14
 
14
15
  # rspec failure tracking
15
16
  .rspec_status
@@ -0,0 +1,1444 @@
1
+ require 'expressir/model'
2
+
3
+ module Expressir
4
+ module ExpressExp
5
+ class Formatter
6
+ INDENT_CHAR = ' '
7
+ INDENT_WIDTH = 2
8
+ INDENT = INDENT_CHAR * INDENT_WIDTH
9
+
10
+ OPERATOR_PRECEDENCE = {
11
+ Model::Expressions::BinaryExpression::EXPONENTIATION => 1,
12
+ Model::Expressions::BinaryExpression::MULTIPLICATION => 2,
13
+ Model::Expressions::BinaryExpression::REAL_DIVISION => 2,
14
+ Model::Expressions::BinaryExpression::INTEGER_DIVISION => 2,
15
+ Model::Expressions::BinaryExpression::MODULO => 2,
16
+ Model::Expressions::BinaryExpression::AND => 2,
17
+ Model::Expressions::BinaryExpression::COMBINE => 2,
18
+ Model::Expressions::BinaryExpression::SUBTRACTION => 3,
19
+ Model::Expressions::BinaryExpression::ADDITION => 3,
20
+ Model::Expressions::BinaryExpression::OR => 3,
21
+ Model::Expressions::BinaryExpression::XOR => 3,
22
+ Model::Expressions::BinaryExpression::EQUAL => 4,
23
+ Model::Expressions::BinaryExpression::NOT_EQUAL => 4,
24
+ Model::Expressions::BinaryExpression::LESS_THAN_OR_EQUAL => 4,
25
+ Model::Expressions::BinaryExpression::GREATER_THAN_OR_EQUAL => 4,
26
+ Model::Expressions::BinaryExpression::LESS_THAN => 4,
27
+ Model::Expressions::BinaryExpression::GREATER_THAN => 4,
28
+ Model::Expressions::BinaryExpression::INSTANCE_EQUAL => 4,
29
+ Model::Expressions::BinaryExpression::INSTANCE_NOT_EQUAL => 4,
30
+ Model::Expressions::BinaryExpression::IN => 4,
31
+ Model::Expressions::BinaryExpression::LIKE => 4,
32
+ Model::Expressions::BinaryExpression::ANDOR => 4,
33
+ }
34
+
35
+ def self.format(node)
36
+ formatter = self.new
37
+ formatter.format(node)
38
+ end
39
+
40
+ def format(node)
41
+ if node.instance_of? Model::Attribute
42
+ format_attribute(node)
43
+ elsif node.instance_of? Model::Constant
44
+ format_constant(node)
45
+ elsif node.instance_of? Model::Entity
46
+ format_entity(node)
47
+ elsif node.instance_of? Model::EnumerationItem
48
+ format_enumeration_item(node)
49
+ elsif node.instance_of? Model::Function
50
+ format_function(node)
51
+ elsif node.instance_of? Model::Interface
52
+ format_interface(node)
53
+ elsif node.instance_of? Model::Parameter
54
+ format_parameter(node)
55
+ elsif node.instance_of? Model::Procedure
56
+ format_procedure(node)
57
+ elsif node.instance_of? Model::RenamedRef
58
+ format_renamed_ref(node)
59
+ elsif node.instance_of? Model::Repository
60
+ format_repository(node)
61
+ elsif node.instance_of? Model::Rule
62
+ format_rule(node)
63
+ elsif node.instance_of? Model::Schema
64
+ format_schema(node)
65
+ elsif node.instance_of? Model::SubtypeConstraint
66
+ format_subtype_constraint(node)
67
+ elsif node.instance_of? Model::Type
68
+ format_type(node)
69
+ elsif node.instance_of? Model::Unique
70
+ format_unique(node)
71
+ elsif node.instance_of? Model::Variable
72
+ format_variable(node)
73
+ elsif node.instance_of? Model::Where
74
+ format_where(node)
75
+ elsif node.instance_of? Model::Expressions::AggregateInitializer
76
+ format_expressions_aggregate_initializer(node)
77
+ elsif node.instance_of? Model::Expressions::AggregateItem
78
+ format_expressions_aggregate_item(node)
79
+ elsif node.instance_of? Model::Expressions::AttributeReference
80
+ format_expressions_attribute_reference(node)
81
+ elsif node.instance_of? Model::Expressions::BinaryExpression
82
+ format_expressions_binary_expression(node)
83
+ elsif node.instance_of? Model::Expressions::Call
84
+ format_expressions_call(node)
85
+ elsif node.instance_of? Model::Expressions::EntityConstructor
86
+ format_expressions_entity_constructor(node)
87
+ elsif node.instance_of? Model::Expressions::GroupReference
88
+ format_expressions_group_reference(node)
89
+ elsif node.instance_of? Model::Expressions::IndexReference
90
+ format_expressions_index_reference(node)
91
+ elsif node.instance_of? Model::Expressions::Interval
92
+ format_expressions_interval(node)
93
+ elsif node.instance_of? Model::Expressions::QueryExpression
94
+ format_expressions_query_expression(node)
95
+ elsif node.instance_of? Model::Expressions::SimpleReference
96
+ format_expressions_simple_reference(node)
97
+ elsif node.instance_of? Model::Expressions::UnaryExpression
98
+ format_expressions_unary_expression(node)
99
+ elsif node.instance_of? Model::Literals::Binary
100
+ format_literals_binary(node)
101
+ elsif node.instance_of? Model::Literals::Integer
102
+ format_literals_integer(node)
103
+ elsif node.instance_of? Model::Literals::Logical
104
+ format_literals_logical(node)
105
+ elsif node.instance_of? Model::Literals::Real
106
+ format_literals_real(node)
107
+ elsif node.instance_of? Model::Literals::String
108
+ format_literals_string(node)
109
+ elsif node.instance_of? Model::Statements::Alias
110
+ format_statements_alias(node)
111
+ elsif node.instance_of? Model::Statements::Assignment
112
+ format_statements_assignment(node)
113
+ elsif node.instance_of? Model::Statements::Call
114
+ format_statements_call(node)
115
+ elsif node.instance_of? Model::Statements::Case
116
+ format_statements_case(node)
117
+ elsif node.instance_of? Model::Statements::CaseAction
118
+ format_statements_case_action(node)
119
+ elsif node.instance_of? Model::Statements::Compound
120
+ format_statements_compound(node)
121
+ elsif node.instance_of? Model::Statements::Escape
122
+ format_statements_escape(node)
123
+ elsif node.instance_of? Model::Statements::If
124
+ format_statements_if(node)
125
+ elsif node.instance_of? Model::Statements::Null
126
+ format_statements_null(node)
127
+ elsif node.instance_of? Model::Statements::Repeat
128
+ format_statements_repeat(node)
129
+ elsif node.instance_of? Model::Statements::Return
130
+ format_statements_return(node)
131
+ elsif node.instance_of? Model::Statements::Skip
132
+ format_statements_skip(node)
133
+ elsif node.instance_of? Model::Types::Aggregate
134
+ format_types_aggregate(node)
135
+ elsif node.instance_of? Model::Types::Array
136
+ format_types_array(node)
137
+ elsif node.instance_of? Model::Types::Bag
138
+ format_types_bag(node)
139
+ elsif node.instance_of? Model::Types::Binary
140
+ format_types_binary(node)
141
+ elsif node.instance_of? Model::Types::Boolean
142
+ format_types_boolean(node)
143
+ elsif node.instance_of? Model::Types::Enumeration
144
+ format_types_enumeration(node)
145
+ elsif node.instance_of? Model::Types::GenericEntity
146
+ format_types_generic_entity(node)
147
+ elsif node.instance_of? Model::Types::Generic
148
+ format_types_generic(node)
149
+ elsif node.instance_of? Model::Types::Integer
150
+ format_types_integer(node)
151
+ elsif node.instance_of? Model::Types::List
152
+ format_types_list(node)
153
+ elsif node.instance_of? Model::Types::Logical
154
+ format_types_logical(node)
155
+ elsif node.instance_of? Model::Types::Number
156
+ format_types_number(node)
157
+ elsif node.instance_of? Model::Types::Real
158
+ format_types_real(node)
159
+ elsif node.instance_of? Model::Types::Select
160
+ format_types_select(node)
161
+ elsif node.instance_of? Model::Types::Set
162
+ format_types_set(node)
163
+ elsif node.instance_of? Model::Types::String
164
+ format_types_string(node)
165
+ else
166
+ puts node.class
167
+ end
168
+ end
169
+
170
+ private
171
+
172
+ def format_attribute(node)
173
+ [
174
+ *if node.kind == Model::Attribute::DERIVED
175
+ [
176
+ 'DERIVE',
177
+ ' '
178
+ ].join('')
179
+ elsif node.kind == Model::Attribute::INVERSE
180
+ [
181
+ 'INVERSE',
182
+ ' '
183
+ ].join('')
184
+ end,
185
+ *if node.supertype_attribute
186
+ [
187
+ format(node.supertype_attribute),
188
+ ' ',
189
+ ].join('')
190
+ end,
191
+ *if node.supertype_attribute and node.id
192
+ [
193
+ 'RENAMED',
194
+ ' '
195
+ ].join('')
196
+ end,
197
+ *if node.id
198
+ [
199
+ node.id,
200
+ ' '
201
+ ].join('')
202
+ end,
203
+ ':',
204
+ *if node.optional
205
+ [
206
+ ' ',
207
+ 'OPTIONAL'
208
+ ].join('')
209
+ end,
210
+ ' ',
211
+ format(node.type),
212
+ *if node.kind == Model::Attribute::DERIVED
213
+ [
214
+ ' ',
215
+ ':=',
216
+ ' ',
217
+ format(node.expression)
218
+ ].join('')
219
+ elsif node.kind == Model::Attribute::INVERSE
220
+ [
221
+ ' ',
222
+ 'FOR',
223
+ ' ',
224
+ format(node.expression)
225
+ ].join('')
226
+ end,
227
+ ';',
228
+ ].join('')
229
+ end
230
+
231
+ def format_constant(node)
232
+ [
233
+ node.id,
234
+ ' ',
235
+ ':',
236
+ ' ',
237
+ format(node.type),
238
+ ' ',
239
+ ':=',
240
+ ' ',
241
+ format(node.expression),
242
+ ';'
243
+ ].join('')
244
+ end
245
+
246
+ def format_entity(node)
247
+ [
248
+ [
249
+ 'ENTITY',
250
+ ' ',
251
+ node.id,
252
+ *if node.abstract and !node.supertype_expression
253
+ [
254
+ "\n",
255
+ ' ',
256
+ 'ABSTRACT',
257
+ ' ',
258
+ 'SUPERTYPE'
259
+ ].join('')
260
+ end,
261
+ *if node.abstract and node.supertype_expression
262
+ [
263
+ "\n",
264
+ ' ',
265
+ 'ABSTRACT',
266
+ ' ',
267
+ 'SUPERTYPE',
268
+ ' ',
269
+ 'OF',
270
+ ' ',
271
+ '(',
272
+ format(node.supertype_expression),
273
+ ')'
274
+ ].join('')
275
+ end,
276
+ *if !node.abstract and node.supertype_expression
277
+ [
278
+ "\n",
279
+ ' ',
280
+ 'SUPERTYPE',
281
+ ' ',
282
+ 'OF',
283
+ ' ',
284
+ '(',
285
+ format(node.supertype_expression),
286
+ ')'
287
+ ].join('')
288
+ end,
289
+ *if node.subtype_of and node.subtype_of.length > 0
290
+ [
291
+ "\n",
292
+ ' ',
293
+ 'SUBTYPE',
294
+ ' ',
295
+ 'OF',
296
+ ' ',
297
+ '(',
298
+ node.subtype_of.map{|x| format(x)}.join(', '),
299
+ ')'
300
+ ].join('')
301
+ end,
302
+ ';'
303
+ ].join(''),
304
+ *if node.attributes and node.attributes.length > 0
305
+ indent(node.attributes.map{|x| format(x)}.join("\n"))
306
+ end,
307
+ *if node.unique and node.unique.length > 0
308
+ indent([
309
+ 'UNIQUE',
310
+ indent(node.unique.map{|x| format(x)}.join("\n"))
311
+ ].join("\n"))
312
+ end,
313
+ *if node.where and node.where.length > 0
314
+ indent([
315
+ 'WHERE',
316
+ indent(node.where.map{|x| format(x)}.join("\n")),
317
+ ].join("\n"))
318
+ end,
319
+ *format_scope_remarks(node),
320
+ [
321
+ 'END_ENTITY',
322
+ ';'
323
+ ].join('')
324
+ ].join("\n")
325
+ end
326
+
327
+ def format_enumeration_item(node)
328
+ node.id
329
+ end
330
+
331
+ def format_function(node)
332
+ [
333
+ [
334
+ 'FUNCTION',
335
+ ' ',
336
+ node.id,
337
+ *if node.parameters and node.parameters.length > 0
338
+ [
339
+ '(',
340
+ node.parameters.map{|x| format(x)}.join('; '),
341
+ ')'
342
+ ].join('')
343
+ end,
344
+ ' ',
345
+ ':',
346
+ ' ',
347
+ format(node.return_type),
348
+ ';'
349
+ ].join(''),
350
+ *if node.declarations and node.declarations.length > 0
351
+ indent(node.declarations.map{|x| format(x)}.join("\n"))
352
+ end,
353
+ *if node.constants and node.constants.length > 0
354
+ indent([
355
+ 'CONSTANT',
356
+ indent(node.constants.map{|x| format(x)}.join("\n")),
357
+ [
358
+ 'END_CONSTANT',
359
+ ';'
360
+ ].join('')
361
+ ].join("\n"))
362
+ end,
363
+ *if node.variables and node.variables.length > 0
364
+ indent([
365
+ 'LOCAL',
366
+ indent(node.variables.map{|x| format(x)}.join("\n")),
367
+ [
368
+ 'END_LOCAL',
369
+ ';'
370
+ ].join('')
371
+ ].join("\n"))
372
+ end,
373
+ *if node.statements and node.statements.length > 0
374
+ indent(node.statements.map{|x| format(x)}.join("\n"))
375
+ end,
376
+ *format_scope_remarks(node),
377
+ [
378
+ 'END_FUNCTION',
379
+ ';'
380
+ ].join('')
381
+ ].join("\n")
382
+ end
383
+
384
+ def format_interface(node)
385
+ [
386
+ case node.kind
387
+ when Model::Interface::USE then 'USE'
388
+ when Model::Interface::REFERENCE then 'REFERENCE'
389
+ end,
390
+ ' ',
391
+ 'FROM',
392
+ ' ',
393
+ format(node.schema),
394
+ *if node.items and node.items.length > 0
395
+ [
396
+ "\n",
397
+ ' ',
398
+ '(',
399
+ node.items.map{|x| format(x)},
400
+ ')'
401
+ ].join('')
402
+ end,
403
+ ';',
404
+ ].join('')
405
+ end
406
+
407
+ def format_parameter(node)
408
+ [
409
+ *if node.var
410
+ [
411
+ 'VAR',
412
+ ' '
413
+ ].join('')
414
+ end,
415
+ node.id,
416
+ ' ',
417
+ ':',
418
+ ' ',
419
+ format(node.type)
420
+ ].join('')
421
+ end
422
+
423
+ def format_procedure(node)
424
+ [
425
+ [
426
+ 'PROCEDURE',
427
+ ' ',
428
+ node.id,
429
+ *if node.parameters and node.parameters.length > 0
430
+ [
431
+ '(',
432
+ node.parameters.map{|x| format(x)}.join('; '),
433
+ ')'
434
+ ].join('')
435
+ end,
436
+ ';'
437
+ ].join(''),
438
+ *if node.declarations and node.declarations.length > 0
439
+ indent(node.declarations.map{|x| format(x)}.join("\n"))
440
+ end,
441
+ *if node.constants and node.constants.length > 0
442
+ indent([
443
+ 'CONSTANT',
444
+ indent(node.constants.map{|x| format(x)}.join("\n")),
445
+ [
446
+ 'END_CONSTANT',
447
+ ';'
448
+ ].join('')
449
+ ].join("\n"))
450
+ end,
451
+ *if node.variables and node.variables.length > 0
452
+ indent([
453
+ 'LOCAL',
454
+ indent(node.variables.map{|x| format(x)}.join("\n")),
455
+ [
456
+ 'END_LOCAL',
457
+ ';'
458
+ ].join('')
459
+ ].join("\n"))
460
+ end,
461
+ *if node.statements and node.statements.length > 0
462
+ indent(node.statements.map{|x| format(x)}.join("\n"))
463
+ end,
464
+ *format_scope_remarks(node),
465
+ [
466
+ 'END_PROCEDURE',
467
+ ';'
468
+ ].join('')
469
+ ].join("\n")
470
+ end
471
+
472
+ def format_renamed_ref(node)
473
+ [
474
+ format(node.ref),
475
+ ' ',
476
+ 'AS',
477
+ ' ',
478
+ node.id
479
+ ].join('')
480
+ end
481
+
482
+ def format_repository(node)
483
+ [
484
+ *if node.schemas and node.schemas.length > 0
485
+ node.schemas.map{|node| format(node)}
486
+ end,
487
+ *format_scope_remarks(node)
488
+ ].join("\n")
489
+ end
490
+
491
+ def format_rule(node)
492
+ [
493
+ [
494
+ 'RULE',
495
+ ' ',
496
+ node.id,
497
+ ' ',
498
+ 'FOR',
499
+ ' ',
500
+ '(',
501
+ node.applies_to.map{|x| format(x)}.join(', '),
502
+ ')',
503
+ ';'
504
+ ].join(''),
505
+ *if node.declarations and node.declarations.length > 0
506
+ indent(node.declarations.map{|x| format(x)}.join("\n"))
507
+ end,
508
+ *if node.constants and node.constants.length > 0
509
+ indent([
510
+ 'CONSTANT',
511
+ indent(node.constants.map{|x| format(x)}.join("\n")),
512
+ [
513
+ 'END_CONSTANT',
514
+ ';'
515
+ ].join('')
516
+ ].join("\n"))
517
+ end,
518
+ *if node.variables and node.variables.length > 0
519
+ indent([
520
+ 'LOCAL',
521
+ indent(node.variables.map{|x| format(x)}.join("\n")),
522
+ [
523
+ 'END_LOCAL',
524
+ ';'
525
+ ].join('')
526
+ ].join("\n"))
527
+ end,
528
+ *if node.statements and node.statements.length > 0
529
+ indent(node.statements.map{|x| format(x)}.join("\n"))
530
+ end,
531
+ *if node.where and node.where.length > 0
532
+ indent([
533
+ 'WHERE',
534
+ indent(node.where.map{|x| format(x)}.join("\n"))
535
+ ].join("\n"))
536
+ end,
537
+ *format_scope_remarks(node),
538
+ [
539
+ 'END_RULE',
540
+ ';'
541
+ ].join('')
542
+ ].join("\n")
543
+ end
544
+
545
+ def format_schema(node)
546
+ [
547
+ [
548
+ 'SCHEMA',
549
+ ' ',
550
+ node.id,
551
+ *if node.version
552
+ [
553
+ ' ',
554
+ format(node.version),
555
+ ].join('')
556
+ end,
557
+ ';'
558
+ ].join(''),
559
+ *if node.interfaces and node.interfaces.length > 0
560
+ node.interfaces.map{|x| format(x)}.join("\n")
561
+ end,
562
+ *if node.constants and node.constants.length > 0
563
+ [
564
+ 'CONSTANT',
565
+ indent(node.constants.map{|x| format(x)}.join("\n")),
566
+ [
567
+ 'END_CONSTANT',
568
+ ';'
569
+ ].join('')
570
+ ].join("\n")
571
+ end,
572
+ *if node.declarations and node.declarations.length > 0
573
+ node.declarations.map{|x| format(x)}.join("\n\n")
574
+ end,
575
+ *format_scope_remarks(node),
576
+ [
577
+ 'END_SCHEMA',
578
+ ';'
579
+ ].join('')
580
+ ].join("\n")
581
+ end
582
+
583
+ def format_subtype_constraint(node)
584
+ [
585
+ [
586
+ 'SUBTYPE_CONSTRAINT',
587
+ ' ',
588
+ node.id,
589
+ ' ',
590
+ 'FOR',
591
+ ' ',
592
+ format(node.applies_to),
593
+ ';'
594
+ ].join(''),
595
+ *if node.abstract
596
+ indent([
597
+ 'ABSTRACT',
598
+ ' ',
599
+ 'SUPERTYPE',
600
+ ';'
601
+ ].join(''))
602
+ end,
603
+ *if node.total_over and node.total_over.length > 0
604
+ indent([
605
+ 'TOTAL_OVER',
606
+ '(',
607
+ node.total_over.map{|x| format(x)}.join(', '),
608
+ ')',
609
+ ';'
610
+ ].join(''))
611
+ end,
612
+ *if node.supertype_expression
613
+ indent([
614
+ format(node.supertype_expression),
615
+ ';'
616
+ ].join(''))
617
+ end,
618
+ [
619
+ 'END_SUBTYPE_CONSTRAINT',
620
+ ';'
621
+ ].join('')
622
+ ].join("\n")
623
+ end
624
+
625
+ def format_type(node)
626
+ [
627
+ [
628
+ 'TYPE',
629
+ ' ',
630
+ node.id,
631
+ ' ',
632
+ '=',
633
+ ' ',
634
+ format(node.type),
635
+ ';',
636
+ ].join(''),
637
+ *if node.where and node.where.length > 0
638
+ indent([
639
+ 'WHERE',
640
+ indent(node.where.map{|x| format(x)}.join("\n"))
641
+ ].join("\n"))
642
+ end,
643
+ *format_scope_remarks(node),
644
+ [
645
+ 'END_TYPE',
646
+ ';'
647
+ ].join('')
648
+ ].join("\n")
649
+ end
650
+
651
+ def format_unique(node)
652
+ [
653
+ *if node.id
654
+ [
655
+ node.id,
656
+ ' ',
657
+ ':',
658
+ ' '
659
+ ].join('')
660
+ end,
661
+ node.attributes.map{|x| format(x)}.join(', '),
662
+ ';'
663
+ ].join('')
664
+ end
665
+
666
+ def format_variable(node)
667
+ [
668
+ node.id,
669
+ ' ',
670
+ ':',
671
+ ' ',
672
+ format(node.type),
673
+ *if node.expression
674
+ [
675
+ ' ',
676
+ ':=',
677
+ ' ',
678
+ format(node.expression),
679
+ ].join('')
680
+ end,
681
+ ';'
682
+ ].join('')
683
+ end
684
+
685
+ def format_where(node)
686
+ [
687
+ *if node.id
688
+ [
689
+ node.id,
690
+ ' ',
691
+ ':',
692
+ ' '
693
+ ].join('')
694
+ end,
695
+ format(node.expression),
696
+ ';'
697
+ ].join('')
698
+ end
699
+
700
+ def format_expressions_aggregate_initializer(node)
701
+ [
702
+ '[',
703
+ node.items.map{|x| format(x)}.join(', '),
704
+ ']'
705
+ ].join('')
706
+ end
707
+
708
+ def format_expressions_aggregate_item(node)
709
+ [
710
+ format(node.expression),
711
+ ':',
712
+ format(node.repetition)
713
+ ].join('')
714
+ end
715
+
716
+ def format_expressions_attribute_reference(node)
717
+ [
718
+ format(node.ref),
719
+ '.',
720
+ format(node.attribute)
721
+ ].join('')
722
+ end
723
+
724
+ def format_expressions_binary_expression(node)
725
+ [
726
+ *if node.operand1.instance_of? Model::Expressions::BinaryExpression and OPERATOR_PRECEDENCE[node.operand1.operator] > OPERATOR_PRECEDENCE[node.operator]
727
+ '('
728
+ end,
729
+ format(node.operand1),
730
+ *if node.operand1.instance_of? Model::Expressions::BinaryExpression and OPERATOR_PRECEDENCE[node.operand1.operator] > OPERATOR_PRECEDENCE[node.operator]
731
+ ')'
732
+ end,
733
+ ' ',
734
+ case node.operator
735
+ when Model::Expressions::BinaryExpression::ADDITION then '+'
736
+ when Model::Expressions::BinaryExpression::AND then 'AND'
737
+ when Model::Expressions::BinaryExpression::ANDOR then 'ANDOR'
738
+ when Model::Expressions::BinaryExpression::COMBINE then '||'
739
+ when Model::Expressions::BinaryExpression::EQUAL then '='
740
+ when Model::Expressions::BinaryExpression::EXPONENTIATION then '**'
741
+ when Model::Expressions::BinaryExpression::GREATER_THAN then '>'
742
+ when Model::Expressions::BinaryExpression::GREATER_THAN_OR_EQUAL then '>='
743
+ when Model::Expressions::BinaryExpression::IN then 'IN'
744
+ when Model::Expressions::BinaryExpression::INSTANCE_EQUAL then ':=:'
745
+ when Model::Expressions::BinaryExpression::INSTANCE_NOT_EQUAL then ':<>:'
746
+ when Model::Expressions::BinaryExpression::INTEGER_DIVISION then 'DIV'
747
+ when Model::Expressions::BinaryExpression::LESS_THAN then '<'
748
+ when Model::Expressions::BinaryExpression::LESS_THAN_OR_EQUAL then '<='
749
+ when Model::Expressions::BinaryExpression::LIKE then 'LIKE'
750
+ when Model::Expressions::BinaryExpression::MODULO then 'MOD'
751
+ when Model::Expressions::BinaryExpression::MULTIPLICATION then '*'
752
+ when Model::Expressions::BinaryExpression::NOT_EQUAL then '<>'
753
+ when Model::Expressions::BinaryExpression::OR then 'OR'
754
+ when Model::Expressions::BinaryExpression::REAL_DIVISION then '/'
755
+ when Model::Expressions::BinaryExpression::SUBTRACTION then '-'
756
+ when Model::Expressions::BinaryExpression::XOR then 'XOR'
757
+ end,
758
+ ' ',
759
+ *if node.operand2.instance_of? Model::Expressions::BinaryExpression and OPERATOR_PRECEDENCE[node.operand2.operator] > OPERATOR_PRECEDENCE[node.operator]
760
+ '('
761
+ end,
762
+ format(node.operand2),
763
+ *if node.operand2.instance_of? Model::Expressions::BinaryExpression and OPERATOR_PRECEDENCE[node.operand2.operator] > OPERATOR_PRECEDENCE[node.operator]
764
+ ')'
765
+ end,
766
+ ].join('')
767
+ end
768
+
769
+ def format_expressions_call(node)
770
+ [
771
+ format(node.ref),
772
+ '(',
773
+ node.parameters.map{|x| format(x)}.join(', '),
774
+ ')'
775
+ ].join('')
776
+ end
777
+
778
+ def format_expressions_entity_constructor(node)
779
+ [
780
+ format(node.entity),
781
+ '(',
782
+ node.parameters.map{|x| format(x)}.join(', '),
783
+ ')'
784
+ ].join('')
785
+ end
786
+
787
+ def format_expressions_group_reference(node)
788
+ [
789
+ format(node.ref),
790
+ '\\',
791
+ format(node.entity)
792
+ ].join('')
793
+ end
794
+
795
+ def format_expressions_index_reference(node)
796
+ [
797
+ format(node.ref),
798
+ '[',
799
+ format(node.index1),
800
+ *if node.index2
801
+ [
802
+ ':',
803
+ format(node.index2)
804
+ ].join('')
805
+ end,
806
+ ']'
807
+ ].join('')
808
+ end
809
+
810
+ def format_expressions_interval(node)
811
+ [
812
+ '{',
813
+ format(node.low),
814
+ ' ',
815
+ case node.operator1
816
+ when Model::Expressions::BinaryExpression::LESS_THAN then '<'
817
+ when Model::Expressions::BinaryExpression::LESS_THAN_OR_EQUAL then '<='
818
+ end,
819
+ ' ',
820
+ format(node.item),
821
+ ' ',
822
+ case node.operator2
823
+ when Model::Expressions::BinaryExpression::LESS_THAN then '<'
824
+ when Model::Expressions::BinaryExpression::LESS_THAN_OR_EQUAL then '<='
825
+ end,
826
+ ' ',
827
+ format(node.high),
828
+ '}'
829
+ ].join('')
830
+ end
831
+
832
+ def format_expressions_query_expression(node)
833
+ [
834
+ 'QUERY',
835
+ '(',
836
+ node.id,
837
+ ' ',
838
+ '<*',
839
+ ' ',
840
+ format(node.source),
841
+ ' ',
842
+ '|',
843
+ ' ',
844
+ format(node.expression),
845
+ *format_scope_remarks(node).instance_eval{|x| x.length > 0 ? ["\n", *x, "\n"] : x},
846
+ ')'
847
+ ].join('')
848
+ end
849
+
850
+ def format_expressions_simple_reference(node)
851
+ node.id
852
+ end
853
+
854
+ def format_expressions_unary_expression(node)
855
+ [
856
+ case node.operator
857
+ when Model::Expressions::UnaryExpression::MINUS then '-'
858
+ when Model::Expressions::UnaryExpression::NOT then 'NOT'
859
+ when Model::Expressions::UnaryExpression::PLUS then '+'
860
+ end,
861
+ if node.operator == Model::Expressions::UnaryExpression::NOT
862
+ ' '
863
+ end,
864
+ *if node.operand.instance_of? Model::Expressions::BinaryExpression
865
+ '('
866
+ end,
867
+ format(node.operand),
868
+ *if node.operand.instance_of? Model::Expressions::BinaryExpression
869
+ ')'
870
+ end
871
+ ].join('')
872
+ end
873
+
874
+ def format_literals_binary(node)
875
+ [
876
+ '%',
877
+ node.value
878
+ ].join('')
879
+ end
880
+
881
+ def format_literals_integer(node)
882
+ node.value
883
+ end
884
+
885
+ def format_literals_logical(node)
886
+ case node.value
887
+ when Model::Literals::Logical::TRUE then 'TRUE'
888
+ when Model::Literals::Logical::FALSE then 'FALSE'
889
+ when Model::Literals::Logical::UNKNOWN then 'UNKNOWN'
890
+ end
891
+ end
892
+
893
+ def format_literals_real(node)
894
+ node.value
895
+ end
896
+
897
+ def format_literals_string(node)
898
+ if node.encoded
899
+ [
900
+ "\"",
901
+ node.value,
902
+ "\""
903
+ ].join('')
904
+ else
905
+ [
906
+ "'",
907
+ node.value,
908
+ "'"
909
+ ].join('')
910
+ end
911
+ end
912
+
913
+ def format_statements_alias(node)
914
+ [
915
+ [
916
+ 'ALIAS',
917
+ ' ',
918
+ node.id,
919
+ ' ',
920
+ 'FOR',
921
+ ' ',
922
+ format(node.expression),
923
+ ';'
924
+ ].join(''),
925
+ *if node.statements and node.statements.length > 0
926
+ indent(node.statements.map{|x| format(x)}.join("\n"))
927
+ end,
928
+ *format_scope_remarks(node),
929
+ [
930
+ 'END_ALIAS',
931
+ ';'
932
+ ].join('')
933
+ ].join("\n")
934
+ end
935
+
936
+ def format_statements_assignment(node)
937
+ [
938
+ format(node.ref),
939
+ ' ',
940
+ ':=',
941
+ ' ',
942
+ format(node.expression),
943
+ ';'
944
+ ].join('')
945
+ end
946
+
947
+ def format_statements_call(node)
948
+ [
949
+ format(node.ref),
950
+ *if node.parameters and node.parameters.length > 0
951
+ [
952
+ '(',
953
+ node.parameters.map{|x| format(x)}.join(', '),
954
+ ')'
955
+ ].join('')
956
+ end,
957
+ ';'
958
+ ].join('')
959
+ end
960
+
961
+ def format_statements_case(node)
962
+ [
963
+ [
964
+ 'CASE',
965
+ ' ',
966
+ format(node.expression),
967
+ ' ',
968
+ 'OF'
969
+ ].join(''),
970
+ *if node.actions and node.actions.length > 0
971
+ node.actions.map{|x| format(x)}
972
+ end,
973
+ *if node.otherwise_statement
974
+ [
975
+ [
976
+ 'OTHERWISE',
977
+ ' ',
978
+ ':'
979
+ ].join(''),
980
+ indent(format(node.otherwise_statement))
981
+ ]
982
+ end,
983
+ [
984
+ 'END_CASE',
985
+ ';'
986
+ ].join('')
987
+ ].join("\n")
988
+ end
989
+
990
+ def format_statements_case_action(node)
991
+ [
992
+ [
993
+ node.labels.map{|x| format(x)}.join(', '),
994
+ ' ',
995
+ ':'
996
+ ].join(''),
997
+ indent(format(node.statement))
998
+ ].join("\n")
999
+ end
1000
+
1001
+ def format_statements_compound(node)
1002
+ [
1003
+ 'BEGIN',
1004
+ *if node.statements and node.statements.length > 0
1005
+ indent(node.statements.map{|x| format(x)}.join("\n"))
1006
+ end,
1007
+ [
1008
+ 'END',
1009
+ ';'
1010
+ ].join('')
1011
+ ].join("\n")
1012
+ end
1013
+
1014
+ def format_statements_escape(node)
1015
+ [
1016
+ 'ESCAPE',
1017
+ ';'
1018
+ ].join('')
1019
+ end
1020
+
1021
+ def format_statements_if(node)
1022
+ [
1023
+ [
1024
+ 'IF',
1025
+ ' ',
1026
+ format(node.expression),
1027
+ ' ',
1028
+ 'THEN'
1029
+ ].join(''),
1030
+ *if node.statements and node.statements.length > 0
1031
+ indent(node.statements.map{|x| format(x)}.join("\n"))
1032
+ end,
1033
+ *if node.else_statements and node.else_statements.length > 0
1034
+ [
1035
+ 'ELSE',
1036
+ indent(node.else_statements.map{|x| format(x)}.join("\n")),
1037
+ ].join("\n")
1038
+ end,
1039
+ [
1040
+ 'END_IF',
1041
+ ';'
1042
+ ].join('')
1043
+ ].join("\n")
1044
+ end
1045
+
1046
+ def format_statements_null(node)
1047
+ ';'
1048
+ end
1049
+
1050
+ def format_statements_repeat(node)
1051
+ [
1052
+ [
1053
+ 'REPEAT',
1054
+ *if node.id
1055
+ [
1056
+ ' ',
1057
+ node.id,
1058
+ ' ',
1059
+ ':=',
1060
+ ' ',
1061
+ format(node.bound1),
1062
+ ' ',
1063
+ 'TO',
1064
+ ' ',
1065
+ format(node.bound2),
1066
+ *if node.increment
1067
+ [
1068
+ ' ',
1069
+ 'BY',
1070
+ ' ',
1071
+ format(node.increment)
1072
+ ].join('')
1073
+ end
1074
+ ].join('')
1075
+ end,
1076
+ *if node.while_expression
1077
+ [
1078
+ ' ',
1079
+ 'WHILE',
1080
+ ' ',
1081
+ format(node.while_expression)
1082
+ ].join('')
1083
+ end,
1084
+ *if node.until_expression
1085
+ [
1086
+ ' ',
1087
+ 'UNTIL',
1088
+ ' ',
1089
+ format(node.until_expression)
1090
+ ].join('')
1091
+ end,
1092
+ ';'
1093
+ ].join(''),
1094
+ *if node.statements and node.statements.length > 0
1095
+ indent(node.statements.map{|x| format(x)}.join("\n"))
1096
+ end,
1097
+ *format_scope_remarks(node),
1098
+ [
1099
+ 'END_REPEAT',
1100
+ ';'
1101
+ ].join('')
1102
+ ].join("\n")
1103
+ end
1104
+
1105
+ def format_statements_return(node)
1106
+ [
1107
+ 'RETURN',
1108
+ *if node.expression
1109
+ [
1110
+ ' ',
1111
+ '(',
1112
+ format(node.expression),
1113
+ ')'
1114
+ ].join('')
1115
+ end,
1116
+ ';'
1117
+ ].join('')
1118
+ end
1119
+
1120
+ def format_statements_skip(node)
1121
+ [
1122
+ 'SKIP',
1123
+ ';'
1124
+ ].join('')
1125
+ end
1126
+
1127
+ def format_types_aggregate(node)
1128
+ 'AGGREGATE'
1129
+ end
1130
+
1131
+ def format_types_array(node)
1132
+ [
1133
+ 'ARRAY',
1134
+ *if node.bound1 and node.bound2
1135
+ [
1136
+ ' ',
1137
+ '[',
1138
+ format(node.bound1),
1139
+ ':',
1140
+ format(node.bound2),
1141
+ ']',
1142
+ ].join('')
1143
+ end,
1144
+ ' ',
1145
+ 'OF',
1146
+ *if node.optional
1147
+ [
1148
+ ' ',
1149
+ 'OPTIONAL'
1150
+ ].join('')
1151
+ end,
1152
+ *if node.unique
1153
+ [
1154
+ ' ',
1155
+ 'UNIQUE'
1156
+ ].join('')
1157
+ end,
1158
+ ' ',
1159
+ format(node.base_type)
1160
+ ].join('')
1161
+ end
1162
+
1163
+ def format_types_bag(node)
1164
+ [
1165
+ 'BAG',
1166
+ *if node.bound1 and node.bound2
1167
+ [
1168
+ ' ',
1169
+ '[',
1170
+ format(node.bound1),
1171
+ ':',
1172
+ format(node.bound2),
1173
+ ']',
1174
+ ].join('')
1175
+ end,
1176
+ ' ',
1177
+ 'OF',
1178
+ ' ',
1179
+ format(node.base_type)
1180
+ ].join('')
1181
+ end
1182
+
1183
+ def format_types_binary(node)
1184
+ [
1185
+ 'BINARY',
1186
+ *if node.width
1187
+ [
1188
+ ' ',
1189
+ '(',
1190
+ format(node.width),
1191
+ ')'
1192
+ ].join('')
1193
+ end,
1194
+ *if node.fixed
1195
+ [
1196
+ ' ',
1197
+ 'FIXED'
1198
+ ].join('')
1199
+ end
1200
+ ].join('')
1201
+ end
1202
+
1203
+ def format_types_boolean(node)
1204
+ 'BOOLEAN'
1205
+ end
1206
+
1207
+ def format_types_enumeration(node)
1208
+ [
1209
+ *if node.extensible
1210
+ [
1211
+ 'EXTENSIBLE',
1212
+ ' '
1213
+ ].join('')
1214
+ end,
1215
+ 'ENUMERATION',
1216
+ *if node.items and node.items.length > 0
1217
+ [
1218
+ ' ',
1219
+ 'OF',
1220
+ ' ',
1221
+ '(',
1222
+ node.items.map{|x| format(x)}.join(', '),
1223
+ ')'
1224
+ ].join('')
1225
+ end,
1226
+ *if node.extension_type
1227
+ [
1228
+ ' ',
1229
+ 'BASED_ON',
1230
+ ' ',
1231
+ format(node.extension_type)
1232
+ ].join('')
1233
+ end,
1234
+ *if node.extension_items
1235
+ [
1236
+ ' ',
1237
+ 'WITH',
1238
+ ' ',
1239
+ '(',
1240
+ node.extension_items.map{|x| format(x)}.join(', '),
1241
+ ')'
1242
+ ].join('')
1243
+ end
1244
+ ].join('')
1245
+ end
1246
+
1247
+ def format_types_generic_entity(node)
1248
+ 'GENERIC_ENTITY'
1249
+ end
1250
+
1251
+ def format_types_generic(node)
1252
+ 'GENERIC'
1253
+ end
1254
+
1255
+ def format_types_integer(node)
1256
+ 'INTEGER'
1257
+ end
1258
+
1259
+ def format_types_list(node)
1260
+ [
1261
+ 'LIST',
1262
+ *if node.bound1 and node.bound2
1263
+ [
1264
+ ' ',
1265
+ '[',
1266
+ format(node.bound1),
1267
+ ':',
1268
+ format(node.bound2),
1269
+ ']',
1270
+ ].join('')
1271
+ end,
1272
+ ' ',
1273
+ 'OF',
1274
+ *if node.unique
1275
+ [
1276
+ ' ',
1277
+ 'UNIQUE'
1278
+ ].join('')
1279
+ end,
1280
+ ' ',
1281
+ format(node.base_type)
1282
+ ].join('')
1283
+ end
1284
+
1285
+ def format_types_logical(node)
1286
+ 'LOGICAL'
1287
+ end
1288
+
1289
+ def format_types_number(node)
1290
+ 'NUMBER'
1291
+ end
1292
+
1293
+ def format_types_real(node)
1294
+ [
1295
+ 'REAL',
1296
+ *if node.precision
1297
+ [
1298
+ ' ',
1299
+ '(',
1300
+ format(node.precision),
1301
+ ')'
1302
+ ].join('')
1303
+ end
1304
+ ].join('')
1305
+ end
1306
+
1307
+ def format_types_select(node)
1308
+ [
1309
+ *if node.extensible
1310
+ [
1311
+ 'EXTENSIBLE',
1312
+ ' '
1313
+ ].join('')
1314
+ end,
1315
+ *if node.generic_entity
1316
+ [
1317
+ 'GENERIC_ENTITY',
1318
+ ' '
1319
+ ].join('')
1320
+ end,
1321
+ 'SELECT',
1322
+ *if node.items and node.items.length > 0
1323
+ [
1324
+ ' ',
1325
+ '(',
1326
+ node.items.map{|x| format(x)}.join(', '),
1327
+ ')'
1328
+ ].join('')
1329
+ end,
1330
+ *if node.extension_type
1331
+ [
1332
+ ' ',
1333
+ 'BASED_ON',
1334
+ ' ',
1335
+ format(node.extension_type)
1336
+ ].join('')
1337
+ end,
1338
+ *if node.extension_items
1339
+ [
1340
+ ' ',
1341
+ 'WITH',
1342
+ ' ',
1343
+ '(',
1344
+ node.extension_items.map{|x| format(x)}.join(', '),
1345
+ ')'
1346
+ ].join('')
1347
+ end
1348
+ ].join('')
1349
+ end
1350
+
1351
+ def format_types_set(node)
1352
+ [
1353
+ 'SET',
1354
+ *if node.bound1 and node.bound2
1355
+ [
1356
+ ' ',
1357
+ '[',
1358
+ format(node.bound1),
1359
+ ':',
1360
+ format(node.bound2),
1361
+ ']',
1362
+ ].join('')
1363
+ end,
1364
+ ' ',
1365
+ 'OF',
1366
+ ' ',
1367
+ format(node.base_type)
1368
+ ].join('')
1369
+ end
1370
+
1371
+ def format_types_string(node)
1372
+ [
1373
+ 'STRING',
1374
+ *if node.width
1375
+ [
1376
+ ' ',
1377
+ '(',
1378
+ format(node.width),
1379
+ ')'
1380
+ ].join('')
1381
+ end,
1382
+ *if node.fixed
1383
+ [
1384
+ ' ',
1385
+ 'FIXED'
1386
+ ].join('')
1387
+ end
1388
+ ].join('')
1389
+ end
1390
+
1391
+ def indent(str)
1392
+ str.split("\n").map{|x| "#{INDENT}#{x}"}.join("\n")
1393
+ end
1394
+
1395
+ def format_remark(node, remark)
1396
+ if remark.include?("\n")
1397
+ [
1398
+ [
1399
+ '(*',
1400
+ '"',
1401
+ format_remark_ref(node),
1402
+ '"',
1403
+ ].join(''),
1404
+ remark,
1405
+ '*)'
1406
+ ].join("\n")
1407
+ else
1408
+ [
1409
+ '--',
1410
+ '"',
1411
+ format_remark_ref(node),
1412
+ '"',
1413
+ ' ',
1414
+ remark
1415
+ ].join('')
1416
+ end
1417
+ end
1418
+
1419
+ def format_remark_ref(node)
1420
+ [
1421
+ *if node.class.method_defined? :parent and node.parent != node
1422
+ [
1423
+ node.parent.id,
1424
+ '.'
1425
+ ].join('')
1426
+ end,
1427
+ node.id,
1428
+ ].join('')
1429
+ end
1430
+
1431
+ def format_scope_remarks(node)
1432
+ node.children.flat_map do |x|
1433
+ if x.remarks and x.remarks.length > 0
1434
+ x.remarks.map do |remark|
1435
+ format_remark(x, remark)
1436
+ end
1437
+ else
1438
+ []
1439
+ end
1440
+ end
1441
+ end
1442
+ end
1443
+ end
1444
+ end