expressir 0.2.5 → 0.2.10
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.cross_rubies +30 -0
- data/.github/workflows/rake.yml +14 -15
- data/.github/workflows/release.yml +24 -16
- data/.gitignore +3 -1
- data/Gemfile +0 -2
- data/Rakefile +2 -8
- data/expressir.gemspec +7 -4
- data/ext/express-parser/express_parser.cpp +12 -10
- data/ext/express-parser/extconf.rb +48 -25
- data/lib/expressir/express_exp/formatter.rb +74 -23
- data/lib/expressir/express_exp/parser.rb +20 -2
- data/lib/expressir/express_exp/visitor.rb +201 -96
- data/lib/expressir/model.rb +3 -0
- data/lib/expressir/model/attribute.rb +3 -1
- data/lib/expressir/model/constant.rb +3 -1
- data/lib/expressir/model/entity.rb +12 -19
- data/lib/expressir/model/enumeration_item.rb +3 -1
- data/lib/expressir/model/expressions/aggregate_initializer.rb +2 -2
- data/lib/expressir/model/expressions/aggregate_item.rb +1 -1
- data/lib/expressir/model/expressions/attribute_reference.rb +1 -1
- data/lib/expressir/model/expressions/binary_expression.rb +1 -1
- data/lib/expressir/model/expressions/call.rb +2 -2
- data/lib/expressir/model/expressions/entity_constructor.rb +2 -2
- data/lib/expressir/model/expressions/group_reference.rb +1 -1
- data/lib/expressir/model/expressions/index_reference.rb +1 -1
- data/lib/expressir/model/expressions/interval.rb +1 -1
- data/lib/expressir/model/expressions/query_expression.rb +5 -3
- data/lib/expressir/model/expressions/simple_reference.rb +1 -1
- data/lib/expressir/model/expressions/unary_expression.rb +1 -1
- data/lib/expressir/model/function.rb +32 -38
- data/lib/expressir/model/identifier.rb +1 -0
- data/lib/expressir/model/informal_proposition.rb +13 -0
- data/lib/expressir/model/interface.rb +2 -2
- data/lib/expressir/model/literals/binary.rb +1 -1
- data/lib/expressir/model/literals/integer.rb +1 -1
- data/lib/expressir/model/literals/logical.rb +1 -1
- data/lib/expressir/model/literals/real.rb +1 -1
- data/lib/expressir/model/literals/string.rb +1 -1
- data/lib/expressir/model/model_element.rb +67 -0
- data/lib/expressir/model/parameter.rb +3 -1
- data/lib/expressir/model/procedure.rb +33 -39
- data/lib/expressir/model/renamed_ref.rb +1 -1
- data/lib/expressir/model/repository.rb +3 -3
- data/lib/expressir/model/rule.rb +35 -38
- data/lib/expressir/model/schema.rb +35 -46
- data/lib/expressir/model/scope.rb +49 -3
- data/lib/expressir/model/statements/alias.rb +4 -2
- data/lib/expressir/model/statements/assignment.rb +1 -1
- data/lib/expressir/model/statements/call.rb +2 -2
- data/lib/expressir/model/statements/case.rb +2 -2
- data/lib/expressir/model/statements/case_action.rb +2 -2
- data/lib/expressir/model/statements/compound.rb +2 -2
- data/lib/expressir/model/statements/escape.rb +1 -1
- data/lib/expressir/model/statements/if.rb +3 -3
- data/lib/expressir/model/statements/null.rb +1 -1
- data/lib/expressir/model/statements/repeat.rb +4 -2
- data/lib/expressir/model/statements/return.rb +1 -1
- data/lib/expressir/model/statements/skip.rb +1 -1
- data/lib/expressir/model/subtype_constraint.rb +3 -1
- data/lib/expressir/model/type.rb +13 -3
- data/lib/expressir/model/types/aggregate.rb +3 -1
- data/lib/expressir/model/types/array.rb +1 -1
- data/lib/expressir/model/types/bag.rb +1 -1
- data/lib/expressir/model/types/binary.rb +1 -1
- data/lib/expressir/model/types/boolean.rb +1 -1
- data/lib/expressir/model/types/enumeration.rb +3 -3
- data/lib/expressir/model/types/generic.rb +3 -1
- data/lib/expressir/model/types/generic_entity.rb +3 -1
- data/lib/expressir/model/types/integer.rb +1 -1
- data/lib/expressir/model/types/list.rb +1 -1
- data/lib/expressir/model/types/logical.rb +1 -1
- data/lib/expressir/model/types/number.rb +1 -1
- data/lib/expressir/model/types/real.rb +1 -1
- data/lib/expressir/model/types/select.rb +3 -3
- data/lib/expressir/model/types/set.rb +1 -1
- data/lib/expressir/model/types/string.rb +1 -1
- data/lib/expressir/model/unique.rb +4 -2
- data/lib/expressir/model/variable.rb +3 -1
- data/lib/expressir/model/where.rb +3 -1
- data/lib/expressir/version.rb +1 -1
- data/original/examples/syntax/remark.exp +64 -20
- data/original/examples/syntax/remark_formatted.exp +63 -24
- data/original/examples/syntax/simple.exp +3 -0
- data/original/examples/syntax/source.exp +16 -0
- data/original/examples/syntax/syntax.exp +194 -181
- data/original/examples/syntax/syntax_formatted.exp +354 -787
- data/rakelib/cross-ruby.rake +308 -0
- data/spec/expressir/express_exp/head_source_spec.rb +38 -0
- data/spec/expressir/express_exp/parse_multiple_spec.rb +32 -0
- data/spec/expressir/express_exp/parse_remark_spec.rb +122 -56
- data/spec/expressir/express_exp/parse_syntax_spec.rb +1619 -1569
- data/spec/expressir/express_exp/source_spec.rb +29 -0
- data/spec/expressir/model/model_element_spec.rb +59 -0
- data/spec/expressir/model/{find_spec.rb → scope_spec.rb} +20 -7
- metadata +45 -21
@@ -1,10 +1,15 @@
|
|
1
|
-
|
1
|
+
begin
|
2
|
+
RUBY_VERSION =~ /(\d+\.\d+)/
|
3
|
+
require_relative "#{$1}/express_parser"
|
4
|
+
rescue LoadError
|
5
|
+
require_relative "express_parser"
|
6
|
+
end
|
2
7
|
require 'expressir/express_exp/visitor'
|
3
8
|
|
4
9
|
module Expressir
|
5
10
|
module ExpressExp
|
6
11
|
class Parser
|
7
|
-
def self.
|
12
|
+
def self.from_file(file)
|
8
13
|
input = File.read(file)
|
9
14
|
|
10
15
|
=begin
|
@@ -31,6 +36,19 @@ module Expressir
|
|
31
36
|
|
32
37
|
repo
|
33
38
|
end
|
39
|
+
|
40
|
+
def self.from_files(files)
|
41
|
+
schemas = files.map{|file| self.from_file(file).schemas}.flatten
|
42
|
+
|
43
|
+
Model::Repository.new({
|
44
|
+
schemas: schemas
|
45
|
+
})
|
46
|
+
end
|
47
|
+
|
48
|
+
# deprecated
|
49
|
+
def self.from_exp(file)
|
50
|
+
self.from_file(file)
|
51
|
+
end
|
34
52
|
end
|
35
53
|
end
|
36
54
|
end
|
@@ -1,9 +1,12 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
begin
|
2
|
+
RUBY_VERSION =~ /(\d+\.\d+)/
|
3
|
+
require_relative "#{$1}/express_parser"
|
4
|
+
rescue LoadError
|
5
|
+
require_relative "express_parser"
|
6
|
+
end
|
7
|
+
require "expressir/model"
|
8
|
+
require "set"
|
3
9
|
|
4
|
-
# static shorthands are unwrapped
|
5
|
-
# - entity attributes, function/procedure parameters, local variables
|
6
|
-
#
|
7
10
|
# reference type is not recognized
|
8
11
|
# see note in A.1.5 Interpreted identifiers
|
9
12
|
# > It is expected that identifiers matching these syntax rules are known to an implementation.
|
@@ -20,6 +23,13 @@ require 'expressir/model'
|
|
20
23
|
# > A syntactic construct such as ARRAY[1:3] OF REAL satisfies two syntactic productions —
|
21
24
|
# > aggregation_type and general_aggregation_type. It is considered to be instantiable no matter which
|
22
25
|
# > production it is required to satisfy in the syntax.
|
26
|
+
#
|
27
|
+
# static shorthands are unwrapped
|
28
|
+
# - entity attributes, function/procedure parameters, local variables
|
29
|
+
#
|
30
|
+
# all access to ctx members must happen before calling other visitor code
|
31
|
+
# - prevents segfault in ANTLR4 C++ runtime, not sure why they are caused
|
32
|
+
# - e.g. see visit_schema_decl
|
23
33
|
|
24
34
|
module Expressir
|
25
35
|
module ExpressExp
|
@@ -28,91 +38,148 @@ module Expressir
|
|
28
38
|
|
29
39
|
def initialize(tokens)
|
30
40
|
@tokens = tokens
|
31
|
-
@
|
41
|
+
@attached_remark_tokens = ::Set.new
|
32
42
|
|
33
43
|
super()
|
34
44
|
end
|
35
45
|
|
36
46
|
def visit(ctx)
|
37
47
|
result = super(ctx)
|
48
|
+
attach_source(ctx, result)
|
38
49
|
attach_parent(ctx, result)
|
39
50
|
attach_remarks(ctx, result)
|
40
51
|
result
|
41
52
|
end
|
42
53
|
|
43
|
-
def visit_if(ctx)
|
44
|
-
|
54
|
+
def visit_if(ctx, default = nil)
|
55
|
+
if ctx
|
56
|
+
visit(ctx)
|
57
|
+
else
|
58
|
+
default
|
59
|
+
end
|
45
60
|
end
|
46
61
|
|
47
62
|
def visit_if_map(ctx)
|
48
|
-
|
63
|
+
if ctx
|
64
|
+
ctx.map{|ctx2| visit(ctx2)}
|
65
|
+
else
|
66
|
+
[]
|
67
|
+
end
|
49
68
|
end
|
50
69
|
|
51
70
|
def visit_if_map_flatten(ctx)
|
52
|
-
|
71
|
+
if ctx
|
72
|
+
ctx.map{|ctx2| visit(ctx2)}.flatten
|
73
|
+
else
|
74
|
+
[]
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
def get_tokens_source(tokens)
|
79
|
+
if tokens.last.text == '<EOF>'
|
80
|
+
tokens.pop
|
81
|
+
end
|
82
|
+
|
83
|
+
tokens.map{|x| x.text}.join('').force_encoding('UTF-8')
|
84
|
+
end
|
85
|
+
|
86
|
+
def get_tokens(ctx)
|
87
|
+
start_index, stop_index = if ctx.instance_of? ::ExpressParser::SyntaxContext
|
88
|
+
[0, @tokens.size - 1]
|
89
|
+
else
|
90
|
+
[ctx.start.token_index, ctx.stop.token_index]
|
91
|
+
end
|
92
|
+
|
93
|
+
@tokens[start_index..stop_index]
|
94
|
+
end
|
95
|
+
|
96
|
+
def get_head_tokens(ctx)
|
97
|
+
start_index, stop_index = if ctx.instance_of? ::ExpressParser::SchemaDeclContext
|
98
|
+
start_index = ctx.start.token_index
|
99
|
+
stop_index = if ctx.schema_body.interface_specification.length > 0
|
100
|
+
ctx.schema_body.interface_specification.last.stop.token_index
|
101
|
+
elsif ctx.schema_version_id
|
102
|
+
ctx.schema_version_id.stop.token_index + 1
|
103
|
+
else
|
104
|
+
ctx.schema_id.stop.token_index + 1
|
105
|
+
end
|
106
|
+
|
107
|
+
[start_index, stop_index]
|
108
|
+
end
|
109
|
+
|
110
|
+
if start_index and stop_index
|
111
|
+
@tokens[start_index..stop_index]
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
115
|
+
def attach_source(ctx, node)
|
116
|
+
if node.class.method_defined? :source
|
117
|
+
tokens = get_tokens(ctx)
|
118
|
+
node.source = get_tokens_source(tokens)
|
119
|
+
end
|
120
|
+
|
121
|
+
if node.class.method_defined? :head_source
|
122
|
+
tokens = get_head_tokens(ctx)
|
123
|
+
node.head_source = get_tokens_source(tokens)
|
124
|
+
end
|
53
125
|
end
|
54
126
|
|
55
127
|
def attach_parent(ctx, node)
|
56
128
|
if node.class.method_defined? :children
|
57
129
|
node.children.each do |child_node|
|
58
|
-
if child_node.class.method_defined? :parent
|
130
|
+
if child_node.class.method_defined? :parent and !child_node.parent
|
59
131
|
child_node.parent = node
|
60
132
|
end
|
61
133
|
end
|
62
134
|
end
|
63
135
|
end
|
64
136
|
|
65
|
-
def
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
137
|
+
def find_remark_target(node, path)
|
138
|
+
current_node = node
|
139
|
+
target_node = nil
|
140
|
+
|
141
|
+
if current_node.class.method_defined? :find_or_create
|
142
|
+
target_node = current_node.find_or_create(path)
|
143
|
+
end
|
144
|
+
while !target_node and current_node.class.method_defined? :parent and current_node.parent.class.method_defined? :find_or_create
|
145
|
+
current_node = current_node.parent
|
146
|
+
target_node = current_node.find_or_create(path)
|
71
147
|
end
|
72
|
-
# puts [start_index, stop_index, ctx.class].inspect
|
73
|
-
|
74
|
-
remark_tokens = @tokens[start_index..stop_index].select{|x| x.channel == REMARK_CHANNEL}
|
75
|
-
if remark_tokens
|
76
|
-
remark_tokens.each do |remark_token|
|
77
|
-
remark_text = remark_token.text
|
78
|
-
|
79
|
-
# check if it is tagged remark
|
80
|
-
match = if remark_text.start_with?('--')
|
81
|
-
remark_text[2..-1].match(/^"([^"]*)"(.*)$/)
|
82
|
-
elsif remark_text.start_with?('(*') and remark_text.end_with?('*)')
|
83
|
-
remark_text[2..-3].match(/^"([^"]*)"(.*)$/m)
|
84
|
-
end
|
85
|
-
if !match
|
86
|
-
next
|
87
|
-
end
|
88
148
|
|
89
|
-
|
90
|
-
|
91
|
-
next
|
92
|
-
end
|
149
|
+
target_node
|
150
|
+
end
|
93
151
|
|
94
|
-
|
95
|
-
|
96
|
-
remark_content = match[2].strip
|
152
|
+
def attach_remarks(ctx, node)
|
153
|
+
remark_tokens = get_tokens(ctx).select{|x| x.channel == REMARK_CHANNEL}
|
97
154
|
|
98
|
-
|
99
|
-
|
100
|
-
if current_node.class.method_defined? :find
|
101
|
-
target_node = current_node.find(remark_tag)
|
102
|
-
end
|
103
|
-
while !target_node and current_node.class.method_defined? :parent and current_node.parent.class.method_defined? :find
|
104
|
-
current_node = current_node.parent
|
105
|
-
target_node = current_node.find(remark_tag)
|
106
|
-
end
|
155
|
+
# skip already attached remarks
|
156
|
+
remark_tokens = remark_tokens.select{|x| !@attached_remark_tokens.include?(x)}
|
107
157
|
|
108
|
-
|
109
|
-
|
110
|
-
|
158
|
+
# parse remarks, find remark targets
|
159
|
+
tagged_remark_tokens = remark_tokens.map do |remark_token|
|
160
|
+
_, remark_tag, remark_text = if remark_token.text.start_with?('--')
|
161
|
+
remark_token.text.match(/^--"([^"]*)"(.*)$/).to_a
|
162
|
+
else
|
163
|
+
remark_token.text.match(/^\(\*"([^"]*)"(.*)\*\)$/m).to_a
|
164
|
+
end
|
111
165
|
|
112
|
-
|
113
|
-
|
114
|
-
|
166
|
+
if remark_tag
|
167
|
+
remark_target = find_remark_target(node, remark_tag)
|
168
|
+
end
|
169
|
+
if remark_text
|
170
|
+
remark_text = remark_text.strip.force_encoding('UTF-8')
|
115
171
|
end
|
172
|
+
|
173
|
+
[remark_token, remark_target, remark_text]
|
174
|
+
end.select{|x| x[1]}
|
175
|
+
|
176
|
+
tagged_remark_tokens.each do |remark_token, remark_target, remark_text|
|
177
|
+
# attach remark
|
178
|
+
remark_target.remarks ||= []
|
179
|
+
remark_target.remarks << remark_text
|
180
|
+
|
181
|
+
# mark remark as attached, so that it is not attached again at higher nesting level
|
182
|
+
@attached_remark_tokens << remark_token
|
116
183
|
end
|
117
184
|
end
|
118
185
|
|
@@ -365,8 +432,8 @@ module Expressir
|
|
365
432
|
|
366
433
|
bound1 = visit_if(ctx__bound_spec__bound1)
|
367
434
|
bound2 = visit_if(ctx__bound_spec__bound2)
|
368
|
-
optional =
|
369
|
-
unique =
|
435
|
+
optional = ctx__OPTIONAL && true
|
436
|
+
unique = ctx__UNIQUE && true
|
370
437
|
base_type = visit_if(ctx__instantiable_type)
|
371
438
|
|
372
439
|
Model::Types::Array.new({
|
@@ -450,7 +517,7 @@ module Expressir
|
|
450
517
|
ctx__width_spec__FIXED = ctx__width_spec&.FIXED
|
451
518
|
|
452
519
|
width = visit_if(ctx__width_spec__width)
|
453
|
-
fixed =
|
520
|
+
fixed = ctx__width_spec__FIXED && true
|
454
521
|
|
455
522
|
Model::Types::Binary.new({
|
456
523
|
width: width,
|
@@ -702,7 +769,7 @@ module Expressir
|
|
702
769
|
ctx__entity_body__where_clause = ctx__entity_body&.where_clause
|
703
770
|
|
704
771
|
id = visit_if(ctx__entity_head__entity_id)
|
705
|
-
abstract =
|
772
|
+
abstract = (ctx__entity_head__subsuper__supertype_constraint__abstract_entity_declaration || ctx__entity_head__subsuper__supertype_constraint__abstract_supertype_declaration) && true
|
706
773
|
supertype_expression = visit_if(ctx__entity_head__subsuper__supertype_constraint__abstract_supertype_declaration || ctx__entity_head__subsuper__supertype_constraint__supertype_rule)
|
707
774
|
subtype_of = visit_if(ctx__entity_head__subsuper__subtype_declaration)
|
708
775
|
attributes = [
|
@@ -710,8 +777,8 @@ module Expressir
|
|
710
777
|
*visit_if(ctx__entity_body__derive_clause),
|
711
778
|
*visit_if(ctx__entity_body__inverse_clause)
|
712
779
|
]
|
713
|
-
unique = visit_if(ctx__entity_body__unique_clause)
|
714
|
-
where = visit_if(ctx__entity_body__where_clause)
|
780
|
+
unique = visit_if(ctx__entity_body__unique_clause, [])
|
781
|
+
where = visit_if(ctx__entity_body__where_clause, [])
|
715
782
|
|
716
783
|
Model::Entity.new({
|
717
784
|
id: id,
|
@@ -784,10 +851,10 @@ module Expressir
|
|
784
851
|
ctx__enumeration_extension__type_ref = ctx__enumeration_extension&.type_ref
|
785
852
|
ctx__enumeration_extension__enumeration_items = ctx__enumeration_extension&.enumeration_items
|
786
853
|
|
787
|
-
extensible =
|
788
|
-
items = visit_if(ctx__enumeration_items)
|
854
|
+
extensible = ctx__EXTENSIBLE && true
|
855
|
+
items = visit_if(ctx__enumeration_items, [])
|
789
856
|
extension_type = visit_if(ctx__enumeration_extension__type_ref)
|
790
|
-
extension_items = visit_if(ctx__enumeration_extension__enumeration_items)
|
857
|
+
extension_items = visit_if(ctx__enumeration_extension__enumeration_items, [])
|
791
858
|
|
792
859
|
Model::Types::Enumeration.new({
|
793
860
|
extensible: extensible,
|
@@ -807,7 +874,7 @@ module Expressir
|
|
807
874
|
ctx__parameter_type = ctx.parameter_type
|
808
875
|
|
809
876
|
attributes = visit_if_map(ctx__attribute_decl)
|
810
|
-
optional =
|
877
|
+
optional = ctx__OPTIONAL && true
|
811
878
|
type = visit_if(ctx__parameter_type)
|
812
879
|
|
813
880
|
attributes.map do |attribute|
|
@@ -881,7 +948,7 @@ module Expressir
|
|
881
948
|
ctx__actual_parameter_list = ctx.actual_parameter_list
|
882
949
|
|
883
950
|
ref = visit_if(ctx__built_in_function || ctx__function_ref)
|
884
|
-
parameters = visit_if(ctx__actual_parameter_list)
|
951
|
+
parameters = visit_if(ctx__actual_parameter_list, [])
|
885
952
|
|
886
953
|
Model::Expressions::Call.new({
|
887
954
|
ref: ref,
|
@@ -904,15 +971,24 @@ module Expressir
|
|
904
971
|
parameters = visit_if_map_flatten(ctx__function_head__formal_parameter)
|
905
972
|
return_type = visit_if(ctx__function_head__parameter_type)
|
906
973
|
declarations = visit_if_map(ctx__algorithm_head__declaration)
|
907
|
-
|
908
|
-
|
974
|
+
types = declarations.select{|x| x.instance_of? Model::Type}
|
975
|
+
entities = declarations.select{|x| x.instance_of? Model::Entity}
|
976
|
+
subtype_constraints = declarations.select{|x| x.instance_of? Model::SubtypeConstraint}
|
977
|
+
functions = declarations.select{|x| x.instance_of? Model::Function}
|
978
|
+
procedures = declarations.select{|x| x.instance_of? Model::Procedure}
|
979
|
+
constants = visit_if(ctx__algorithm_head__constant_decl, [])
|
980
|
+
variables = visit_if(ctx__algorithm_head__local_decl, [])
|
909
981
|
statements = visit_if_map(ctx__stmt)
|
910
982
|
|
911
983
|
Model::Function.new({
|
912
984
|
id: id,
|
913
985
|
parameters: parameters,
|
914
986
|
return_type: return_type,
|
915
|
-
|
987
|
+
types: types,
|
988
|
+
entities: entities,
|
989
|
+
subtype_constraints: subtype_constraints,
|
990
|
+
functions: functions,
|
991
|
+
procedures: procedures,
|
916
992
|
constants: constants,
|
917
993
|
variables: variables,
|
918
994
|
statements: statements
|
@@ -957,8 +1033,8 @@ module Expressir
|
|
957
1033
|
|
958
1034
|
bound1 = visit_if(ctx__bound_spec__bound1)
|
959
1035
|
bound2 = visit_if(ctx__bound_spec__bound2)
|
960
|
-
optional =
|
961
|
-
unique =
|
1036
|
+
optional = ctx__OPTIONAL && true
|
1037
|
+
unique = ctx__UNIQUE && true
|
962
1038
|
base_type = visit_if(ctx__parameter_type)
|
963
1039
|
|
964
1040
|
Model::Types::Array.new({
|
@@ -996,7 +1072,7 @@ module Expressir
|
|
996
1072
|
|
997
1073
|
bound1 = visit_if(ctx__bound_spec__bound1)
|
998
1074
|
bound2 = visit_if(ctx__bound_spec__bound2)
|
999
|
-
unique =
|
1075
|
+
unique = ctx__UNIQUE && true
|
1000
1076
|
base_type = visit_if(ctx__parameter_type)
|
1001
1077
|
|
1002
1078
|
Model::Types::List.new({
|
@@ -1071,8 +1147,8 @@ module Expressir
|
|
1071
1147
|
ctx__if_stmt_else_statements = ctx.if_stmt_else_statements
|
1072
1148
|
|
1073
1149
|
expression = visit_if(ctx__logical_expression)
|
1074
|
-
statements = visit_if(ctx__if_stmt_statements)
|
1075
|
-
else_statements = visit_if(ctx__if_stmt_else_statements)
|
1150
|
+
statements = visit_if(ctx__if_stmt_statements, [])
|
1151
|
+
else_statements = visit_if(ctx__if_stmt_else_statements, [])
|
1076
1152
|
|
1077
1153
|
Model::Statements::If.new({
|
1078
1154
|
expression: expression,
|
@@ -1286,7 +1362,7 @@ module Expressir
|
|
1286
1362
|
|
1287
1363
|
bound1 = visit_if(ctx__bound_spec__bound1)
|
1288
1364
|
bound2 = visit_if(ctx__bound_spec__bound2)
|
1289
|
-
unique =
|
1365
|
+
unique = ctx__UNIQUE && true
|
1290
1366
|
base_type = visit_if(ctx__instantiable_type)
|
1291
1367
|
|
1292
1368
|
Model::Types::List.new({
|
@@ -1502,7 +1578,7 @@ module Expressir
|
|
1502
1578
|
ctx__actual_parameter_list = ctx.actual_parameter_list
|
1503
1579
|
|
1504
1580
|
ref = visit_if(ctx__built_in_procedure || ctx__procedure_ref)
|
1505
|
-
parameters = visit_if(ctx__actual_parameter_list)
|
1581
|
+
parameters = visit_if(ctx__actual_parameter_list, [])
|
1506
1582
|
|
1507
1583
|
Model::Statements::Call.new({
|
1508
1584
|
ref: ref,
|
@@ -1523,14 +1599,23 @@ module Expressir
|
|
1523
1599
|
id = visit_if(ctx__procedure_head__procedure_id)
|
1524
1600
|
parameters = visit_if_map_flatten(ctx__procedure_head__procedure_head_parameter)
|
1525
1601
|
declarations = visit_if_map(ctx__algorithm_head__declaration)
|
1526
|
-
|
1527
|
-
|
1602
|
+
types = declarations.select{|x| x.instance_of? Model::Type}
|
1603
|
+
entities = declarations.select{|x| x.instance_of? Model::Entity}
|
1604
|
+
subtype_constraints = declarations.select{|x| x.instance_of? Model::SubtypeConstraint}
|
1605
|
+
functions = declarations.select{|x| x.instance_of? Model::Function}
|
1606
|
+
procedures = declarations.select{|x| x.instance_of? Model::Procedure}
|
1607
|
+
constants = visit_if(ctx__algorithm_head__constant_decl, [])
|
1608
|
+
variables = visit_if(ctx__algorithm_head__local_decl, [])
|
1528
1609
|
statements = visit_if_map(ctx__stmt)
|
1529
1610
|
|
1530
1611
|
Model::Procedure.new({
|
1531
1612
|
id: id,
|
1532
1613
|
parameters: parameters,
|
1533
|
-
|
1614
|
+
types: types,
|
1615
|
+
entities: entities,
|
1616
|
+
subtype_constraints: subtype_constraints,
|
1617
|
+
functions: functions,
|
1618
|
+
procedures: procedures,
|
1534
1619
|
constants: constants,
|
1535
1620
|
variables: variables,
|
1536
1621
|
statements: statements
|
@@ -1609,12 +1694,12 @@ module Expressir
|
|
1609
1694
|
ctx__logical_expression = ctx.logical_expression
|
1610
1695
|
|
1611
1696
|
id = visit_if(ctx__variable_id)
|
1612
|
-
|
1697
|
+
aggregate_source = visit_if(ctx__aggregate_source)
|
1613
1698
|
expression = visit_if(ctx__logical_expression)
|
1614
1699
|
|
1615
1700
|
Model::Expressions::QueryExpression.new({
|
1616
1701
|
id: id,
|
1617
|
-
|
1702
|
+
aggregate_source: aggregate_source,
|
1618
1703
|
expression: expression
|
1619
1704
|
})
|
1620
1705
|
end
|
@@ -1807,15 +1892,24 @@ module Expressir
|
|
1807
1892
|
id = visit_if(ctx__rule_head__rule_id)
|
1808
1893
|
applies_to = visit_if_map(ctx__rule_head__entity_ref)
|
1809
1894
|
declarations = visit_if_map(ctx__algorithm_head__declaration)
|
1810
|
-
|
1811
|
-
|
1895
|
+
types = declarations.select{|x| x.instance_of? Model::Type}
|
1896
|
+
entities = declarations.select{|x| x.instance_of? Model::Entity}
|
1897
|
+
subtype_constraints = declarations.select{|x| x.instance_of? Model::SubtypeConstraint}
|
1898
|
+
functions = declarations.select{|x| x.instance_of? Model::Function}
|
1899
|
+
procedures = declarations.select{|x| x.instance_of? Model::Procedure}
|
1900
|
+
constants = visit_if(ctx__algorithm_head__constant_decl, [])
|
1901
|
+
variables = visit_if(ctx__algorithm_head__local_decl, [])
|
1812
1902
|
statements = visit_if_map(ctx__stmt)
|
1813
|
-
where = visit_if(ctx__where_clause)
|
1903
|
+
where = visit_if(ctx__where_clause, [])
|
1814
1904
|
|
1815
1905
|
Model::Rule.new({
|
1816
1906
|
id: id,
|
1817
1907
|
applies_to: applies_to,
|
1818
|
-
|
1908
|
+
types: types,
|
1909
|
+
entities: entities,
|
1910
|
+
subtype_constraints: subtype_constraints,
|
1911
|
+
functions: functions,
|
1912
|
+
procedures: procedures,
|
1819
1913
|
constants: constants,
|
1820
1914
|
variables: variables,
|
1821
1915
|
statements: statements,
|
@@ -1861,15 +1955,26 @@ module Expressir
|
|
1861
1955
|
id = visit_if(ctx__schema_id)
|
1862
1956
|
version = visit_if(ctx__schema_version_id)
|
1863
1957
|
interfaces = visit_if_map(ctx__schema_body__interface_specification)
|
1864
|
-
constants = visit_if(ctx__schema_body__constant_decl)
|
1958
|
+
constants = visit_if(ctx__schema_body__constant_decl, [])
|
1865
1959
|
declarations = visit_if_map(ctx__schema_body__schema_body_declaration)
|
1960
|
+
types = declarations.select{|x| x.instance_of? Model::Type}
|
1961
|
+
entities = declarations.select{|x| x.instance_of? Model::Entity}
|
1962
|
+
subtype_constraints = declarations.select{|x| x.instance_of? Model::SubtypeConstraint}
|
1963
|
+
functions = declarations.select{|x| x.instance_of? Model::Function}
|
1964
|
+
procedures = declarations.select{|x| x.instance_of? Model::Procedure}
|
1965
|
+
rules = declarations.select{|x| x.instance_of? Model::Rule}
|
1866
1966
|
|
1867
1967
|
Model::Schema.new({
|
1868
1968
|
id: id,
|
1869
1969
|
version: version,
|
1870
1970
|
interfaces: interfaces,
|
1871
1971
|
constants: constants,
|
1872
|
-
|
1972
|
+
types: types,
|
1973
|
+
entities: entities,
|
1974
|
+
subtype_constraints: subtype_constraints,
|
1975
|
+
functions: functions,
|
1976
|
+
procedures: procedures,
|
1977
|
+
rules: rules
|
1873
1978
|
})
|
1874
1979
|
end
|
1875
1980
|
|
@@ -1909,11 +2014,11 @@ module Expressir
|
|
1909
2014
|
ctx__select_extension__type_ref = ctx.select_extension&.type_ref
|
1910
2015
|
ctx__select_extension__select_list = ctx__select_extension&.select_list
|
1911
2016
|
|
1912
|
-
extensible =
|
1913
|
-
generic_entity =
|
1914
|
-
items = visit_if(ctx__select_list)
|
2017
|
+
extensible = ctx__EXTENSIBLE && true
|
2018
|
+
generic_entity = ctx__GENERIC_ENTITY && true
|
2019
|
+
items = visit_if(ctx__select_list, [])
|
1915
2020
|
extension_type = visit_if(ctx__select_extension__type_ref)
|
1916
|
-
extension_items = visit_if(ctx__select_extension__select_list)
|
2021
|
+
extension_items = visit_if(ctx__select_extension__select_list, [])
|
1917
2022
|
|
1918
2023
|
Model::Types::Select.new({
|
1919
2024
|
extensible: extensible,
|
@@ -2046,7 +2151,7 @@ module Expressir
|
|
2046
2151
|
ctx__width_spec__FIXED = ctx__width_spec&.FIXED
|
2047
2152
|
|
2048
2153
|
width = visit_if(ctx__width_spec__width)
|
2049
|
-
fixed =
|
2154
|
+
fixed = ctx__width_spec__FIXED && true
|
2050
2155
|
|
2051
2156
|
Model::Types::String.new({
|
2052
2157
|
width: width,
|
@@ -2079,7 +2184,7 @@ module Expressir
|
|
2079
2184
|
|
2080
2185
|
id = visit_if(ctx__subtype_constraint_head__subtype_constraint_id)
|
2081
2186
|
applies_to = visit_if(ctx__subtype_constraint_head__entity_ref)
|
2082
|
-
abstract =
|
2187
|
+
abstract = ctx__subtype_constraint_body__abstract_supertype && true
|
2083
2188
|
total_over = visit_if(ctx__subtype_constraint_body__total_over)
|
2084
2189
|
supertype_expression = visit_if(ctx__subtype_constraint_body__supertype_expression)
|
2085
2190
|
|
@@ -2215,7 +2320,7 @@ module Expressir
|
|
2215
2320
|
|
2216
2321
|
id = visit_if(ctx__type_id)
|
2217
2322
|
type = visit_if(ctx__underlying_type)
|
2218
|
-
where = visit_if(ctx__where_clause)
|
2323
|
+
where = visit_if(ctx__where_clause, [])
|
2219
2324
|
|
2220
2325
|
Model::Type.new({
|
2221
2326
|
id: id,
|
@@ -2429,7 +2534,7 @@ module Expressir
|
|
2429
2534
|
def handle_simple_string_literal(ctx)
|
2430
2535
|
ctx__text = ctx.text
|
2431
2536
|
|
2432
|
-
value = ctx__text[1..(ctx__text.length - 2)]
|
2537
|
+
value = ctx__text[1..(ctx__text.length - 2)].force_encoding('UTF-8')
|
2433
2538
|
|
2434
2539
|
Model::Literals::String.new({
|
2435
2540
|
value: value
|
@@ -2439,7 +2544,7 @@ module Expressir
|
|
2439
2544
|
def handle_encoded_string_literal(ctx)
|
2440
2545
|
ctx__text = ctx.text
|
2441
2546
|
|
2442
|
-
value = ctx__text[1..(ctx__text.length - 2)]
|
2547
|
+
value = ctx__text[1..(ctx__text.length - 2)].force_encoding('UTF-8')
|
2443
2548
|
|
2444
2549
|
Model::Literals::String.new({
|
2445
2550
|
value: value,
|