expressir 0.2.7-arm64-darwin

Sign up to get free protection for your applications and to get access to all the features.
Files changed (183) hide show
  1. checksums.yaml +7 -0
  2. data/.cross_rubies +30 -0
  3. data/.github/workflows/rake.yml +45 -0
  4. data/.github/workflows/release.yml +84 -0
  5. data/.gitignore +17 -0
  6. data/.gitmodules +3 -0
  7. data/.rspec +2 -0
  8. data/.rubocop.yml +508 -0
  9. data/Gemfile +4 -0
  10. data/README.adoc +147 -0
  11. data/Rakefile +11 -0
  12. data/bin/console +12 -0
  13. data/bin/rspec +29 -0
  14. data/bin/setup +8 -0
  15. data/demo.rb +18 -0
  16. data/docs/development.md +90 -0
  17. data/exe/expressir +20 -0
  18. data/exe/generate-parser +48 -0
  19. data/expressir.gemspec +43 -0
  20. data/lib/expressir.rb +21 -0
  21. data/lib/expressir/cli.rb +27 -0
  22. data/lib/expressir/cli/ui.rb +36 -0
  23. data/lib/expressir/config.rb +23 -0
  24. data/lib/expressir/express.rb +11 -0
  25. data/lib/expressir/express/aggregate_dimension.rb +38 -0
  26. data/lib/expressir/express/attribute.rb +15 -0
  27. data/lib/expressir/express/comment.rb +7 -0
  28. data/lib/expressir/express/defined_type.rb +36 -0
  29. data/lib/expressir/express/derived.rb +65 -0
  30. data/lib/expressir/express/derived_aggregate.rb +43 -0
  31. data/lib/expressir/express/entity.rb +137 -0
  32. data/lib/expressir/express/explicit.rb +70 -0
  33. data/lib/expressir/express/explicit_aggregate.rb +46 -0
  34. data/lib/expressir/express/explicit_or_derived.rb +16 -0
  35. data/lib/expressir/express/global_rule.rb +44 -0
  36. data/lib/expressir/express/interface_specification.rb +51 -0
  37. data/lib/expressir/express/interfaced_item.rb +38 -0
  38. data/lib/expressir/express/inverse.rb +46 -0
  39. data/lib/expressir/express/inverse_aggregate.rb +37 -0
  40. data/lib/expressir/express/model_element.rb +7 -0
  41. data/lib/expressir/express/named_type.rb +19 -0
  42. data/lib/expressir/express/remark.rb +8 -0
  43. data/lib/expressir/express/repository.rb +306 -0
  44. data/lib/expressir/express/schema_definition.rb +96 -0
  45. data/lib/expressir/express/subtype_constraint.rb +14 -0
  46. data/lib/expressir/express/type.rb +26 -0
  47. data/lib/expressir/express/type_aggregate.rb +42 -0
  48. data/lib/expressir/express/type_enum.rb +29 -0
  49. data/lib/expressir/express/type_parser.rb +45 -0
  50. data/lib/expressir/express/type_select.rb +82 -0
  51. data/lib/expressir/express/unique_rule.rb +35 -0
  52. data/lib/expressir/express/where_rule.rb +32 -0
  53. data/lib/expressir/express_exp/2.4/express_parser.bundle +0 -0
  54. data/lib/expressir/express_exp/2.5/express_parser.bundle +0 -0
  55. data/lib/expressir/express_exp/2.6/express_parser.bundle +0 -0
  56. data/lib/expressir/express_exp/2.7/express_parser.bundle +0 -0
  57. data/lib/expressir/express_exp/3.0/express_parser.bundle +0 -0
  58. data/lib/expressir/express_exp/formatter.rb +1450 -0
  59. data/lib/expressir/express_exp/parser.rb +41 -0
  60. data/lib/expressir/express_exp/visitor.rb +2464 -0
  61. data/lib/expressir/express_parser.rb +30 -0
  62. data/lib/expressir/model.rb +65 -0
  63. data/lib/expressir/model/attribute.rb +27 -0
  64. data/lib/expressir/model/constant.rb +17 -0
  65. data/lib/expressir/model/entity.rb +46 -0
  66. data/lib/expressir/model/enumeration_item.rb +11 -0
  67. data/lib/expressir/model/expressions/aggregate_initializer.rb +13 -0
  68. data/lib/expressir/model/expressions/aggregate_item.rb +15 -0
  69. data/lib/expressir/model/expressions/attribute_reference.rb +15 -0
  70. data/lib/expressir/model/expressions/binary_expression.rb +40 -0
  71. data/lib/expressir/model/expressions/call.rb +15 -0
  72. data/lib/expressir/model/expressions/entity_constructor.rb +15 -0
  73. data/lib/expressir/model/expressions/group_reference.rb +15 -0
  74. data/lib/expressir/model/expressions/index_reference.rb +17 -0
  75. data/lib/expressir/model/expressions/interval.rb +21 -0
  76. data/lib/expressir/model/expressions/query_expression.rb +26 -0
  77. data/lib/expressir/model/expressions/simple_reference.rb +13 -0
  78. data/lib/expressir/model/expressions/unary_expression.rb +19 -0
  79. data/lib/expressir/model/function.rb +62 -0
  80. data/lib/expressir/model/identifier.rb +10 -0
  81. data/lib/expressir/model/interface.rb +18 -0
  82. data/lib/expressir/model/literals/binary.rb +13 -0
  83. data/lib/expressir/model/literals/integer.rb +13 -0
  84. data/lib/expressir/model/literals/logical.rb +17 -0
  85. data/lib/expressir/model/literals/real.rb +13 -0
  86. data/lib/expressir/model/literals/string.rb +15 -0
  87. data/lib/expressir/model/parameter.rb +17 -0
  88. data/lib/expressir/model/procedure.rb +60 -0
  89. data/lib/expressir/model/renamed_ref.rb +13 -0
  90. data/lib/expressir/model/repository.rb +19 -0
  91. data/lib/expressir/model/rule.rb +62 -0
  92. data/lib/expressir/model/schema.rb +67 -0
  93. data/lib/expressir/model/scope.rb +17 -0
  94. data/lib/expressir/model/statements/alias.rb +26 -0
  95. data/lib/expressir/model/statements/assignment.rb +15 -0
  96. data/lib/expressir/model/statements/call.rb +15 -0
  97. data/lib/expressir/model/statements/case.rb +17 -0
  98. data/lib/expressir/model/statements/case_action.rb +15 -0
  99. data/lib/expressir/model/statements/compound.rb +13 -0
  100. data/lib/expressir/model/statements/escape.rb +8 -0
  101. data/lib/expressir/model/statements/if.rb +17 -0
  102. data/lib/expressir/model/statements/null.rb +8 -0
  103. data/lib/expressir/model/statements/repeat.rb +34 -0
  104. data/lib/expressir/model/statements/return.rb +13 -0
  105. data/lib/expressir/model/statements/skip.rb +8 -0
  106. data/lib/expressir/model/subtype_constraint.rb +27 -0
  107. data/lib/expressir/model/type.rb +24 -0
  108. data/lib/expressir/model/types/aggregate.rb +17 -0
  109. data/lib/expressir/model/types/array.rb +21 -0
  110. data/lib/expressir/model/types/bag.rb +17 -0
  111. data/lib/expressir/model/types/binary.rb +15 -0
  112. data/lib/expressir/model/types/boolean.rb +8 -0
  113. data/lib/expressir/model/types/enumeration.rb +19 -0
  114. data/lib/expressir/model/types/generic.rb +13 -0
  115. data/lib/expressir/model/types/generic_entity.rb +13 -0
  116. data/lib/expressir/model/types/integer.rb +8 -0
  117. data/lib/expressir/model/types/list.rb +19 -0
  118. data/lib/expressir/model/types/logical.rb +8 -0
  119. data/lib/expressir/model/types/number.rb +8 -0
  120. data/lib/expressir/model/types/real.rb +13 -0
  121. data/lib/expressir/model/types/select.rb +21 -0
  122. data/lib/expressir/model/types/set.rb +17 -0
  123. data/lib/expressir/model/types/string.rb +15 -0
  124. data/lib/expressir/model/unique.rb +15 -0
  125. data/lib/expressir/model/variable.rb +17 -0
  126. data/lib/expressir/model/where.rb +15 -0
  127. data/lib/expressir/parser.rb +6 -0
  128. data/lib/expressir/parser/owl_parser.rb +8 -0
  129. data/lib/expressir/version.rb +3 -0
  130. data/original/examples/ap233/ap233e1_arm_lf_stepmod-2010-11-12.exp +9589 -0
  131. data/original/examples/ap233/ap233e1_arm_lf_stepmod-2010-11-12.owl +36619 -0
  132. data/original/examples/ap233/ap233e1_arm_lf_stepmod-2010-11-12.xml +13294 -0
  133. data/original/examples/employment/eclipse/.project +17 -0
  134. data/original/examples/employment/eclipse/Export/Employment.png +0 -0
  135. data/original/examples/employment/eclipse/Express/employment_schema.exp +33 -0
  136. data/original/examples/employment/eclipse/Express/employment_schema.xmi +77 -0
  137. data/original/examples/employment/eclipse/Express/employment_schema.xml +93 -0
  138. data/original/examples/employment/eclipse/Models/Employment.uml +4 -0
  139. data/original/examples/employment/eclipse/Models/Employment.umldi +240 -0
  140. data/original/examples/employment/eclipse/readme.txt +7 -0
  141. data/original/examples/employment/employment_schema.exp +33 -0
  142. data/original/examples/employment/employment_schema.rb +232 -0
  143. data/original/examples/employment/employment_schema.xml +93 -0
  144. data/original/examples/employment/employment_schema___module.rb +46 -0
  145. data/original/examples/employment/employment_schema___p28attr.rb +126 -0
  146. data/original/examples/employment/employment_schema___p28inst.rb +26 -0
  147. data/original/examples/employment/example_employment_data.xml +1 -0
  148. data/original/examples/employment/example_employment_data_copy.xml +1 -0
  149. data/original/examples/employment/example_employment_reader.rb +30 -0
  150. data/original/examples/employment/example_employment_writer.rb +51 -0
  151. data/original/examples/plcs/ap239e1_arm_lf_dexlib_2010-01-06.exp +3710 -0
  152. data/original/examples/plcs/ap239e1_arm_lf_dexlib_2010-01-06.owl +35880 -0
  153. data/original/examples/plcs/ap239e1_arm_lf_dexlib_2010-01-06.xmi +15357 -0
  154. data/original/examples/plcs/ap239e1_arm_lf_dexlib_2010-01-06.xml +9468 -0
  155. data/original/examples/plcs/ap239e2_arm_lf_stepmod-2010-01-25.exp +8404 -0
  156. data/original/examples/plcs/ap239e2_arm_lf_stepmod-2010-01-25.owl +43147 -0
  157. data/original/examples/plcs/ap239e2_arm_lf_stepmod-2010-01-25.xmi +18341 -0
  158. data/original/examples/plcs/ap239e2_arm_lf_stepmod-2010-01-25.xml +11632 -0
  159. data/original/examples/syntax/remark.exp +146 -0
  160. data/original/examples/syntax/remark_formatted.exp +175 -0
  161. data/original/examples/syntax/syntax.exp +311 -0
  162. data/original/examples/syntax/syntax_formatted.exp +1191 -0
  163. data/original/exp2ruby.rb +525 -0
  164. data/original/expsm.rb +34 -0
  165. data/original/mapping_owl.rb +1018 -0
  166. data/original/mapping_sysml.rb +2281 -0
  167. data/original/mapping_uml2.rb +599 -0
  168. data/original/mapping_uml2_eclipse.rb +433 -0
  169. data/original/reeper.rb +134 -0
  170. data/rakelib/cross-ruby.rake +308 -0
  171. data/spec/acceptance/express_to_owl_spec.rb +18 -0
  172. data/spec/acceptance/version_spec.rb +12 -0
  173. data/spec/expressir/express/repository_spec.rb +25 -0
  174. data/spec/expressir/express_exp/ap233_spec.rb +22 -0
  175. data/spec/expressir/express_exp/format_remark_spec.rb +28 -0
  176. data/spec/expressir/express_exp/format_syntax_spec.rb +28 -0
  177. data/spec/expressir/express_exp/parse_remark_spec.rb +346 -0
  178. data/spec/expressir/express_exp/parse_syntax_spec.rb +3003 -0
  179. data/spec/expressir/model/find_spec.rb +110 -0
  180. data/spec/expressr_spec.rb +5 -0
  181. data/spec/spec_helper.rb +17 -0
  182. data/spec/support/console_helper.rb +29 -0
  183. metadata +357 -0
@@ -0,0 +1,96 @@
1
+ require "expressir/express/entity"
2
+ require "expressir/express/type_parser"
3
+ require "expressir/express/global_rule"
4
+
5
+ module Expressir
6
+ module Express
7
+ class SchemaDefinition < ModelElement
8
+ attr_accessor :contents, :name, :identification, :all_schema_array
9
+
10
+ def initialize(document = {})
11
+ @document = document
12
+ @all_schema_array = []
13
+
14
+ extract_attributes(@document)
15
+ end
16
+
17
+ # @todo Existing Code
18
+ #
19
+ # Please revisit this soon, and check if this is necessary
20
+ # after our recent restrucutre, if not then delegate this
21
+ # behavior to the respective instanace.
22
+ #
23
+ def find_namedtype_by_name(typename)
24
+ ## search current schema and interfaced item aliases
25
+ nt = contents.detect do |t|
26
+ t.is_a?(Express::NamedType) && t.name == typename
27
+ end
28
+
29
+ if nt != nil
30
+ return nt
31
+ end
32
+
33
+ for schema in self.all_schema_array
34
+ ## search all interfaced schemas
35
+ nt = schema.contents.detect do |t|
36
+ t.is_a?(Express::NamedType) && t.name == typename
37
+ end
38
+
39
+ if nt != nil
40
+ return nt
41
+ end
42
+ end
43
+
44
+ Expressir.ui.info("*** NOT HERE " + typename + " IN " + self.name)
45
+ Expressir.ui.info("*** SEARCHED " + all_schema_array.size.to_s + " SCHEMAS:")
46
+
47
+ all_schema_array.each do |schema|
48
+ Expressir.ui.info(" - " + schema.name)
49
+ end
50
+
51
+ nil
52
+ end
53
+
54
+ private
55
+
56
+ def extract_attributes(document)
57
+ @name = document.attributes["name"].to_s
58
+
59
+ contents = extract_interfaces(document)
60
+ contents += extract_entities(document)
61
+ contents += extract_types(document)
62
+ contents += extract_rules(document)
63
+
64
+ @contents = contents.flatten
65
+ end
66
+
67
+ # todo: current version does not contain any interface, so we need
68
+ # a solid example to test out this funcitonaality. But keeping it
69
+ # pending for now, let's revisit soon.
70
+ #
71
+ def extract_interfaces(document)
72
+ document.xpath("interface").map do |interface|
73
+ InterfaceSpecification.parse(interface, name)
74
+ end
75
+ end
76
+
77
+ def extract_entities(document)
78
+ document.xpath("//entity").map do |entity|
79
+ Express::Entity.parse(entity, name)
80
+ end
81
+ end
82
+
83
+ def extract_types(document)
84
+ document.xpath("type").map do |type_document|
85
+ Express::TypeParser.parse(type_document, name)
86
+ end
87
+ end
88
+
89
+ def extract_rules(document)
90
+ document.xpath("rule").map do |rule|
91
+ Express::GlobalRule.parse(rule, name)
92
+ end
93
+ end
94
+ end
95
+ end
96
+ end
@@ -0,0 +1,14 @@
1
+ require "expressir/express/model_element"
2
+
3
+ module Expressir
4
+ module Express
5
+ class SubtypeConstraint < ModelElement
6
+ attr_accessor :name, :entity, :isAbs, :totalover, :expression
7
+
8
+ def initialize
9
+ @isAbs = false
10
+ @totalover = nil
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,26 @@
1
+ require "expressir/express/defined_type"
2
+
3
+ module Expressir
4
+ module Express
5
+ class Type < DefinedType
6
+ attr_accessor :isBuiltin, :domain, :isFixed, :width, :precision
7
+
8
+ def initialize(options = {})
9
+ @isBuiltin = false
10
+ @isFixed = false
11
+ @width = nil
12
+ @precision = nil
13
+ @wheres = []
14
+ @selectedBy = []
15
+
16
+ super(options)
17
+ end
18
+
19
+ private
20
+
21
+ def extract_type_attributes(document)
22
+ super(document)
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,42 @@
1
+ require "expressir/express/type"
2
+
3
+ module Expressir
4
+ module Express
5
+ class TypeAggregate < Type
6
+ attr_accessor :rank, :dimensions
7
+ def initialize(options = {})
8
+ @rank = 0
9
+ @dimensions = []
10
+ @wheres = []
11
+ @selectedBy = []
12
+
13
+ super(options)
14
+ end
15
+
16
+ private
17
+
18
+ def extract_type_attributes(document)
19
+ @name = document.first.attributes["name"].to_s
20
+ @dimensions = document.map do |aggregate|
21
+ Express::AggregateDimension.parse(aggregate)
22
+ end
23
+
24
+ @rank = @dimensions.size
25
+ extract_builtintype_attributes(document)
26
+ end
27
+
28
+ def extract_builtintype_attributes(document)
29
+ builtin_type = document.xpath("builtintype").first
30
+
31
+ if builtin_type
32
+ @isBuiltin = true
33
+ @domain = builtin_type.attributes["type"].to_s
34
+ @width = builtin_type.attributes["width"].to_s
35
+ @fixed = builtin_type.attributes["fixed"] == "YES"
36
+ @precision = builtin_type.attributes["precision"].to_s
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
42
+
@@ -0,0 +1,29 @@
1
+ require "expressir/express/defined_type"
2
+
3
+ module Expressir
4
+ module Express
5
+ class TypeEnum < DefinedType
6
+ attr_accessor :items_array, :items, :extends, :extends_item,
7
+ :isExtensible, :allitems, :isBuiltin
8
+
9
+ def initialize(options = {})
10
+ @isBuiltin = false
11
+ @selectedBy = []
12
+
13
+ super(options)
14
+ end
15
+
16
+ private
17
+
18
+ def extract_type_attributes(document)
19
+ if document.class == Nokogiri::XML::NodeSet
20
+ document = document.first
21
+ end
22
+
23
+ @items = document.attributes["items"]
24
+ @items_array = items.to_s.scan(/\w+/)
25
+ super(document)
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,45 @@
1
+ require "expressir/express/type_enum"
2
+ require "expressir/express/type_select"
3
+ require "expressir/express/type_aggregate"
4
+
5
+ module Expressir
6
+ module Express
7
+ class TypeParser
8
+ def initialize(options = {})
9
+ @options = options
10
+ @schema = options.fetch(:schema, nil)
11
+ end
12
+
13
+ def parse
14
+ document = @options.fetch(:document, nil)
15
+ extract_attributes(document) if document
16
+ end
17
+
18
+ def self.parse(document, schema)
19
+ new(document: document, schema: schema).parse
20
+ end
21
+
22
+ private
23
+
24
+ def extract_attributes(document)
25
+ document_with_klass = document_with_klass(document)
26
+ document_with_klass[:cls].parse(document_with_klass[:document], @schema)
27
+ end
28
+
29
+ def document_with_klass(document)
30
+ if !document.xpath("select").empty?
31
+ { document: document.xpath("select"), cls: Express::TypeSelect }
32
+
33
+ elsif !document.xpath("enumeration").empty?
34
+ { document: document.xpath("enumeration"), cls: Express::TypeEnum }
35
+
36
+ elsif !document.xpath("aggregate").empty?
37
+ { document: document.xpath("aggregate"), cls: Express::TypeAggregate }
38
+
39
+ else
40
+ { document: document, cls: Express::Type }
41
+ end
42
+ end
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,82 @@
1
+ require "expressir/express/defined_type"
2
+
3
+ module Expressir
4
+ module Express
5
+ class TypeSelect < DefinedType
6
+ attr_accessor :selectitems_array, :selectitems, :extends, :extends_item,
7
+ :isExtensible, :selectitems_all, :isGenericEntity, :isBuiltin,
8
+ :cleaned_select_items
9
+
10
+ def initialize(options = {})
11
+ @isBuiltin = false
12
+ @isExtensible = false
13
+ @isGenericEntity = false
14
+ @selectitems = nil
15
+ @selectitems_array = []
16
+ @cleaned_select_items = nil
17
+ @wheres = []
18
+ @selectedBy = []
19
+
20
+ super(options)
21
+ end
22
+
23
+ ##
24
+ # set cleaned_select_items = process select removing unnecessary
25
+ # entity types (i.e. if supertype is there)
26
+ #
27
+ def clean_select_items
28
+ @cleaned_select_items = ""
29
+
30
+ if selectitems != nil
31
+ itemname_list = selectitems.scan(/\w+/)
32
+ dupitem_list = []
33
+ for itemname in itemname_list
34
+ itemptr = schema.find_namedtype_by_name( itemname )
35
+
36
+ if itemptr.kind_of? EXPSM::Entity
37
+
38
+ for itemname2 in itemname_list
39
+ thetype = schema.find_namedtype_by_name( itemname2 )
40
+
41
+ if thetype != nil
42
+ if itemptr.supertypes_all != nil &&
43
+ itemptr.supertypes_all.include?(thetype.name)
44
+
45
+ dupitem_list.push itemname
46
+ end
47
+ end
48
+ end
49
+ end
50
+ end
51
+
52
+ itemname_list.each do |itemname|
53
+ if !dupitem_list.include? itemname
54
+ @cleaned_select_items = @cleaned_select_items + " " + itemname
55
+ end
56
+ end
57
+
58
+ @cleaned_select_items = @cleaned_select_items.lstrip
59
+ end
60
+ end
61
+
62
+ private
63
+
64
+ def extract_type_attributes(document)
65
+ if document.class == Nokogiri::XML::NodeSet
66
+ document = document.first
67
+ end
68
+
69
+ @selectitems = document.attributes["selectitems"]
70
+ @extends = document.attributes["basedon"]
71
+ @isExtensible = document.attributes["extensible"] == "YES"
72
+ @isGenericEntity = document.attributes["genericentity"] == "YES"
73
+
74
+ if isExtensible
75
+ @selectitems_all = selectitems
76
+ end
77
+
78
+ super(document)
79
+ end
80
+ end
81
+ end
82
+ end
@@ -0,0 +1,35 @@
1
+ require "expressir/express/model_element"
2
+
3
+ module Expressir
4
+ module Express
5
+ class UniqueRule < ModelElement
6
+ attr_accessor :name, :attributes
7
+
8
+ def initialize(options)
9
+ @name = nil
10
+ @attributes = []
11
+ @options = options
12
+ end
13
+
14
+ def parse
15
+ document = @options.fetch(:document, nil)
16
+ extract_unique_attributes(document)
17
+
18
+ self
19
+ end
20
+
21
+ def self.parse(document)
22
+ new(document: document).parse
23
+ end
24
+
25
+ private
26
+
27
+ def extract_unique_attributes(document)
28
+ @name = document.attributes["label"].to_s
29
+ @attributes = document.xpath("unique.attribute").map do |attribute|
30
+ attribute.attributes["attribute"]
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,32 @@
1
+ require "expressir/express/model_element"
2
+
3
+ module Expressir
4
+ module Express
5
+ class WhereRule < ModelElement
6
+ attr_accessor :name, :expression
7
+
8
+ def initialize(options = {})
9
+ @name = nil
10
+ @options = options
11
+ end
12
+
13
+ def parse
14
+ document = @options.fetch(:where, nil)
15
+ extract_where_attributes(document) if document
16
+
17
+ self
18
+ end
19
+
20
+ def self.parse(document)
21
+ new(document: document).parse
22
+ end
23
+
24
+ private
25
+
26
+ def extract_where_attributes(document)
27
+ @name = document.attributes["label"].to_s
28
+ @expression = document.attributes["expression"]
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,1450 @@
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.supertype_attribute
175
+ [
176
+ format(node.supertype_attribute),
177
+ ' ',
178
+ ].join('')
179
+ end,
180
+ *if node.supertype_attribute and node.id
181
+ [
182
+ 'RENAMED',
183
+ ' '
184
+ ].join('')
185
+ end,
186
+ *if node.id
187
+ [
188
+ node.id,
189
+ ' '
190
+ ].join('')
191
+ end,
192
+ ':',
193
+ *if node.optional
194
+ [
195
+ ' ',
196
+ 'OPTIONAL'
197
+ ].join('')
198
+ end,
199
+ ' ',
200
+ format(node.type),
201
+ *if node.kind == Model::Attribute::DERIVED
202
+ [
203
+ ' ',
204
+ ':=',
205
+ ' ',
206
+ format(node.expression)
207
+ ].join('')
208
+ elsif node.kind == Model::Attribute::INVERSE
209
+ [
210
+ ' ',
211
+ 'FOR',
212
+ ' ',
213
+ format(node.expression)
214
+ ].join('')
215
+ end,
216
+ ';',
217
+ ].join('')
218
+ end
219
+
220
+ def format_constant(node)
221
+ [
222
+ node.id,
223
+ ' ',
224
+ ':',
225
+ ' ',
226
+ format(node.type),
227
+ ' ',
228
+ ':=',
229
+ ' ',
230
+ format(node.expression),
231
+ ';'
232
+ ].join('')
233
+ end
234
+
235
+ def format_entity(node)
236
+ [
237
+ [
238
+ 'ENTITY',
239
+ ' ',
240
+ node.id,
241
+ *if node.abstract and !node.supertype_expression
242
+ [
243
+ "\n",
244
+ INDENT,
245
+ 'ABSTRACT',
246
+ ' ',
247
+ 'SUPERTYPE'
248
+ ].join('')
249
+ end,
250
+ *if node.abstract and node.supertype_expression
251
+ [
252
+ "\n",
253
+ INDENT,
254
+ 'ABSTRACT',
255
+ ' ',
256
+ 'SUPERTYPE',
257
+ ' ',
258
+ 'OF',
259
+ ' ',
260
+ '(',
261
+ format(node.supertype_expression),
262
+ ')'
263
+ ].join('')
264
+ end,
265
+ *if !node.abstract and node.supertype_expression
266
+ [
267
+ "\n",
268
+ INDENT,
269
+ 'SUPERTYPE',
270
+ ' ',
271
+ 'OF',
272
+ ' ',
273
+ '(',
274
+ format(node.supertype_expression),
275
+ ')'
276
+ ].join('')
277
+ end,
278
+ *if node.subtype_of and node.subtype_of.length > 0
279
+ [
280
+ "\n",
281
+ INDENT,
282
+ 'SUBTYPE',
283
+ ' ',
284
+ 'OF',
285
+ ' ',
286
+ '(',
287
+ node.subtype_of.map{|x| format(x)}.join(', '),
288
+ ')'
289
+ ].join('')
290
+ end,
291
+ ';'
292
+ ].join(''),
293
+ *if node.explicit_attributes and node.explicit_attributes.length > 0
294
+ indent(node.explicit_attributes.map{|x| format(x)}.join("\n"))
295
+ end,
296
+ *if node.derived_attributes and node.derived_attributes.length > 0
297
+ indent([
298
+ 'DERIVE',
299
+ indent(node.derived_attributes.map{|x| format(x)}.join("\n")),
300
+ ].join("\n"))
301
+ end,
302
+ *if node.inverse_attributes and node.inverse_attributes.length > 0
303
+ indent([
304
+ 'INVERSE',
305
+ indent(node.inverse_attributes.map{|x| format(x)}.join("\n")),
306
+ ].join("\n"))
307
+ end,
308
+ *if node.unique and node.unique.length > 0
309
+ indent([
310
+ 'UNIQUE',
311
+ indent(node.unique.map{|x| format(x)}.join("\n"))
312
+ ].join("\n"))
313
+ end,
314
+ *if node.where and node.where.length > 0
315
+ indent([
316
+ 'WHERE',
317
+ indent(node.where.map{|x| format(x)}.join("\n")),
318
+ ].join("\n"))
319
+ end,
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
+ [
377
+ 'END_FUNCTION',
378
+ ';'
379
+ ].join('')
380
+ ].join("\n")
381
+ end
382
+
383
+ def format_interface(node)
384
+ [
385
+ case node.kind
386
+ when Model::Interface::USE then 'USE'
387
+ when Model::Interface::REFERENCE then 'REFERENCE'
388
+ end,
389
+ ' ',
390
+ 'FROM',
391
+ ' ',
392
+ format(node.schema),
393
+ *if node.items and node.items.length > 0
394
+ [
395
+ "\n",
396
+ INDENT,
397
+ '(',
398
+ node.items.map{|x| format(x)},
399
+ ')'
400
+ ].join('')
401
+ end,
402
+ ';',
403
+ ].join('')
404
+ end
405
+
406
+ def format_parameter(node)
407
+ [
408
+ *if node.var
409
+ [
410
+ 'VAR',
411
+ ' '
412
+ ].join('')
413
+ end,
414
+ node.id,
415
+ ' ',
416
+ ':',
417
+ ' ',
418
+ format(node.type)
419
+ ].join('')
420
+ end
421
+
422
+ def format_procedure(node)
423
+ [
424
+ [
425
+ 'PROCEDURE',
426
+ ' ',
427
+ node.id,
428
+ *if node.parameters and node.parameters.length > 0
429
+ [
430
+ '(',
431
+ node.parameters.map{|x| format(x)}.join('; '),
432
+ ')'
433
+ ].join('')
434
+ end,
435
+ ';'
436
+ ].join(''),
437
+ *if node.declarations and node.declarations.length > 0
438
+ indent(node.declarations.map{|x| format(x)}.join("\n"))
439
+ end,
440
+ *if node.constants and node.constants.length > 0
441
+ indent([
442
+ 'CONSTANT',
443
+ indent(node.constants.map{|x| format(x)}.join("\n")),
444
+ [
445
+ 'END_CONSTANT',
446
+ ';'
447
+ ].join('')
448
+ ].join("\n"))
449
+ end,
450
+ *if node.variables and node.variables.length > 0
451
+ indent([
452
+ 'LOCAL',
453
+ indent(node.variables.map{|x| format(x)}.join("\n")),
454
+ [
455
+ 'END_LOCAL',
456
+ ';'
457
+ ].join('')
458
+ ].join("\n"))
459
+ end,
460
+ *if node.statements and node.statements.length > 0
461
+ indent(node.statements.map{|x| format(x)}.join("\n"))
462
+ end,
463
+ [
464
+ 'END_PROCEDURE',
465
+ ';'
466
+ ].join('')
467
+ ].join("\n")
468
+ end
469
+
470
+ def format_renamed_ref(node)
471
+ [
472
+ format(node.ref),
473
+ ' ',
474
+ 'AS',
475
+ ' ',
476
+ node.id
477
+ ].join('')
478
+ end
479
+
480
+ def format_repository(node)
481
+ [
482
+ *if node.schemas and node.schemas.length > 0
483
+ node.schemas.map{|node| format(node)}
484
+ end,
485
+ *format_scope_remarks(node)
486
+ ].join("\n")
487
+ end
488
+
489
+ def format_rule(node)
490
+ [
491
+ [
492
+ 'RULE',
493
+ ' ',
494
+ node.id,
495
+ ' ',
496
+ 'FOR',
497
+ ' ',
498
+ '(',
499
+ node.applies_to.map{|x| format(x)}.join(', '),
500
+ ')',
501
+ ';'
502
+ ].join(''),
503
+ *if node.declarations and node.declarations.length > 0
504
+ indent(node.declarations.map{|x| format(x)}.join("\n"))
505
+ end,
506
+ *if node.constants and node.constants.length > 0
507
+ indent([
508
+ 'CONSTANT',
509
+ indent(node.constants.map{|x| format(x)}.join("\n")),
510
+ [
511
+ 'END_CONSTANT',
512
+ ';'
513
+ ].join('')
514
+ ].join("\n"))
515
+ end,
516
+ *if node.variables and node.variables.length > 0
517
+ indent([
518
+ 'LOCAL',
519
+ indent(node.variables.map{|x| format(x)}.join("\n")),
520
+ [
521
+ 'END_LOCAL',
522
+ ';'
523
+ ].join('')
524
+ ].join("\n"))
525
+ end,
526
+ *if node.statements and node.statements.length > 0
527
+ indent(node.statements.map{|x| format(x)}.join("\n"))
528
+ end,
529
+ *if node.where and node.where.length > 0
530
+ indent([
531
+ 'WHERE',
532
+ indent(node.where.map{|x| format(x)}.join("\n"))
533
+ ].join("\n"))
534
+ end,
535
+ [
536
+ 'END_RULE',
537
+ ';'
538
+ ].join('')
539
+ ].join("\n")
540
+ end
541
+
542
+ def format_schema(node)
543
+ [
544
+ [
545
+ 'SCHEMA',
546
+ ' ',
547
+ node.id,
548
+ *if node.version
549
+ [
550
+ ' ',
551
+ format(node.version),
552
+ ].join('')
553
+ end,
554
+ ';'
555
+ ].join(''),
556
+ *if node.interfaces and node.interfaces.length > 0
557
+ node.interfaces.map{|x| format(x)}.join("\n")
558
+ end,
559
+ *if node.constants and node.constants.length > 0
560
+ [
561
+ 'CONSTANT',
562
+ indent(node.constants.map{|x| format(x)}.join("\n")),
563
+ [
564
+ 'END_CONSTANT',
565
+ ';'
566
+ ].join('')
567
+ ].join("\n")
568
+ end,
569
+ *if node.declarations and node.declarations.length > 0
570
+ node.declarations.map{|x| format(x)}.join("\n\n")
571
+ end,
572
+ [
573
+ 'END_SCHEMA',
574
+ ';'
575
+ ].join('')
576
+ ].join("\n")
577
+ end
578
+
579
+ def format_subtype_constraint(node)
580
+ [
581
+ [
582
+ 'SUBTYPE_CONSTRAINT',
583
+ ' ',
584
+ node.id,
585
+ ' ',
586
+ 'FOR',
587
+ ' ',
588
+ format(node.applies_to),
589
+ ';'
590
+ ].join(''),
591
+ *if node.abstract
592
+ indent([
593
+ 'ABSTRACT',
594
+ ' ',
595
+ 'SUPERTYPE',
596
+ ';'
597
+ ].join(''))
598
+ end,
599
+ *if node.total_over and node.total_over.length > 0
600
+ indent([
601
+ 'TOTAL_OVER',
602
+ '(',
603
+ node.total_over.map{|x| format(x)}.join(', '),
604
+ ')',
605
+ ';'
606
+ ].join(''))
607
+ end,
608
+ *if node.supertype_expression
609
+ indent([
610
+ format(node.supertype_expression),
611
+ ';'
612
+ ].join(''))
613
+ end,
614
+ [
615
+ 'END_SUBTYPE_CONSTRAINT',
616
+ ';'
617
+ ].join('')
618
+ ].join("\n")
619
+ end
620
+
621
+ def format_type(node)
622
+ [
623
+ [
624
+ 'TYPE',
625
+ ' ',
626
+ node.id,
627
+ ' ',
628
+ '=',
629
+ ' ',
630
+ format(node.type),
631
+ ';',
632
+ ].join(''),
633
+ *if node.where and node.where.length > 0
634
+ indent([
635
+ 'WHERE',
636
+ indent(node.where.map{|x| format(x)}.join("\n"))
637
+ ].join("\n"))
638
+ end,
639
+ [
640
+ 'END_TYPE',
641
+ ';'
642
+ ].join('')
643
+ ].join("\n")
644
+ end
645
+
646
+ def format_unique(node)
647
+ [
648
+ *if node.id
649
+ [
650
+ node.id,
651
+ ' ',
652
+ ':',
653
+ ' '
654
+ ].join('')
655
+ end,
656
+ node.attributes.map{|x| format(x)}.join(', '),
657
+ ';'
658
+ ].join('')
659
+ end
660
+
661
+ def format_variable(node)
662
+ [
663
+ node.id,
664
+ ' ',
665
+ ':',
666
+ ' ',
667
+ format(node.type),
668
+ *if node.expression
669
+ [
670
+ ' ',
671
+ ':=',
672
+ ' ',
673
+ format(node.expression),
674
+ ].join('')
675
+ end,
676
+ ';'
677
+ ].join('')
678
+ end
679
+
680
+ def format_where(node)
681
+ [
682
+ *if node.id
683
+ [
684
+ node.id,
685
+ ' ',
686
+ ':',
687
+ ' '
688
+ ].join('')
689
+ end,
690
+ format(node.expression),
691
+ ';'
692
+ ].join('')
693
+ end
694
+
695
+ def format_expressions_aggregate_initializer(node)
696
+ [
697
+ '[',
698
+ node.items.map{|x| format(x)}.join(', '),
699
+ ']'
700
+ ].join('')
701
+ end
702
+
703
+ def format_expressions_aggregate_item(node)
704
+ [
705
+ format(node.expression),
706
+ ':',
707
+ format(node.repetition)
708
+ ].join('')
709
+ end
710
+
711
+ def format_expressions_attribute_reference(node)
712
+ [
713
+ format(node.ref),
714
+ '.',
715
+ format(node.attribute)
716
+ ].join('')
717
+ end
718
+
719
+ def format_expressions_binary_expression(node)
720
+ [
721
+ *if node.operand1.instance_of? Model::Expressions::BinaryExpression and OPERATOR_PRECEDENCE[node.operand1.operator] > OPERATOR_PRECEDENCE[node.operator]
722
+ '('
723
+ end,
724
+ format(node.operand1),
725
+ *if node.operand1.instance_of? Model::Expressions::BinaryExpression and OPERATOR_PRECEDENCE[node.operand1.operator] > OPERATOR_PRECEDENCE[node.operator]
726
+ ')'
727
+ end,
728
+ ' ',
729
+ case node.operator
730
+ when Model::Expressions::BinaryExpression::ADDITION then '+'
731
+ when Model::Expressions::BinaryExpression::AND then 'AND'
732
+ when Model::Expressions::BinaryExpression::ANDOR then 'ANDOR'
733
+ when Model::Expressions::BinaryExpression::COMBINE then '||'
734
+ when Model::Expressions::BinaryExpression::EQUAL then '='
735
+ when Model::Expressions::BinaryExpression::EXPONENTIATION then '**'
736
+ when Model::Expressions::BinaryExpression::GREATER_THAN then '>'
737
+ when Model::Expressions::BinaryExpression::GREATER_THAN_OR_EQUAL then '>='
738
+ when Model::Expressions::BinaryExpression::IN then 'IN'
739
+ when Model::Expressions::BinaryExpression::INSTANCE_EQUAL then ':=:'
740
+ when Model::Expressions::BinaryExpression::INSTANCE_NOT_EQUAL then ':<>:'
741
+ when Model::Expressions::BinaryExpression::INTEGER_DIVISION then 'DIV'
742
+ when Model::Expressions::BinaryExpression::LESS_THAN then '<'
743
+ when Model::Expressions::BinaryExpression::LESS_THAN_OR_EQUAL then '<='
744
+ when Model::Expressions::BinaryExpression::LIKE then 'LIKE'
745
+ when Model::Expressions::BinaryExpression::MODULO then 'MOD'
746
+ when Model::Expressions::BinaryExpression::MULTIPLICATION then '*'
747
+ when Model::Expressions::BinaryExpression::NOT_EQUAL then '<>'
748
+ when Model::Expressions::BinaryExpression::OR then 'OR'
749
+ when Model::Expressions::BinaryExpression::REAL_DIVISION then '/'
750
+ when Model::Expressions::BinaryExpression::SUBTRACTION then '-'
751
+ when Model::Expressions::BinaryExpression::XOR then 'XOR'
752
+ end,
753
+ ' ',
754
+ *if node.operand2.instance_of? Model::Expressions::BinaryExpression and OPERATOR_PRECEDENCE[node.operand2.operator] > OPERATOR_PRECEDENCE[node.operator]
755
+ '('
756
+ end,
757
+ format(node.operand2),
758
+ *if node.operand2.instance_of? Model::Expressions::BinaryExpression and OPERATOR_PRECEDENCE[node.operand2.operator] > OPERATOR_PRECEDENCE[node.operator]
759
+ ')'
760
+ end,
761
+ ].join('')
762
+ end
763
+
764
+ def format_expressions_call(node)
765
+ [
766
+ format(node.ref),
767
+ '(',
768
+ node.parameters.map{|x| format(x)}.join(', '),
769
+ ')'
770
+ ].join('')
771
+ end
772
+
773
+ def format_expressions_entity_constructor(node)
774
+ [
775
+ format(node.entity),
776
+ '(',
777
+ node.parameters.map{|x| format(x)}.join(', '),
778
+ ')'
779
+ ].join('')
780
+ end
781
+
782
+ def format_expressions_group_reference(node)
783
+ [
784
+ format(node.ref),
785
+ '\\',
786
+ format(node.entity)
787
+ ].join('')
788
+ end
789
+
790
+ def format_expressions_index_reference(node)
791
+ [
792
+ format(node.ref),
793
+ '[',
794
+ format(node.index1),
795
+ *if node.index2
796
+ [
797
+ ':',
798
+ format(node.index2)
799
+ ].join('')
800
+ end,
801
+ ']'
802
+ ].join('')
803
+ end
804
+
805
+ def format_expressions_interval(node)
806
+ [
807
+ '{',
808
+ format(node.low),
809
+ ' ',
810
+ case node.operator1
811
+ when Model::Expressions::BinaryExpression::LESS_THAN then '<'
812
+ when Model::Expressions::BinaryExpression::LESS_THAN_OR_EQUAL then '<='
813
+ end,
814
+ ' ',
815
+ format(node.item),
816
+ ' ',
817
+ case node.operator2
818
+ when Model::Expressions::BinaryExpression::LESS_THAN then '<'
819
+ when Model::Expressions::BinaryExpression::LESS_THAN_OR_EQUAL then '<='
820
+ end,
821
+ ' ',
822
+ format(node.high),
823
+ '}'
824
+ ].join('')
825
+ end
826
+
827
+ def format_expressions_query_expression(node)
828
+ [
829
+ 'QUERY',
830
+ '(',
831
+ node.id,
832
+ ' ',
833
+ '<*',
834
+ ' ',
835
+ format(node.aggregate_source),
836
+ ' ',
837
+ '|',
838
+ ' ',
839
+ format(node.expression),
840
+ *format_remarks(node).instance_eval{|x| x.length > 0 ? ["\n", *x, "\n"] : x},
841
+ ')'
842
+ ].join('')
843
+ end
844
+
845
+ def format_expressions_simple_reference(node)
846
+ node.id
847
+ end
848
+
849
+ def format_expressions_unary_expression(node)
850
+ [
851
+ case node.operator
852
+ when Model::Expressions::UnaryExpression::MINUS then '-'
853
+ when Model::Expressions::UnaryExpression::NOT then 'NOT'
854
+ when Model::Expressions::UnaryExpression::PLUS then '+'
855
+ end,
856
+ if node.operator == Model::Expressions::UnaryExpression::NOT
857
+ ' '
858
+ end,
859
+ *if node.operand.instance_of? Model::Expressions::BinaryExpression
860
+ '('
861
+ end,
862
+ format(node.operand),
863
+ *if node.operand.instance_of? Model::Expressions::BinaryExpression
864
+ ')'
865
+ end
866
+ ].join('')
867
+ end
868
+
869
+ def format_literals_binary(node)
870
+ [
871
+ '%',
872
+ node.value
873
+ ].join('')
874
+ end
875
+
876
+ def format_literals_integer(node)
877
+ node.value
878
+ end
879
+
880
+ def format_literals_logical(node)
881
+ case node.value
882
+ when Model::Literals::Logical::TRUE then 'TRUE'
883
+ when Model::Literals::Logical::FALSE then 'FALSE'
884
+ when Model::Literals::Logical::UNKNOWN then 'UNKNOWN'
885
+ end
886
+ end
887
+
888
+ def format_literals_real(node)
889
+ node.value
890
+ end
891
+
892
+ def format_literals_string(node)
893
+ if node.encoded
894
+ [
895
+ "\"",
896
+ node.value,
897
+ "\""
898
+ ].join('')
899
+ else
900
+ [
901
+ "'",
902
+ node.value,
903
+ "'"
904
+ ].join('')
905
+ end
906
+ end
907
+
908
+ def format_statements_alias(node)
909
+ [
910
+ [
911
+ 'ALIAS',
912
+ ' ',
913
+ node.id,
914
+ ' ',
915
+ 'FOR',
916
+ ' ',
917
+ format(node.expression),
918
+ ';'
919
+ ].join(''),
920
+ *if node.statements and node.statements.length > 0
921
+ indent(node.statements.map{|x| format(x)}.join("\n"))
922
+ end,
923
+ *format_remarks(node),
924
+ [
925
+ 'END_ALIAS',
926
+ ';'
927
+ ].join('')
928
+ ].join("\n")
929
+ end
930
+
931
+ def format_statements_assignment(node)
932
+ [
933
+ format(node.ref),
934
+ ' ',
935
+ ':=',
936
+ ' ',
937
+ format(node.expression),
938
+ ';'
939
+ ].join('')
940
+ end
941
+
942
+ def format_statements_call(node)
943
+ [
944
+ format(node.ref),
945
+ *if node.parameters and node.parameters.length > 0
946
+ [
947
+ '(',
948
+ node.parameters.map{|x| format(x)}.join(', '),
949
+ ')'
950
+ ].join('')
951
+ end,
952
+ ';'
953
+ ].join('')
954
+ end
955
+
956
+ def format_statements_case(node)
957
+ [
958
+ [
959
+ 'CASE',
960
+ ' ',
961
+ format(node.expression),
962
+ ' ',
963
+ 'OF'
964
+ ].join(''),
965
+ *if node.actions and node.actions.length > 0
966
+ node.actions.map{|x| format(x)}
967
+ end,
968
+ *if node.otherwise_statement
969
+ [
970
+ [
971
+ 'OTHERWISE',
972
+ ' ',
973
+ ':'
974
+ ].join(''),
975
+ indent(format(node.otherwise_statement))
976
+ ]
977
+ end,
978
+ [
979
+ 'END_CASE',
980
+ ';'
981
+ ].join('')
982
+ ].join("\n")
983
+ end
984
+
985
+ def format_statements_case_action(node)
986
+ [
987
+ [
988
+ node.labels.map{|x| format(x)}.join(', '),
989
+ ' ',
990
+ ':'
991
+ ].join(''),
992
+ indent(format(node.statement))
993
+ ].join("\n")
994
+ end
995
+
996
+ def format_statements_compound(node)
997
+ [
998
+ 'BEGIN',
999
+ *if node.statements and node.statements.length > 0
1000
+ indent(node.statements.map{|x| format(x)}.join("\n"))
1001
+ end,
1002
+ [
1003
+ 'END',
1004
+ ';'
1005
+ ].join('')
1006
+ ].join("\n")
1007
+ end
1008
+
1009
+ def format_statements_escape(node)
1010
+ [
1011
+ 'ESCAPE',
1012
+ ';'
1013
+ ].join('')
1014
+ end
1015
+
1016
+ def format_statements_if(node)
1017
+ [
1018
+ [
1019
+ 'IF',
1020
+ ' ',
1021
+ format(node.expression),
1022
+ ' ',
1023
+ 'THEN'
1024
+ ].join(''),
1025
+ *if node.statements and node.statements.length > 0
1026
+ indent(node.statements.map{|x| format(x)}.join("\n"))
1027
+ end,
1028
+ *if node.else_statements and node.else_statements.length > 0
1029
+ [
1030
+ 'ELSE',
1031
+ indent(node.else_statements.map{|x| format(x)}.join("\n")),
1032
+ ].join("\n")
1033
+ end,
1034
+ [
1035
+ 'END_IF',
1036
+ ';'
1037
+ ].join('')
1038
+ ].join("\n")
1039
+ end
1040
+
1041
+ def format_statements_null(node)
1042
+ ';'
1043
+ end
1044
+
1045
+ def format_statements_repeat(node)
1046
+ [
1047
+ [
1048
+ 'REPEAT',
1049
+ *if node.id
1050
+ [
1051
+ ' ',
1052
+ node.id,
1053
+ ' ',
1054
+ ':=',
1055
+ ' ',
1056
+ format(node.bound1),
1057
+ ' ',
1058
+ 'TO',
1059
+ ' ',
1060
+ format(node.bound2),
1061
+ *if node.increment
1062
+ [
1063
+ ' ',
1064
+ 'BY',
1065
+ ' ',
1066
+ format(node.increment)
1067
+ ].join('')
1068
+ end
1069
+ ].join('')
1070
+ end,
1071
+ *if node.while_expression
1072
+ [
1073
+ ' ',
1074
+ 'WHILE',
1075
+ ' ',
1076
+ format(node.while_expression)
1077
+ ].join('')
1078
+ end,
1079
+ *if node.until_expression
1080
+ [
1081
+ ' ',
1082
+ 'UNTIL',
1083
+ ' ',
1084
+ format(node.until_expression)
1085
+ ].join('')
1086
+ end,
1087
+ ';'
1088
+ ].join(''),
1089
+ *if node.statements and node.statements.length > 0
1090
+ indent(node.statements.map{|x| format(x)}.join("\n"))
1091
+ end,
1092
+ *format_remarks(node),
1093
+ [
1094
+ 'END_REPEAT',
1095
+ ';'
1096
+ ].join('')
1097
+ ].join("\n")
1098
+ end
1099
+
1100
+ def format_statements_return(node)
1101
+ [
1102
+ 'RETURN',
1103
+ *if node.expression
1104
+ [
1105
+ ' ',
1106
+ '(',
1107
+ format(node.expression),
1108
+ ')'
1109
+ ].join('')
1110
+ end,
1111
+ ';'
1112
+ ].join('')
1113
+ end
1114
+
1115
+ def format_statements_skip(node)
1116
+ [
1117
+ 'SKIP',
1118
+ ';'
1119
+ ].join('')
1120
+ end
1121
+
1122
+ def format_types_aggregate(node)
1123
+ 'AGGREGATE'
1124
+ end
1125
+
1126
+ def format_types_array(node)
1127
+ [
1128
+ 'ARRAY',
1129
+ *if node.bound1 and node.bound2
1130
+ [
1131
+ ' ',
1132
+ '[',
1133
+ format(node.bound1),
1134
+ ':',
1135
+ format(node.bound2),
1136
+ ']',
1137
+ ].join('')
1138
+ end,
1139
+ ' ',
1140
+ 'OF',
1141
+ *if node.optional
1142
+ [
1143
+ ' ',
1144
+ 'OPTIONAL'
1145
+ ].join('')
1146
+ end,
1147
+ *if node.unique
1148
+ [
1149
+ ' ',
1150
+ 'UNIQUE'
1151
+ ].join('')
1152
+ end,
1153
+ ' ',
1154
+ format(node.base_type)
1155
+ ].join('')
1156
+ end
1157
+
1158
+ def format_types_bag(node)
1159
+ [
1160
+ 'BAG',
1161
+ *if node.bound1 and node.bound2
1162
+ [
1163
+ ' ',
1164
+ '[',
1165
+ format(node.bound1),
1166
+ ':',
1167
+ format(node.bound2),
1168
+ ']',
1169
+ ].join('')
1170
+ end,
1171
+ ' ',
1172
+ 'OF',
1173
+ ' ',
1174
+ format(node.base_type)
1175
+ ].join('')
1176
+ end
1177
+
1178
+ def format_types_binary(node)
1179
+ [
1180
+ 'BINARY',
1181
+ *if node.width
1182
+ [
1183
+ ' ',
1184
+ '(',
1185
+ format(node.width),
1186
+ ')'
1187
+ ].join('')
1188
+ end,
1189
+ *if node.fixed
1190
+ [
1191
+ ' ',
1192
+ 'FIXED'
1193
+ ].join('')
1194
+ end
1195
+ ].join('')
1196
+ end
1197
+
1198
+ def format_types_boolean(node)
1199
+ 'BOOLEAN'
1200
+ end
1201
+
1202
+ def format_types_enumeration(node)
1203
+ [
1204
+ *if node.extensible
1205
+ [
1206
+ 'EXTENSIBLE',
1207
+ ' '
1208
+ ].join('')
1209
+ end,
1210
+ 'ENUMERATION',
1211
+ *if node.items and node.items.length > 0
1212
+ [
1213
+ ' ',
1214
+ 'OF',
1215
+ ' ',
1216
+ '(',
1217
+ node.items.map{|x| format(x)}.join(', '),
1218
+ ')'
1219
+ ].join('')
1220
+ end,
1221
+ *if node.extension_type
1222
+ [
1223
+ ' ',
1224
+ 'BASED_ON',
1225
+ ' ',
1226
+ format(node.extension_type)
1227
+ ].join('')
1228
+ end,
1229
+ *if node.extension_items
1230
+ [
1231
+ ' ',
1232
+ 'WITH',
1233
+ ' ',
1234
+ '(',
1235
+ node.extension_items.map{|x| format(x)}.join(', '),
1236
+ ')'
1237
+ ].join('')
1238
+ end
1239
+ ].join('')
1240
+ end
1241
+
1242
+ def format_types_generic_entity(node)
1243
+ 'GENERIC_ENTITY'
1244
+ end
1245
+
1246
+ def format_types_generic(node)
1247
+ 'GENERIC'
1248
+ end
1249
+
1250
+ def format_types_integer(node)
1251
+ 'INTEGER'
1252
+ end
1253
+
1254
+ def format_types_list(node)
1255
+ [
1256
+ 'LIST',
1257
+ *if node.bound1 and node.bound2
1258
+ [
1259
+ ' ',
1260
+ '[',
1261
+ format(node.bound1),
1262
+ ':',
1263
+ format(node.bound2),
1264
+ ']',
1265
+ ].join('')
1266
+ end,
1267
+ ' ',
1268
+ 'OF',
1269
+ *if node.unique
1270
+ [
1271
+ ' ',
1272
+ 'UNIQUE'
1273
+ ].join('')
1274
+ end,
1275
+ ' ',
1276
+ format(node.base_type)
1277
+ ].join('')
1278
+ end
1279
+
1280
+ def format_types_logical(node)
1281
+ 'LOGICAL'
1282
+ end
1283
+
1284
+ def format_types_number(node)
1285
+ 'NUMBER'
1286
+ end
1287
+
1288
+ def format_types_real(node)
1289
+ [
1290
+ 'REAL',
1291
+ *if node.precision
1292
+ [
1293
+ ' ',
1294
+ '(',
1295
+ format(node.precision),
1296
+ ')'
1297
+ ].join('')
1298
+ end
1299
+ ].join('')
1300
+ end
1301
+
1302
+ def format_types_select(node)
1303
+ [
1304
+ *if node.extensible
1305
+ [
1306
+ 'EXTENSIBLE',
1307
+ ' '
1308
+ ].join('')
1309
+ end,
1310
+ *if node.generic_entity
1311
+ [
1312
+ 'GENERIC_ENTITY',
1313
+ ' '
1314
+ ].join('')
1315
+ end,
1316
+ 'SELECT',
1317
+ *if node.items and node.items.length > 0
1318
+ [
1319
+ ' ',
1320
+ '(',
1321
+ node.items.map{|x| format(x)}.join(', '),
1322
+ ')'
1323
+ ].join('')
1324
+ end,
1325
+ *if node.extension_type
1326
+ [
1327
+ ' ',
1328
+ 'BASED_ON',
1329
+ ' ',
1330
+ format(node.extension_type)
1331
+ ].join('')
1332
+ end,
1333
+ *if node.extension_items
1334
+ [
1335
+ ' ',
1336
+ 'WITH',
1337
+ ' ',
1338
+ '(',
1339
+ node.extension_items.map{|x| format(x)}.join(', '),
1340
+ ')'
1341
+ ].join('')
1342
+ end
1343
+ ].join('')
1344
+ end
1345
+
1346
+ def format_types_set(node)
1347
+ [
1348
+ 'SET',
1349
+ *if node.bound1 and node.bound2
1350
+ [
1351
+ ' ',
1352
+ '[',
1353
+ format(node.bound1),
1354
+ ':',
1355
+ format(node.bound2),
1356
+ ']',
1357
+ ].join('')
1358
+ end,
1359
+ ' ',
1360
+ 'OF',
1361
+ ' ',
1362
+ format(node.base_type)
1363
+ ].join('')
1364
+ end
1365
+
1366
+ def format_types_string(node)
1367
+ [
1368
+ 'STRING',
1369
+ *if node.width
1370
+ [
1371
+ ' ',
1372
+ '(',
1373
+ format(node.width),
1374
+ ')'
1375
+ ].join('')
1376
+ end,
1377
+ *if node.fixed
1378
+ [
1379
+ ' ',
1380
+ 'FIXED'
1381
+ ].join('')
1382
+ end
1383
+ ].join('')
1384
+ end
1385
+
1386
+ def indent(str)
1387
+ str.split("\n").map{|x| "#{INDENT}#{x}"}.join("\n")
1388
+ end
1389
+
1390
+ def format_remark_ref(node)
1391
+ [
1392
+ *if node.class.method_defined? :parent and node.parent.class.method_defined? :id and node.parent != node
1393
+ [
1394
+ format_remark_ref(node.parent),
1395
+ '.'
1396
+ ].join('')
1397
+ end,
1398
+ node.id,
1399
+ ].join('')
1400
+ end
1401
+
1402
+ def format_remark(node, remark)
1403
+ if remark.include?("\n")
1404
+ [
1405
+ [
1406
+ '(*',
1407
+ '"',
1408
+ format_remark_ref(node),
1409
+ '"',
1410
+ ].join(''),
1411
+ remark,
1412
+ '*)'
1413
+ ].join("\n")
1414
+ else
1415
+ [
1416
+ '--',
1417
+ '"',
1418
+ format_remark_ref(node),
1419
+ '"',
1420
+ ' ',
1421
+ remark
1422
+ ].join('')
1423
+ end
1424
+ end
1425
+
1426
+ def format_remarks(node)
1427
+ if node.class.method_defined? :remarks and node.remarks and node.remarks.length > 0
1428
+ node.remarks.map do |remark|
1429
+ format_remark(node, remark)
1430
+ end
1431
+ else
1432
+ []
1433
+ end
1434
+ end
1435
+
1436
+ def format_scope_remarks(node)
1437
+ [
1438
+ *format_remarks(node),
1439
+ *if node.class.method_defined? :children
1440
+ node.children.flat_map do |x|
1441
+ if x != node
1442
+ format_scope_remarks(x)
1443
+ end
1444
+ end
1445
+ end
1446
+ ]
1447
+ end
1448
+ end
1449
+ end
1450
+ end