expressir 0.2.7-arm64-darwin
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.
- checksums.yaml +7 -0
- data/.cross_rubies +30 -0
- data/.github/workflows/rake.yml +45 -0
- data/.github/workflows/release.yml +84 -0
- data/.gitignore +17 -0
- data/.gitmodules +3 -0
- data/.rspec +2 -0
- data/.rubocop.yml +508 -0
- data/Gemfile +4 -0
- data/README.adoc +147 -0
- data/Rakefile +11 -0
- data/bin/console +12 -0
- data/bin/rspec +29 -0
- data/bin/setup +8 -0
- data/demo.rb +18 -0
- data/docs/development.md +90 -0
- data/exe/expressir +20 -0
- data/exe/generate-parser +48 -0
- data/expressir.gemspec +43 -0
- data/lib/expressir.rb +21 -0
- data/lib/expressir/cli.rb +27 -0
- data/lib/expressir/cli/ui.rb +36 -0
- data/lib/expressir/config.rb +23 -0
- data/lib/expressir/express.rb +11 -0
- data/lib/expressir/express/aggregate_dimension.rb +38 -0
- data/lib/expressir/express/attribute.rb +15 -0
- data/lib/expressir/express/comment.rb +7 -0
- data/lib/expressir/express/defined_type.rb +36 -0
- data/lib/expressir/express/derived.rb +65 -0
- data/lib/expressir/express/derived_aggregate.rb +43 -0
- data/lib/expressir/express/entity.rb +137 -0
- data/lib/expressir/express/explicit.rb +70 -0
- data/lib/expressir/express/explicit_aggregate.rb +46 -0
- data/lib/expressir/express/explicit_or_derived.rb +16 -0
- data/lib/expressir/express/global_rule.rb +44 -0
- data/lib/expressir/express/interface_specification.rb +51 -0
- data/lib/expressir/express/interfaced_item.rb +38 -0
- data/lib/expressir/express/inverse.rb +46 -0
- data/lib/expressir/express/inverse_aggregate.rb +37 -0
- data/lib/expressir/express/model_element.rb +7 -0
- data/lib/expressir/express/named_type.rb +19 -0
- data/lib/expressir/express/remark.rb +8 -0
- data/lib/expressir/express/repository.rb +306 -0
- data/lib/expressir/express/schema_definition.rb +96 -0
- data/lib/expressir/express/subtype_constraint.rb +14 -0
- data/lib/expressir/express/type.rb +26 -0
- data/lib/expressir/express/type_aggregate.rb +42 -0
- data/lib/expressir/express/type_enum.rb +29 -0
- data/lib/expressir/express/type_parser.rb +45 -0
- data/lib/expressir/express/type_select.rb +82 -0
- data/lib/expressir/express/unique_rule.rb +35 -0
- data/lib/expressir/express/where_rule.rb +32 -0
- data/lib/expressir/express_exp/2.4/express_parser.bundle +0 -0
- data/lib/expressir/express_exp/2.5/express_parser.bundle +0 -0
- data/lib/expressir/express_exp/2.6/express_parser.bundle +0 -0
- data/lib/expressir/express_exp/2.7/express_parser.bundle +0 -0
- data/lib/expressir/express_exp/3.0/express_parser.bundle +0 -0
- data/lib/expressir/express_exp/formatter.rb +1450 -0
- data/lib/expressir/express_exp/parser.rb +41 -0
- data/lib/expressir/express_exp/visitor.rb +2464 -0
- data/lib/expressir/express_parser.rb +30 -0
- data/lib/expressir/model.rb +65 -0
- data/lib/expressir/model/attribute.rb +27 -0
- data/lib/expressir/model/constant.rb +17 -0
- data/lib/expressir/model/entity.rb +46 -0
- data/lib/expressir/model/enumeration_item.rb +11 -0
- data/lib/expressir/model/expressions/aggregate_initializer.rb +13 -0
- data/lib/expressir/model/expressions/aggregate_item.rb +15 -0
- data/lib/expressir/model/expressions/attribute_reference.rb +15 -0
- data/lib/expressir/model/expressions/binary_expression.rb +40 -0
- data/lib/expressir/model/expressions/call.rb +15 -0
- data/lib/expressir/model/expressions/entity_constructor.rb +15 -0
- data/lib/expressir/model/expressions/group_reference.rb +15 -0
- data/lib/expressir/model/expressions/index_reference.rb +17 -0
- data/lib/expressir/model/expressions/interval.rb +21 -0
- data/lib/expressir/model/expressions/query_expression.rb +26 -0
- data/lib/expressir/model/expressions/simple_reference.rb +13 -0
- data/lib/expressir/model/expressions/unary_expression.rb +19 -0
- data/lib/expressir/model/function.rb +62 -0
- data/lib/expressir/model/identifier.rb +10 -0
- data/lib/expressir/model/interface.rb +18 -0
- data/lib/expressir/model/literals/binary.rb +13 -0
- data/lib/expressir/model/literals/integer.rb +13 -0
- data/lib/expressir/model/literals/logical.rb +17 -0
- data/lib/expressir/model/literals/real.rb +13 -0
- data/lib/expressir/model/literals/string.rb +15 -0
- data/lib/expressir/model/parameter.rb +17 -0
- data/lib/expressir/model/procedure.rb +60 -0
- data/lib/expressir/model/renamed_ref.rb +13 -0
- data/lib/expressir/model/repository.rb +19 -0
- data/lib/expressir/model/rule.rb +62 -0
- data/lib/expressir/model/schema.rb +67 -0
- data/lib/expressir/model/scope.rb +17 -0
- data/lib/expressir/model/statements/alias.rb +26 -0
- data/lib/expressir/model/statements/assignment.rb +15 -0
- data/lib/expressir/model/statements/call.rb +15 -0
- data/lib/expressir/model/statements/case.rb +17 -0
- data/lib/expressir/model/statements/case_action.rb +15 -0
- data/lib/expressir/model/statements/compound.rb +13 -0
- data/lib/expressir/model/statements/escape.rb +8 -0
- data/lib/expressir/model/statements/if.rb +17 -0
- data/lib/expressir/model/statements/null.rb +8 -0
- data/lib/expressir/model/statements/repeat.rb +34 -0
- data/lib/expressir/model/statements/return.rb +13 -0
- data/lib/expressir/model/statements/skip.rb +8 -0
- data/lib/expressir/model/subtype_constraint.rb +27 -0
- data/lib/expressir/model/type.rb +24 -0
- data/lib/expressir/model/types/aggregate.rb +17 -0
- data/lib/expressir/model/types/array.rb +21 -0
- data/lib/expressir/model/types/bag.rb +17 -0
- data/lib/expressir/model/types/binary.rb +15 -0
- data/lib/expressir/model/types/boolean.rb +8 -0
- data/lib/expressir/model/types/enumeration.rb +19 -0
- data/lib/expressir/model/types/generic.rb +13 -0
- data/lib/expressir/model/types/generic_entity.rb +13 -0
- data/lib/expressir/model/types/integer.rb +8 -0
- data/lib/expressir/model/types/list.rb +19 -0
- data/lib/expressir/model/types/logical.rb +8 -0
- data/lib/expressir/model/types/number.rb +8 -0
- data/lib/expressir/model/types/real.rb +13 -0
- data/lib/expressir/model/types/select.rb +21 -0
- data/lib/expressir/model/types/set.rb +17 -0
- data/lib/expressir/model/types/string.rb +15 -0
- data/lib/expressir/model/unique.rb +15 -0
- data/lib/expressir/model/variable.rb +17 -0
- data/lib/expressir/model/where.rb +15 -0
- data/lib/expressir/parser.rb +6 -0
- data/lib/expressir/parser/owl_parser.rb +8 -0
- data/lib/expressir/version.rb +3 -0
- data/original/examples/ap233/ap233e1_arm_lf_stepmod-2010-11-12.exp +9589 -0
- data/original/examples/ap233/ap233e1_arm_lf_stepmod-2010-11-12.owl +36619 -0
- data/original/examples/ap233/ap233e1_arm_lf_stepmod-2010-11-12.xml +13294 -0
- data/original/examples/employment/eclipse/.project +17 -0
- data/original/examples/employment/eclipse/Export/Employment.png +0 -0
- data/original/examples/employment/eclipse/Express/employment_schema.exp +33 -0
- data/original/examples/employment/eclipse/Express/employment_schema.xmi +77 -0
- data/original/examples/employment/eclipse/Express/employment_schema.xml +93 -0
- data/original/examples/employment/eclipse/Models/Employment.uml +4 -0
- data/original/examples/employment/eclipse/Models/Employment.umldi +240 -0
- data/original/examples/employment/eclipse/readme.txt +7 -0
- data/original/examples/employment/employment_schema.exp +33 -0
- data/original/examples/employment/employment_schema.rb +232 -0
- data/original/examples/employment/employment_schema.xml +93 -0
- data/original/examples/employment/employment_schema___module.rb +46 -0
- data/original/examples/employment/employment_schema___p28attr.rb +126 -0
- data/original/examples/employment/employment_schema___p28inst.rb +26 -0
- data/original/examples/employment/example_employment_data.xml +1 -0
- data/original/examples/employment/example_employment_data_copy.xml +1 -0
- data/original/examples/employment/example_employment_reader.rb +30 -0
- data/original/examples/employment/example_employment_writer.rb +51 -0
- data/original/examples/plcs/ap239e1_arm_lf_dexlib_2010-01-06.exp +3710 -0
- data/original/examples/plcs/ap239e1_arm_lf_dexlib_2010-01-06.owl +35880 -0
- data/original/examples/plcs/ap239e1_arm_lf_dexlib_2010-01-06.xmi +15357 -0
- data/original/examples/plcs/ap239e1_arm_lf_dexlib_2010-01-06.xml +9468 -0
- data/original/examples/plcs/ap239e2_arm_lf_stepmod-2010-01-25.exp +8404 -0
- data/original/examples/plcs/ap239e2_arm_lf_stepmod-2010-01-25.owl +43147 -0
- data/original/examples/plcs/ap239e2_arm_lf_stepmod-2010-01-25.xmi +18341 -0
- data/original/examples/plcs/ap239e2_arm_lf_stepmod-2010-01-25.xml +11632 -0
- data/original/examples/syntax/remark.exp +146 -0
- data/original/examples/syntax/remark_formatted.exp +175 -0
- data/original/examples/syntax/syntax.exp +311 -0
- data/original/examples/syntax/syntax_formatted.exp +1191 -0
- data/original/exp2ruby.rb +525 -0
- data/original/expsm.rb +34 -0
- data/original/mapping_owl.rb +1018 -0
- data/original/mapping_sysml.rb +2281 -0
- data/original/mapping_uml2.rb +599 -0
- data/original/mapping_uml2_eclipse.rb +433 -0
- data/original/reeper.rb +134 -0
- data/rakelib/cross-ruby.rake +308 -0
- data/spec/acceptance/express_to_owl_spec.rb +18 -0
- data/spec/acceptance/version_spec.rb +12 -0
- data/spec/expressir/express/repository_spec.rb +25 -0
- data/spec/expressir/express_exp/ap233_spec.rb +22 -0
- data/spec/expressir/express_exp/format_remark_spec.rb +28 -0
- data/spec/expressir/express_exp/format_syntax_spec.rb +28 -0
- data/spec/expressir/express_exp/parse_remark_spec.rb +346 -0
- data/spec/expressir/express_exp/parse_syntax_spec.rb +3003 -0
- data/spec/expressir/model/find_spec.rb +110 -0
- data/spec/expressr_spec.rb +5 -0
- data/spec/spec_helper.rb +17 -0
- data/spec/support/console_helper.rb +29 -0
- 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
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
@@ -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
|