expressir 2.1.31 → 2.2.1

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 (80) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/docs.yml +3 -2
  3. data/.github/workflows/release.yml +6 -0
  4. data/.rubocop_todo.yml +106 -92
  5. data/Gemfile +1 -1
  6. data/README.adoc +372 -1
  7. data/docs/_guides/formatter/formatter-architecture.adoc +401 -0
  8. data/docs/_guides/ruby-api/parsing-files.adoc +1 -1
  9. data/docs/_pages/parsers.adoc +31 -5
  10. data/docs/lychee.toml +3 -0
  11. data/expressir.gemspec +3 -2
  12. data/lib/expressir/benchmark.rb +6 -6
  13. data/lib/expressir/cli.rb +9 -0
  14. data/lib/expressir/commands/base.rb +2 -9
  15. data/lib/expressir/commands/format.rb +30 -0
  16. data/lib/expressir/commands/package.rb +92 -87
  17. data/lib/expressir/commands/validate_ascii.rb +2 -4
  18. data/lib/expressir/commands/validate_load.rb +8 -5
  19. data/lib/expressir/coverage.rb +15 -11
  20. data/lib/expressir/errors.rb +115 -0
  21. data/lib/expressir/express/builder.rb +350 -0
  22. data/lib/expressir/express/builders/attribute_decl_builder.rb +38 -0
  23. data/lib/expressir/express/builders/built_in_builder.rb +88 -0
  24. data/lib/expressir/express/builders/constant_builder.rb +115 -0
  25. data/lib/expressir/express/builders/declaration_builder.rb +24 -0
  26. data/lib/expressir/express/builders/derive_clause_builder.rb +16 -0
  27. data/lib/expressir/express/builders/derived_attr_builder.rb +28 -0
  28. data/lib/expressir/express/builders/domain_rule_builder.rb +21 -0
  29. data/lib/expressir/express/builders/entity_decl_builder.rb +108 -0
  30. data/lib/expressir/express/builders/explicit_attr_builder.rb +52 -0
  31. data/lib/expressir/express/builders/expression_builder.rb +453 -0
  32. data/lib/expressir/express/builders/function_decl_builder.rb +84 -0
  33. data/lib/expressir/express/builders/helpers.rb +148 -0
  34. data/lib/expressir/express/builders/interface_builder.rb +171 -0
  35. data/lib/expressir/express/builders/inverse_attr_builder.rb +45 -0
  36. data/lib/expressir/express/builders/inverse_attr_type_builder.rb +36 -0
  37. data/lib/expressir/express/builders/inverse_clause_builder.rb +16 -0
  38. data/lib/expressir/express/builders/literal_builder.rb +107 -0
  39. data/lib/expressir/express/builders/procedure_decl_builder.rb +80 -0
  40. data/lib/expressir/express/builders/qualifier_builder.rb +128 -0
  41. data/lib/expressir/express/builders/reference_builder.rb +27 -0
  42. data/lib/expressir/express/builders/rule_decl_builder.rb +95 -0
  43. data/lib/expressir/express/builders/schema_body_decl_builder.rb +22 -0
  44. data/lib/expressir/express/builders/schema_decl_builder.rb +62 -0
  45. data/lib/expressir/express/builders/schema_version_builder.rb +40 -0
  46. data/lib/expressir/express/builders/simple_id_builder.rb +26 -0
  47. data/lib/expressir/express/builders/statement_builder.rb +250 -0
  48. data/lib/expressir/express/builders/subtype_constraint_builder.rb +188 -0
  49. data/lib/expressir/express/builders/syntax_builder.rb +19 -0
  50. data/lib/expressir/express/builders/token_builder.rb +15 -0
  51. data/lib/expressir/express/builders/type_builder.rb +264 -0
  52. data/lib/expressir/express/builders/type_decl_builder.rb +32 -0
  53. data/lib/expressir/express/builders/unique_clause_builder.rb +22 -0
  54. data/lib/expressir/express/builders/unique_rule_builder.rb +36 -0
  55. data/lib/expressir/express/builders/where_clause_builder.rb +22 -0
  56. data/lib/expressir/express/builders.rb +43 -0
  57. data/lib/expressir/express/error.rb +18 -2
  58. data/lib/expressir/express/formatter.rb +18 -1508
  59. data/lib/expressir/express/formatters/data_types_formatter.rb +317 -0
  60. data/lib/expressir/express/formatters/declarations_formatter.rb +689 -0
  61. data/lib/expressir/express/formatters/expressions_formatter.rb +160 -0
  62. data/lib/expressir/express/formatters/literals_formatter.rb +46 -0
  63. data/lib/expressir/express/formatters/references_formatter.rb +42 -0
  64. data/lib/expressir/express/formatters/remark_formatter.rb +296 -0
  65. data/lib/expressir/express/formatters/statements_formatter.rb +224 -0
  66. data/lib/expressir/express/formatters/supertype_expressions_formatter.rb +48 -0
  67. data/lib/expressir/express/parser.rb +129 -14
  68. data/lib/expressir/express/pretty_formatter.rb +624 -0
  69. data/lib/expressir/express/remark_attacher.rb +1155 -0
  70. data/lib/expressir/express/resolve_references_model_visitor.rb +1 -0
  71. data/lib/expressir/express/streaming_builder.rb +467 -0
  72. data/lib/expressir/express/transformer/remark_handling.rb +196 -0
  73. data/lib/expressir/model/identifier.rb +1 -1
  74. data/lib/expressir/model/model_element.rb +30 -2
  75. data/lib/expressir/model/remark_info.rb +51 -0
  76. data/lib/expressir/model/search_engine.rb +58 -9
  77. data/lib/expressir/version.rb +1 -1
  78. data/lib/expressir.rb +6 -4
  79. metadata +71 -7
  80. data/lib/expressir/express/visitor.rb +0 -2815
@@ -1,9 +1,25 @@
1
1
  require_relative "formatters/remark_item_formatter"
2
+ require_relative "formatters/remark_formatter"
3
+ require_relative "formatters/literals_formatter"
4
+ require_relative "formatters/references_formatter"
5
+ require_relative "formatters/supertype_expressions_formatter"
6
+ require_relative "formatters/statements_formatter"
7
+ require_relative "formatters/expressions_formatter"
8
+ require_relative "formatters/data_types_formatter"
9
+ require_relative "formatters/declarations_formatter"
2
10
 
3
11
  module Expressir
4
12
  module Express
5
13
  class Formatter
6
14
  include RemarkItemFormatter
15
+ include RemarkFormatter
16
+ include LiteralsFormatter
17
+ include ReferencesFormatter
18
+ include SupertypeExpressionsFormatter
19
+ include StatementsFormatter
20
+ include ExpressionsFormatter
21
+ include DataTypesFormatter
22
+ include DeclarationsFormatter
7
23
 
8
24
  INDENT_CHAR = " ".freeze
9
25
  INDENT_WIDTH = 2
@@ -203,6 +219,8 @@ module Expressir
203
219
  # not implemented yet
204
220
  when Model::ModelElement
205
221
  # not implemented yet
222
+ when Model::Literals::Logical
223
+ node.value
206
224
  when NilClass
207
225
  # not implemented yet
208
226
  else
@@ -218,1519 +236,11 @@ module Expressir
218
236
  result ? "#{result}\n" : ""
219
237
  end
220
238
 
221
- def format_declarations_attribute(node)
222
- [
223
- *if node.supertype_attribute
224
- [
225
- format(node.supertype_attribute),
226
- " ",
227
- ].join
228
- end,
229
- *if node.supertype_attribute && node.id != node.supertype_attribute.attribute.id
230
- [
231
- "RENAMED",
232
- " ",
233
- node.id,
234
- " ",
235
- ].join
236
- end,
237
- *if node.id && !node.supertype_attribute
238
- [
239
- node.id,
240
- " ",
241
- ].join
242
- end,
243
- ":",
244
- *if node.optional
245
- [
246
- " ",
247
- "OPTIONAL",
248
- ].join
249
- end,
250
- " ",
251
- format(node.type),
252
- *if node.kind == Model::Declarations::Attribute::DERIVED
253
- [
254
- " ",
255
- ":=",
256
- " ",
257
- format(node.expression),
258
- ].join
259
- elsif node.kind == Model::Declarations::Attribute::INVERSE
260
- [
261
- " ",
262
- "FOR",
263
- " ",
264
- format(node.expression),
265
- ].join
266
- end,
267
- ";",
268
- ].join
269
- end
270
-
271
- def format_declarations_constant(node)
272
- [
273
- node.id,
274
- " ",
275
- ":",
276
- " ",
277
- format(node.type),
278
- " ",
279
- ":=",
280
- " ",
281
- format(node.expression),
282
- ";",
283
- ].join
284
- end
285
-
286
- def format_declarations_entity(node)
287
- if node.attributes.nil?
288
- explicit_attributes = []
289
- derived_attributes = []
290
- inverse_attributes = []
291
- else
292
- explicit_attributes = node.attributes.select do |x|
293
- x.kind == Model::Declarations::Attribute::EXPLICIT
294
- end
295
- derived_attributes = node.attributes.select do |x|
296
- x.kind == Model::Declarations::Attribute::DERIVED
297
- end
298
- inverse_attributes = node.attributes.select do |x|
299
- x.kind == Model::Declarations::Attribute::INVERSE
300
- end
301
- end
302
-
303
- [
304
- [
305
- "ENTITY",
306
- " ",
307
- node.id,
308
- *if node.abstract && !node.supertype_expression
309
- [
310
- "\n",
311
- indent([
312
- "ABSTRACT",
313
- " ",
314
- "SUPERTYPE",
315
- ].join),
316
- ].join
317
- end,
318
- *if node.abstract && node.supertype_expression
319
- [
320
- "\n",
321
- indent([
322
- "ABSTRACT",
323
- " ",
324
- "SUPERTYPE",
325
- " ",
326
- "OF",
327
- " ",
328
- "(",
329
- format(node.supertype_expression),
330
- ")",
331
- ].join),
332
- ].join
333
- end,
334
- *if !node.abstract && node.supertype_expression
335
- [
336
- "\n",
337
- indent([
338
- "SUPERTYPE",
339
- " ",
340
- "OF",
341
- " ",
342
- "(",
343
- format(node.supertype_expression),
344
- ")",
345
- ].join),
346
- ].join
347
- end,
348
- *if node.subtype_of&.length&.positive?
349
- [
350
- "\n",
351
- indent([
352
- "SUBTYPE",
353
- " ",
354
- "OF",
355
- " ",
356
- "(",
357
- node.subtype_of.map { |x| format(x) }.join(", "),
358
- ")",
359
- ].join),
360
- ].join
361
- end,
362
- ";",
363
- ].join,
364
- *if explicit_attributes&.length&.positive?
365
- indent(explicit_attributes.map { |x| format(x) }.join("\n"))
366
- end,
367
- *if derived_attributes&.length&.positive?
368
- [
369
- "DERIVE",
370
- indent(derived_attributes.map { |x| format(x) }.join("\n")),
371
- ]
372
- end,
373
- *if inverse_attributes&.length&.positive?
374
- [
375
- "INVERSE",
376
- indent(inverse_attributes.map { |x| format(x) }.join("\n")),
377
- ]
378
- end,
379
- *if node.unique_rules&.length&.positive?
380
- [
381
- "UNIQUE",
382
- indent(node.unique_rules.map { |x| format(x) }.join("\n")),
383
- ]
384
- end,
385
- *if node.where_rules&.length&.positive?
386
- [
387
- "WHERE",
388
- indent(node.where_rules.map { |x| format(x) }.join("\n")),
389
- ]
390
- end,
391
- [
392
- "END_ENTITY",
393
- ";",
394
- ].join,
395
- ].join("\n")
396
- end
397
-
398
- def format_declarations_function(node)
399
- [
400
- [
401
- "FUNCTION",
402
- " ",
403
- node.id,
404
- *if node.parameters&.length&.positive?
405
- parameter_indent = INDENT_CHAR * "FUNCTION #{node.id}(".length
406
- [
407
- "(",
408
- node.parameters.map do |x|
409
- format(x)
410
- end.join(";\n#{parameter_indent}"),
411
- ")",
412
- ].join
413
- end,
414
- " ",
415
- ":",
416
- " ",
417
- format(node.return_type),
418
- ";",
419
- ].join,
420
- *if node.types&.length&.positive?
421
- indent(node.types.map { |x| format(x) }.join("\n"))
422
- end,
423
- *if node.entities&.length&.positive?
424
- indent(node.entities.map { |x| format(x) }.join("\n"))
425
- end,
426
- *if node.subtype_constraints&.length&.positive?
427
- indent(node.subtype_constraints.map { |x| format(x) }.join("\n"))
428
- end,
429
- *if node.functions&.length&.positive?
430
- indent(node.functions.map { |x| format(x) }.join("\n"))
431
- end,
432
- *if node.procedures&.length&.positive?
433
- indent(node.procedures.map { |x| format(x) }.join("\n"))
434
- end,
435
- *if node.constants&.length&.positive?
436
- indent([
437
- "CONSTANT",
438
- indent(node.constants.map { |x| format(x) }.join("\n")),
439
- [
440
- "END_CONSTANT",
441
- ";",
442
- ].join,
443
- ].join("\n"))
444
- end,
445
- *if node.variables&.length&.positive?
446
- indent([
447
- "LOCAL",
448
- indent(node.variables.map { |x| format(x) }.join("\n")),
449
- [
450
- "END_LOCAL",
451
- ";",
452
- ].join,
453
- ].join("\n"))
454
- end,
455
- *if node.statements&.length&.positive?
456
- indent(node.statements.map { |x| format(x) }.join("\n"))
457
- end,
458
- [
459
- "END_FUNCTION",
460
- ";",
461
- ].join,
462
- ].join("\n")
463
- end
464
-
465
- def format_declarations_interface(node)
466
- [
467
- case node.kind
468
- when Model::Declarations::Interface::USE then "USE"
469
- when Model::Declarations::Interface::REFERENCE then "REFERENCE"
470
- end,
471
- " ",
472
- "FROM",
473
- " ",
474
- format(node.schema),
475
- *if node.items&.length&.positive?
476
- item_indent = INDENT_CHAR * "(".length
477
- [
478
- "\n",
479
- indent([
480
- "(",
481
- node.items.map { |x| format(x) }.join(",\n#{item_indent}"),
482
- ")",
483
- ].join),
484
- ].join
485
- end,
486
- ";",
487
- ].join
488
- end
489
-
490
- def format_declarations_interface_item(node)
491
- [
492
- format(node.ref),
493
- *if node.id
494
- [
495
- " ",
496
- "AS",
497
- " ",
498
- node.id,
499
- ]
500
- end,
501
- ].join
502
- end
503
-
504
- def format_declarations_parameter(node)
505
- [
506
- *if node.var
507
- [
508
- "VAR",
509
- " ",
510
- ].join
511
- end,
512
- node.id,
513
- " ",
514
- ":",
515
- " ",
516
- format(node.type),
517
- ].join
518
- end
519
-
520
- def format_declarations_procedure(node)
521
- [
522
- [
523
- "PROCEDURE",
524
- " ",
525
- node.id,
526
- *if node.parameters&.length&.positive?
527
- parameter_indent = INDENT_CHAR * "PROCEDURE #{node.id}(".length
528
- [
529
- "(",
530
- node.parameters.map do |x|
531
- format(x)
532
- end.join(";\n#{parameter_indent}"),
533
- ")",
534
- ].join
535
- end,
536
- ";",
537
- ].join,
538
- *if node.types&.length&.positive?
539
- indent(node.types.map { |x| format(x) }.join("\n"))
540
- end,
541
- *if node.entities&.length&.positive?
542
- indent(node.entities.map { |x| format(x) }.join("\n"))
543
- end,
544
- *if node.subtype_constraints&.length&.positive?
545
- indent(node.subtype_constraints.map { |x| format(x) }.join("\n"))
546
- end,
547
- *if node.functions&.length&.positive?
548
- indent(node.functions.map { |x| format(x) }.join("\n"))
549
- end,
550
- *if node.procedures&.length&.positive?
551
- indent(node.procedures.map { |x| format(x) }.join("\n"))
552
- end,
553
- *if node.constants&.length&.positive?
554
- indent([
555
- "CONSTANT",
556
- indent(node.constants.map { |x| format(x) }.join("\n")),
557
- [
558
- "END_CONSTANT",
559
- ";",
560
- ].join,
561
- ].join("\n"))
562
- end,
563
- *if node.variables&.length&.positive?
564
- indent([
565
- "LOCAL",
566
- indent(node.variables.map { |x| format(x) }.join("\n")),
567
- [
568
- "END_LOCAL",
569
- ";",
570
- ].join,
571
- ].join("\n"))
572
- end,
573
- *if node.statements&.length&.positive?
574
- indent(node.statements.map { |x| format(x) }.join("\n"))
575
- end,
576
- [
577
- "END_PROCEDURE",
578
- ";",
579
- ].join,
580
- ].join("\n")
581
- end
582
-
583
- def format_declarations_rule(node)
584
- node.applies_to ||= []
585
- [
586
- [
587
- "RULE",
588
- " ",
589
- node.id,
590
- " ",
591
- "FOR",
592
- " ",
593
- "(",
594
- node.applies_to.map { |x| format(x) }.join(", "),
595
- ")",
596
- ";",
597
- ].join,
598
- *if node.types&.length&.positive?
599
- indent(node.types.map { |x| format(x) }.join("\n"))
600
- end,
601
- *if node.entities&.length&.positive?
602
- indent(node.entities.map { |x| format(x) }.join("\n"))
603
- end,
604
- *if node.subtype_constraints&.length&.positive?
605
- indent(node.subtype_constraints.map { |x| format(x) }.join("\n"))
606
- end,
607
- *if node.functions&.length&.positive?
608
- indent(node.functions.map { |x| format(x) }.join("\n"))
609
- end,
610
- *if node.procedures&.length&.positive?
611
- indent(node.procedures.map { |x| format(x) }.join("\n"))
612
- end,
613
- *if node.constants&.length&.positive?
614
- indent([
615
- "CONSTANT",
616
- indent(node.constants.map { |x| format(x) }.join("\n")),
617
- [
618
- "END_CONSTANT",
619
- ";",
620
- ].join,
621
- ].join("\n"))
622
- end,
623
- *if node.variables&.length&.positive?
624
- indent([
625
- "LOCAL",
626
- indent(node.variables.map { |x| format(x) }.join("\n")),
627
- [
628
- "END_LOCAL",
629
- ";",
630
- ].join,
631
- ].join("\n"))
632
- end,
633
- *if node.statements&.length&.positive?
634
- indent(node.statements.map { |x| format(x) }.join("\n"))
635
- end,
636
- *if node.where_rules&.length&.positive?
637
- [
638
- "WHERE",
639
- indent(node.where_rules.map { |x| format(x) }.join("\n")),
640
- ]
641
- end,
642
- [
643
- "END_RULE",
644
- ";",
645
- ].join,
646
- ].join("\n")
647
- end
648
-
649
- def format_declarations_schema_head(node)
650
- [
651
- [
652
- "SCHEMA",
653
- " ",
654
- node.id,
655
- *if node.version
656
- [
657
- " ",
658
- format(node.version),
659
- ].join
660
- end,
661
- ";",
662
- ].join,
663
- *if node.interfaces&.length&.positive?
664
- [
665
- "",
666
- node.interfaces.map { |x| format(x) }.join("\n"),
667
- ]
668
- end,
669
- ].join("\n")
670
- end
671
-
672
- def format_declarations_schema(node)
673
- schema_declarations = [
674
- *if node.constants&.length&.positive?
675
- [
676
- "CONSTANT",
677
- indent(node.constants.map { |x| format(x) }.join("\n")),
678
- [
679
- "END_CONSTANT",
680
- ";",
681
- ].join,
682
- ].join("\n")
683
- end,
684
- *if node.types&.length&.positive?
685
- node.types.map { |x| format(x) }
686
- end,
687
- *if node.entities&.length&.positive?
688
- node.entities.map { |x| format(x) }
689
- end,
690
- *if node.subtype_constraints&.length&.positive?
691
- node.subtype_constraints.map { |x| format(x) }
692
- end,
693
- *if node.functions&.length&.positive?
694
- node.functions.map { |x| format(x) }
695
- end,
696
- *if node.rules&.length&.positive?
697
- node.rules.map { |x| format(x) }
698
- end,
699
- *if node.procedures&.length&.positive?
700
- node.procedures.map { |x| format(x) }
701
- end,
702
- ]
703
-
704
- [
705
- format_declarations_schema_head(node),
706
- *if schema_declarations&.length&.positive?
707
- [
708
- "",
709
- schema_declarations.join("\n\n"),
710
- "",
711
- ]
712
- end,
713
- [
714
- "END_SCHEMA",
715
- ";",
716
- ].join,
717
- *format_scope_remarks(node),
718
- ].join("\n")
719
- end
720
-
721
- def format_declarations_schema_version(node)
722
- [
723
- "'",
724
- node.value,
725
- "'",
726
- ].join
727
- end
728
-
729
- def format_declarations_subtype_constraint(node)
730
- [
731
- [
732
- "SUBTYPE_CONSTRAINT",
733
- " ",
734
- node.id,
735
- " ",
736
- "FOR",
737
- " ",
738
- format(node.applies_to),
739
- ";",
740
- ].join,
741
- *if node.abstract
742
- indent([
743
- "ABSTRACT",
744
- " ",
745
- "SUPERTYPE",
746
- ";",
747
- ].join)
748
- end,
749
- *if node.total_over&.length&.positive?
750
- indent([
751
- "TOTAL_OVER",
752
- "(",
753
- node.total_over.map { |x| format(x) }.join(", "),
754
- ")",
755
- ";",
756
- ].join)
757
- end,
758
- *if node.supertype_expression
759
- indent([
760
- format(node.supertype_expression),
761
- ";",
762
- ].join)
763
- end,
764
- [
765
- "END_SUBTYPE_CONSTRAINT",
766
- ";",
767
- ].join,
768
- ].join("\n")
769
- end
770
-
771
- def format_declarations_type(node)
772
- [
773
- [
774
- "TYPE",
775
- " ",
776
- node.id,
777
- " ",
778
- "=",
779
- " ",
780
- format(node.underlying_type),
781
- ";",
782
- ].join,
783
- *if node.where_rules&.length&.positive?
784
- [
785
- "WHERE",
786
- indent(node.where_rules.map { |x| format(x) }.join("\n")),
787
- ]
788
- end,
789
- [
790
- "END_TYPE",
791
- ";",
792
- ].join,
793
- ].join("\n")
794
- end
795
-
796
- def format_declarations_unique_rule(node)
797
- node.attributes ||= []
798
- [
799
- *if node.id
800
- [
801
- node.id,
802
- ":",
803
- " ",
804
- ].join
805
- end,
806
- node.attributes.map { |x| format(x) }.join(", "),
807
- ";",
808
- ].join
809
- end
810
-
811
- def format_declarations_variable(node)
812
- [
813
- node.id,
814
- " ",
815
- ":",
816
- " ",
817
- format(node.type),
818
- *if node.expression
819
- [
820
- " ",
821
- ":=",
822
- " ",
823
- format(node.expression),
824
- ].join
825
- end,
826
- ";",
827
- ].join
828
- end
829
-
830
- def format_declarations_where_rule(node)
831
- [
832
- *if node.id
833
- [
834
- node.id,
835
- ":",
836
- " ",
837
- ].join
838
- end,
839
- format(node.expression),
840
- ";",
841
- ].join
842
- end
843
-
844
- def format_declarations_informal_proposition_rule(node)
845
- [
846
- *if node.id
847
- [
848
- node.id,
849
- ":",
850
- " ",
851
- ].join
852
- end,
853
- ].join
854
- end
855
-
856
- def format_expressions_aggregate_initializer(node)
857
- node.items ||= []
858
- [
859
- "[",
860
- node.items.map { |x| format(x) }.join(", "),
861
- "]",
862
- ].join
863
- end
864
-
865
- def format_expressions_aggregate_initializer_item(node)
866
- [
867
- format(node.expression),
868
- ":",
869
- format(node.repetition),
870
- ].join
871
- end
872
-
873
- def format_expressions_binary_expression(node)
874
- op1_bin_exp = node.operand1.is_a?(Model::Expressions::BinaryExpression) &&
875
- (OPERATOR_PRECEDENCE[node.operand1.operator] > OPERATOR_PRECEDENCE[node.operator])
876
- op2_bin_exp = node.operand2.is_a?(Model::Expressions::BinaryExpression) &&
877
- (OPERATOR_PRECEDENCE[node.operand2.operator] > OPERATOR_PRECEDENCE[node.operator])
878
-
879
- [
880
- *if op1_bin_exp
881
- "("
882
- end,
883
- format(node.operand1),
884
- *if op1_bin_exp
885
- ")"
886
- end,
887
- " ",
888
- case node.operator
889
- when Model::Expressions::BinaryExpression::ADDITION then "+"
890
- when Model::Expressions::BinaryExpression::AND then "AND"
891
- when Model::Expressions::BinaryExpression::COMBINE then "||"
892
- when Model::Expressions::BinaryExpression::EQUAL then "="
893
- when Model::Expressions::BinaryExpression::EXPONENTIATION then "**"
894
- when Model::Expressions::BinaryExpression::GREATER_THAN then ">"
895
- when Model::Expressions::BinaryExpression::GREATER_THAN_OR_EQUAL then ">="
896
- when Model::Expressions::BinaryExpression::IN then "IN"
897
- when Model::Expressions::BinaryExpression::INSTANCE_EQUAL then ":=:"
898
- when Model::Expressions::BinaryExpression::INSTANCE_NOT_EQUAL then ":<>:"
899
- when Model::Expressions::BinaryExpression::INTEGER_DIVISION then "DIV"
900
- when Model::Expressions::BinaryExpression::LESS_THAN then "<"
901
- when Model::Expressions::BinaryExpression::LESS_THAN_OR_EQUAL then "<="
902
- when Model::Expressions::BinaryExpression::LIKE then "LIKE"
903
- when Model::Expressions::BinaryExpression::MODULO then "MOD"
904
- when Model::Expressions::BinaryExpression::MULTIPLICATION then "*"
905
- when Model::Expressions::BinaryExpression::NOT_EQUAL then "<>"
906
- when Model::Expressions::BinaryExpression::OR then "OR"
907
- when Model::Expressions::BinaryExpression::REAL_DIVISION then "/"
908
- when Model::Expressions::BinaryExpression::SUBTRACTION then "-"
909
- when Model::Expressions::BinaryExpression::XOR then "XOR"
910
- end,
911
- " ",
912
- *if op2_bin_exp
913
- "("
914
- end,
915
- format(node.operand2),
916
- *if op2_bin_exp
917
- ")"
918
- end,
919
- ].join
920
- end
921
-
922
- def format_expressions_entity_constructor(node)
923
- node.parameters ||= []
924
- [
925
- format(node.entity),
926
- "(",
927
- node.parameters.map { |x| format(x) }.join(", "),
928
- ")",
929
- ].join
930
- end
931
-
932
- def format_expressions_function_call(node)
933
- params = if node.parameters.nil?
934
- []
935
- else
936
- [
937
- "(",
938
- node.parameters.map { |x| format(x) }.join(", "),
939
- ")",
940
- ]
941
- end
942
-
943
- [format(node.function), params].join
944
- end
945
-
946
- def format_expressions_interval(node)
947
- [
948
- "{",
949
- format(node.low),
950
- " ",
951
- case node.operator1
952
- when Model::Expressions::Interval::LESS_THAN then "<"
953
- when Model::Expressions::Interval::LESS_THAN_OR_EQUAL then "<="
954
- end,
955
- " ",
956
- format(node.item),
957
- " ",
958
- case node.operator2
959
- when Model::Expressions::Interval::LESS_THAN then "<"
960
- when Model::Expressions::Interval::LESS_THAN_OR_EQUAL then "<="
961
- end,
962
- " ",
963
- format(node.high),
964
- "}",
965
- ].join
966
- end
967
-
968
- def format_expressions_query_expression(node)
969
- [
970
- "QUERY",
971
- "(",
972
- node.id,
973
- " ",
974
- "<*",
975
- " ",
976
- format(node.aggregate_source),
977
- " ",
978
- "|",
979
- " ",
980
- format(node.expression),
981
- *format_remarks(node).instance_eval do |x|
982
- x&.length&.positive? ? ["\n", *x, "\n"] : x
983
- end,
984
- ")",
985
- ].join
986
- end
987
-
988
- def format_expressions_unary_expression(node)
989
- [
990
- case node.operator
991
- when Model::Expressions::UnaryExpression::MINUS then "-"
992
- when Model::Expressions::UnaryExpression::NOT then "NOT"
993
- when Model::Expressions::UnaryExpression::PLUS then "+"
994
- end,
995
- if node.operator == Model::Expressions::UnaryExpression::NOT
996
- " "
997
- end,
998
- *if node.operand.is_a? Model::Expressions::BinaryExpression
999
- "("
1000
- end,
1001
- format(node.operand),
1002
- *if node.operand.is_a? Model::Expressions::BinaryExpression
1003
- ")"
1004
- end,
1005
- ].join
1006
- end
1007
-
1008
- def format_literals_binary(node)
1009
- [
1010
- "%",
1011
- node.value,
1012
- ].join
1013
- end
1014
-
1015
- def format_literals_integer(node)
1016
- node.value
1017
- end
1018
-
1019
- def format_literals_logical(node)
1020
- case node.value
1021
- when Model::Literals::Logical::TRUE then "TRUE"
1022
- when Model::Literals::Logical::FALSE then "FALSE"
1023
- when Model::Literals::Logical::UNKNOWN then "UNKNOWN"
1024
- end
1025
- end
1026
-
1027
- def format_literals_real(node)
1028
- node.value
1029
- end
1030
-
1031
- def format_literals_string(node)
1032
- if node.encoded
1033
- [
1034
- "\"",
1035
- node.value,
1036
- "\"",
1037
- ].join
1038
- else
1039
- [
1040
- "'",
1041
- node.value,
1042
- "'",
1043
- ].join
1044
- end
1045
- end
1046
-
1047
- def format_references_attribute_reference(node)
1048
- [
1049
- format(node.ref),
1050
- ".",
1051
- format(node.attribute),
1052
- ].join
1053
- end
1054
-
1055
- def format_references_group_reference(node)
1056
- [
1057
- format(node.ref),
1058
- "\\",
1059
- format(node.entity),
1060
- ].join
1061
- end
1062
-
1063
- def format_references_index_reference(node)
1064
- [
1065
- format(node.ref),
1066
- "[",
1067
- format(node.index1),
1068
- *if node.index2
1069
- [
1070
- ":",
1071
- format(node.index2),
1072
- ].join
1073
- end,
1074
- "]",
1075
- ].join
1076
- end
1077
-
1078
- def format_references_simple_reference(node)
1079
- node.id
1080
- end
1081
-
1082
- def format_statements_alias(node)
1083
- [
1084
- [
1085
- "ALIAS",
1086
- " ",
1087
- node.id,
1088
- " ",
1089
- "FOR",
1090
- " ",
1091
- format(node.expression),
1092
- ";",
1093
- ].join,
1094
- *if node.statements&.length&.positive?
1095
- indent(node.statements.map { |x| format(x) }.join("\n"))
1096
- end,
1097
- *format_remarks(node),
1098
- [
1099
- "END_ALIAS",
1100
- ";",
1101
- ].join,
1102
- ].join("\n")
1103
- end
1104
-
1105
- def format_statements_assignment(node)
1106
- [
1107
- format(node.ref),
1108
- " ",
1109
- ":=",
1110
- " ",
1111
- format(node.expression),
1112
- ";",
1113
- ].join
1114
- end
1115
-
1116
- def format_statements_procedure_call(node)
1117
- [
1118
- format(node.procedure),
1119
- *if node.parameters&.length&.positive?
1120
- [
1121
- "(",
1122
- node.parameters.map { |x| format(x) }.join(", "),
1123
- ")",
1124
- ].join
1125
- end,
1126
- ";",
1127
- ].join
1128
- end
1129
-
1130
- def format_statements_case(node)
1131
- [
1132
- [
1133
- "CASE",
1134
- " ",
1135
- format(node.expression),
1136
- " ",
1137
- "OF",
1138
- ].join,
1139
- *if node.actions&.length&.positive?
1140
- node.actions.map { |x| format(x) }
1141
- end,
1142
- *if node.otherwise_statement
1143
- [
1144
- [
1145
- "OTHERWISE",
1146
- " ",
1147
- ":",
1148
- ].join,
1149
- indent(format(node.otherwise_statement)),
1150
- ]
1151
- end,
1152
- [
1153
- "END_CASE",
1154
- ";",
1155
- ].join,
1156
- ].join("\n")
1157
- end
1158
-
1159
- def format_statements_case_action(node)
1160
- node.labels ||= []
1161
- [
1162
- [
1163
- node.labels.map { |x| format(x) }.join(", "),
1164
- " ",
1165
- ":",
1166
- ].join,
1167
- indent(format(node.statement)),
1168
- ].join("\n")
1169
- end
1170
-
1171
- def format_statements_compound(node)
1172
- node.statements ||= []
1173
- [
1174
- "BEGIN",
1175
- *if node.statements&.length&.positive?
1176
- indent(node.statements.map { |x| format(x) }.join("\n"))
1177
- end,
1178
- [
1179
- "END",
1180
- ";",
1181
- ].join,
1182
- ].join("\n")
1183
- end
1184
-
1185
- def format_statements_escape(_node)
1186
- [
1187
- "ESCAPE",
1188
- ";",
1189
- ].join
1190
- end
1191
-
1192
- def format_statements_if(node)
1193
- [
1194
- [
1195
- "IF",
1196
- " ",
1197
- format(node.expression),
1198
- " ",
1199
- "THEN",
1200
- ].join,
1201
- *if node.statements&.length&.positive?
1202
- indent(node.statements.map { |x| format(x) }.join("\n"))
1203
- end,
1204
- *if node.else_statements&.length&.positive?
1205
- [
1206
- "ELSE",
1207
- indent(node.else_statements.map { |x| format(x) }.join("\n")),
1208
- ].join("\n")
1209
- end,
1210
- [
1211
- "END_IF",
1212
- ";",
1213
- ].join,
1214
- ].join("\n")
1215
- end
1216
-
1217
- def format_statements_null(_node)
1218
- ";"
1219
- end
1220
-
1221
- def format_statements_repeat(node)
1222
- node.statements ||= []
1223
- [
1224
- [
1225
- "REPEAT",
1226
- *if node.id
1227
- [
1228
- " ",
1229
- node.id,
1230
- " ",
1231
- ":=",
1232
- " ",
1233
- format(node.bound1),
1234
- " ",
1235
- "TO",
1236
- " ",
1237
- format(node.bound2),
1238
- *if node.increment
1239
- [
1240
- " ",
1241
- "BY",
1242
- " ",
1243
- format(node.increment),
1244
- ].join
1245
- end,
1246
- ].join
1247
- end,
1248
- *if node.while_expression
1249
- [
1250
- " ",
1251
- "WHILE",
1252
- " ",
1253
- format(node.while_expression),
1254
- ].join
1255
- end,
1256
- *if node.until_expression
1257
- [
1258
- " ",
1259
- "UNTIL",
1260
- " ",
1261
- format(node.until_expression),
1262
- ].join
1263
- end,
1264
- ";",
1265
- ].join,
1266
- *if node.statements&.length&.positive?
1267
- indent(node.statements.map { |x| format(x) }.join("\n"))
1268
- end,
1269
- *format_remarks(node),
1270
- [
1271
- "END_REPEAT",
1272
- ";",
1273
- ].join,
1274
- ].join("\n")
1275
- end
1276
-
1277
- def format_statements_return(node)
1278
- [
1279
- "RETURN",
1280
- *if node.expression
1281
- [
1282
- " ",
1283
- "(",
1284
- format(node.expression),
1285
- ")",
1286
- ].join
1287
- end,
1288
- ";",
1289
- ].join
1290
- end
1291
-
1292
- def format_statements_skip(_node)
1293
- [
1294
- "SKIP",
1295
- ";",
1296
- ].join
1297
- end
1298
-
1299
- def format_supertype_expressions_binary_supertype_expression(node)
1300
- op1_higher_precedence = node.operand1.is_a?(Model::SupertypeExpressions::BinarySupertypeExpression) &&
1301
- (SUPERTYPE_OPERATOR_PRECEDENCE[node.operand1.operator] > SUPERTYPE_OPERATOR_PRECEDENCE[node.operator])
1302
- op2_higher_precedence = node.operand2.is_a?(Model::SupertypeExpressions::BinarySupertypeExpression) &&
1303
- (SUPERTYPE_OPERATOR_PRECEDENCE[node.operand2.operator] > SUPERTYPE_OPERATOR_PRECEDENCE[node.operator])
1304
-
1305
- [
1306
- *if op1_higher_precedence
1307
- "("
1308
- end,
1309
- format(node.operand1),
1310
- *if op1_higher_precedence
1311
- ")"
1312
- end,
1313
- " ",
1314
- case node.operator
1315
- when Model::SupertypeExpressions::BinarySupertypeExpression::AND then "AND"
1316
- when Model::SupertypeExpressions::BinarySupertypeExpression::ANDOR then "ANDOR"
1317
- end,
1318
- " ",
1319
- *if op2_higher_precedence
1320
- "("
1321
- end,
1322
- format(node.operand2),
1323
- *if op2_higher_precedence
1324
- ")"
1325
- end,
1326
- ].join
1327
- end
1328
-
1329
- def format_supertype_expressions_oneof_supertype_expression(node)
1330
- node.operands ||= []
1331
- [
1332
- "ONEOF",
1333
- "(",
1334
- node.operands.map { |x| format(x) }.join(", "),
1335
- ")",
1336
- ].join
1337
- end
1338
-
1339
- def format_data_types_aggregate(_node)
1340
- "AGGREGATE"
1341
- end
1342
-
1343
- def format_data_types_array(node)
1344
- [
1345
- "ARRAY",
1346
- *if node.bound1 && node.bound2
1347
- [
1348
- " ",
1349
- "[",
1350
- format(node.bound1),
1351
- ":",
1352
- format(node.bound2),
1353
- "]",
1354
- ].join
1355
- end,
1356
- " ",
1357
- "OF",
1358
- *if node.optional
1359
- [
1360
- " ",
1361
- "OPTIONAL",
1362
- ].join
1363
- end,
1364
- *if node.unique
1365
- [
1366
- " ",
1367
- "UNIQUE",
1368
- ].join
1369
- end,
1370
- " ",
1371
- format(node.base_type),
1372
- ].join
1373
- end
1374
-
1375
- def format_data_types_bag(node)
1376
- [
1377
- "BAG",
1378
- *if node.bound1 && node.bound2
1379
- [
1380
- " ",
1381
- "[",
1382
- format(node.bound1),
1383
- ":",
1384
- format(node.bound2),
1385
- "]",
1386
- ].join
1387
- end,
1388
- " ",
1389
- "OF",
1390
- " ",
1391
- format(node.base_type),
1392
- ].join
1393
- end
1394
-
1395
- def format_data_types_binary(node)
1396
- [
1397
- "BINARY",
1398
- *if node.width
1399
- [
1400
- " ",
1401
- "(",
1402
- format(node.width),
1403
- ")",
1404
- ].join
1405
- end,
1406
- *if node.fixed
1407
- [
1408
- " ",
1409
- "FIXED",
1410
- ].join
1411
- end,
1412
- ].join
1413
- end
1414
-
1415
- def format_data_types_boolean(_node)
1416
- "BOOLEAN"
1417
- end
1418
-
1419
- def format_data_types_enumeration(node)
1420
- [
1421
- *if node.extensible
1422
- [
1423
- "EXTENSIBLE",
1424
- " ",
1425
- ].join
1426
- end,
1427
- "ENUMERATION",
1428
- *if node.based_on
1429
- [
1430
- " ",
1431
- "BASED_ON",
1432
- " ",
1433
- format(node.based_on),
1434
- *if node.items&.length&.positive?
1435
- item_indent = INDENT_CHAR * "(".length
1436
- [
1437
- " ",
1438
- "WITH",
1439
- "\n",
1440
- indent([
1441
- "(",
1442
- node.items.map do |x|
1443
- format(x)
1444
- end.join(",\n#{item_indent}"),
1445
- ")",
1446
- ].join),
1447
- ].join
1448
- end,
1449
- ].join
1450
- else
1451
- [
1452
- *if node.items&.length&.positive?
1453
- item_indent = INDENT_CHAR * "(".length
1454
- [
1455
- " ",
1456
- "OF",
1457
- "\n",
1458
- indent([
1459
- "(",
1460
- node.items.map do |x|
1461
- format(x)
1462
- end.join(",\n#{item_indent}"),
1463
- ")",
1464
- ].join),
1465
- ].join
1466
- end,
1467
- ].join
1468
- end,
1469
- ].join
1470
- end
1471
-
1472
- def format_data_types_enumeration_item(node)
1473
- node.id
1474
- end
1475
-
1476
- def format_data_types_generic_entity(node)
1477
- [
1478
- "GENERIC_ENTITY",
1479
- *if node.id
1480
- [
1481
- ":",
1482
- node.id,
1483
- ]
1484
- end,
1485
- ].join
1486
- end
1487
-
1488
- def format_data_types_generic(node)
1489
- [
1490
- "GENERIC",
1491
- *if node.id
1492
- [
1493
- ":",
1494
- node.id,
1495
- ]
1496
- end,
1497
- ].join
1498
- end
1499
-
1500
- def format_data_types_integer(_node)
1501
- "INTEGER"
1502
- end
1503
-
1504
- def format_data_types_list(node)
1505
- [
1506
- "LIST",
1507
- *if node.bound1 && node.bound2
1508
- [
1509
- " ",
1510
- "[",
1511
- format(node.bound1),
1512
- ":",
1513
- format(node.bound2),
1514
- "]",
1515
- ].join
1516
- end,
1517
- " ",
1518
- "OF",
1519
- *if node.unique
1520
- [
1521
- " ",
1522
- "UNIQUE",
1523
- ].join
1524
- end,
1525
- " ",
1526
- format(node.base_type),
1527
- ].join
1528
- end
1529
-
1530
- def format_data_types_logical(_node)
1531
- "LOGICAL"
1532
- end
1533
-
1534
- def format_data_types_number(_node)
1535
- "NUMBER"
1536
- end
1537
-
1538
- def format_data_types_real(node)
1539
- [
1540
- "REAL",
1541
- *if node.precision
1542
- [
1543
- " ",
1544
- "(",
1545
- format(node.precision),
1546
- ")",
1547
- ].join
1548
- end,
1549
- ].join
1550
- end
1551
-
1552
- def format_data_types_select(node)
1553
- node.items ||= []
1554
- [
1555
- *if node.extensible
1556
- [
1557
- "EXTENSIBLE",
1558
- " ",
1559
- ].join
1560
- end,
1561
- *if node.generic_entity
1562
- [
1563
- "GENERIC_ENTITY",
1564
- " ",
1565
- ].join
1566
- end,
1567
- "SELECT",
1568
- *if node.based_on
1569
- [
1570
- " ",
1571
- "BASED_ON",
1572
- " ",
1573
- format(node.based_on),
1574
- *if node.items&.length&.positive?
1575
- item_indent = INDENT_CHAR * "(".length
1576
- [
1577
- " ",
1578
- "WITH",
1579
- "\n",
1580
- indent([
1581
- "(",
1582
- node.items.map do |x|
1583
- format(x)
1584
- end.join(",\n#{item_indent}"),
1585
- ")",
1586
- ].join),
1587
- ].join
1588
- end,
1589
- ].join
1590
- else
1591
- [
1592
- *if node.items&.length&.positive?
1593
- item_indent = INDENT_CHAR * "(".length
1594
- [
1595
- "\n",
1596
- indent([
1597
- "(",
1598
- node.items.map do |x|
1599
- format(x)
1600
- end.join(",\n#{item_indent}"),
1601
- ")",
1602
- ].join),
1603
- ].join
1604
- end,
1605
- ].join
1606
- end,
1607
- ].join
1608
- end
1609
-
1610
- def format_data_types_set(node)
1611
- [
1612
- "SET",
1613
- *if node.bound1 && node.bound2
1614
- [
1615
- " ",
1616
- "[",
1617
- format(node.bound1),
1618
- ":",
1619
- format(node.bound2),
1620
- "]",
1621
- ].join
1622
- end,
1623
- " ",
1624
- "OF",
1625
- " ",
1626
- format(node.base_type),
1627
- ].join
1628
- end
1629
-
1630
- def format_data_types_string(node)
1631
- [
1632
- "STRING",
1633
- *if node.width
1634
- [
1635
- " ",
1636
- "(",
1637
- format(node.width),
1638
- ")",
1639
- ].join
1640
- end,
1641
- *if node.fixed
1642
- [
1643
- " ",
1644
- "FIXED",
1645
- ].join
1646
- end,
1647
- ].join
1648
- end
1649
-
1650
239
  def indent(str)
1651
240
  return if str.nil?
1652
241
 
1653
242
  str.split("\n").map { |x| "#{INDENT}#{x}" }.join("\n")
1654
243
  end
1655
-
1656
- def format_remark(node, remark)
1657
- # Handle embedded remarks
1658
- if remark.include?("\n")
1659
- [
1660
- [
1661
- "(*\"",
1662
- node.path || node.id,
1663
- "\"",
1664
- ].join,
1665
- remark,
1666
- "*)",
1667
- ].join("\n")
1668
- elsif node.path.nil? && node.id.include?("IP")
1669
- # Handle inmediate informal propositions
1670
- [
1671
- "--",
1672
- node.id,
1673
- " ",
1674
- remark,
1675
- ].join
1676
- else
1677
- # Handle tail remarks
1678
- [
1679
- "--\"",
1680
- node.path || node.id,
1681
- "\" ",
1682
- remark,
1683
- ].join
1684
- end
1685
- end
1686
-
1687
- def format_untagged_remark(remark)
1688
- # Handle embedded remarks
1689
- if remark.include?("\n")
1690
- [
1691
- "(*",
1692
- remark,
1693
- "*)",
1694
- ].join("\n")
1695
- else
1696
- # Handle tail remarks
1697
- [
1698
- "-- ",
1699
- remark,
1700
- ].join
1701
- end
1702
- end
1703
-
1704
- def format_remarks(node)
1705
- remarks = []
1706
-
1707
- # Add tagged remarks
1708
- if node.class.method_defined?(:remarks) && !@no_remarks &&
1709
- !node.remarks.nil?
1710
- remarks.concat(node.remarks.compact.map do |remark|
1711
- format_remark(node, remark)
1712
- end)
1713
- end
1714
-
1715
- # Add untagged remarks
1716
- if node.respond_to?(:untagged_remarks) && !@no_remarks &&
1717
- !node.untagged_remarks.nil?
1718
- remarks.concat(node.untagged_remarks.map do |remark|
1719
- format_untagged_remark(remark)
1720
- end)
1721
- end
1722
-
1723
- remarks
1724
- end
1725
-
1726
- def format_scope_remarks(node)
1727
- [
1728
- *format_remarks(node),
1729
- *node&.children&.select do |x|
1730
- !x.is_a? Model::DataTypes::EnumerationItem or node.is_a? Model::Declarations::Type
1731
- end&.flat_map { |x| format_scope_remarks(x) },
1732
- ]
1733
- end
1734
244
  end
1735
245
  end
1736
246
  end