sbuilder-al 0.0.8
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/README.org +217 -0
- data/VERSION +1 -0
- data/design/al-language-bnf.org +216 -0
- data/lib/meta/etc.rb +265 -0
- data/lib/meta/meta.rb +106 -0
- data/lib/model/api.rb +678 -0
- data/lib/model/builders.rb +603 -0
- data/lib/model/constants.rb +24 -0
- data/lib/model/model.rb +534 -0
- data/lib/model/module.rb +25 -0
- data/lib/plugin/controller.rb +247 -0
- data/lib/plugin/module.rb +2 -0
- data/lib/plugin/plugin.rb +352 -0
- data/lib/sbuilder-al.rb +30 -0
- data/lib/translator/alrules.rb +424 -0
- data/lib/translator/module.rb +31 -0
- data/lib/translator/producer.rb +580 -0
- data/lib/translator/renderer.rb +159 -0
- data/lib/translator/sexp.rb +57 -0
- data/lib/translator/tlagenerator.rb +1348 -0
- data/lib/translator/translator.rb +210 -0
- data/lib/util/exception.rb +16 -0
- data/lib/util/logger.rb +90 -0
- data/lib/util/module.rb +16 -0
- data/lib/util/script_eval.rb +41 -0
- data/sbuilder-al.gemspec +45 -0
- metadata +153 -0
data/lib/meta/meta.rb
ADDED
@@ -0,0 +1,106 @@
|
|
1
|
+
module Sbuilder
|
2
|
+
|
3
|
+
module Al
|
4
|
+
module Meta
|
5
|
+
|
6
|
+
# For patter to create use modules to define class methods
|
7
|
+
# https://stackoverflow.com/questions/10692961/inheriting-class-methods-from-modules-mixins-in-ruby
|
8
|
+
|
9
|
+
def self.included( base)
|
10
|
+
base.extend( Sbuilder::Al::Meta::MetaClassMethods )
|
11
|
+
base.send( :include, Sbuilder::Al::Meta::MetaInstanceMethods )
|
12
|
+
end
|
13
|
+
|
14
|
+
|
15
|
+
module MetaInstanceMethods
|
16
|
+
end
|
17
|
+
|
18
|
+
module MetaClassMethods
|
19
|
+
|
20
|
+
# For implementing descendants
|
21
|
+
# http://www.eq8.eu/blogs/13-ruby-ancestors-descendants-and-other-annoying-relatives update 1
|
22
|
+
def inherited(klass)
|
23
|
+
@descendants ||= []
|
24
|
+
@descendants << klass
|
25
|
+
end
|
26
|
+
|
27
|
+
def descendants
|
28
|
+
@descendants || []
|
29
|
+
end
|
30
|
+
|
31
|
+
def descendants?
|
32
|
+
descendants.any?
|
33
|
+
end
|
34
|
+
|
35
|
+
def demodulize
|
36
|
+
self.class_name.split("::").last
|
37
|
+
end
|
38
|
+
def class_name
|
39
|
+
self.to_s
|
40
|
+
end
|
41
|
+
|
42
|
+
# Ancestor in meta hierarchy
|
43
|
+
#
|
44
|
+
# @return [Array<Class>] classe in superclass hierarchy
|
45
|
+
# implementing module Sbuilder::Al::Meta, ordered from
|
46
|
+
# top-most class
|
47
|
+
def metaAncestors( hierarchy = [] )
|
48
|
+
hierarchy = self.superclass.metaAncestors(hierarchy) if ( self.superclass.respond_to?( :metaAncestors) )
|
49
|
+
hierarchy << self
|
50
|
+
hierarchy
|
51
|
+
end
|
52
|
+
|
53
|
+
|
54
|
+
# @return [Array<Symbol>] services symbols added using addService
|
55
|
+
def services
|
56
|
+
@services || []
|
57
|
+
end
|
58
|
+
|
59
|
+
# Define method +op+ implemented by +proc+ and +block+
|
60
|
+
#
|
61
|
+
# @param op [Symbol] instance method to define
|
62
|
+
#
|
63
|
+
# @param proc [Proc, lambda] method implementation, if nil
|
64
|
+
# use +&blok+ for method implementation
|
65
|
+
#
|
66
|
+
# @param args [Object] arguments curryed to +proc+ or
|
67
|
+
# +&block+
|
68
|
+
#
|
69
|
+
# @param block [Bloc] method implementation, used unless
|
70
|
+
# +proc+ given
|
71
|
+
def addService( op, proc=nil, *args, &block )
|
72
|
+
proc = proc || block
|
73
|
+
if args.count > 0 then
|
74
|
+
proc = proc.curry[*args]
|
75
|
+
end
|
76
|
+
define_method( op, proc )
|
77
|
+
@services = (@services || []) << op
|
78
|
+
end
|
79
|
+
|
80
|
+
# @return [Array<Symbol>] attribute names added by +addAttribute+
|
81
|
+
def attributes
|
82
|
+
@attributes||[]
|
83
|
+
end
|
84
|
+
|
85
|
+
# Add attribute +attr+ and 'attr_reader'
|
86
|
+
def attribute_reader( attr )
|
87
|
+
attr_reader( attr )
|
88
|
+
@attributes = ((@attributes || []) << attr).uniq
|
89
|
+
end
|
90
|
+
# Add attribute +attr+ and 'attr_writer'
|
91
|
+
def attribute_writer( attr )
|
92
|
+
attr_writer( attr )
|
93
|
+
@attributes = ((@attributes || []) << attr).uniq
|
94
|
+
end
|
95
|
+
# Add attribute +attr+ and 'attribute_reader' and 'attribute_writer'
|
96
|
+
def attribute_accessor( attr )
|
97
|
+
attribute_reader( attr )
|
98
|
+
attribute_writer( attr )
|
99
|
+
# @attributes = ((@attributes || []) << attr).uniq
|
100
|
+
end
|
101
|
+
|
102
|
+
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end # Al
|
106
|
+
end # Sbuilder
|
data/lib/model/api.rb
ADDED
@@ -0,0 +1,678 @@
|
|
1
|
+
require 'docile'
|
2
|
+
|
3
|
+
module Sbuilder
|
4
|
+
module Al
|
5
|
+
module Model
|
6
|
+
|
7
|
+
##
|
8
|
+
# Api module to include into API object to add privitives to
|
9
|
+
# construct {Sbuilder::Al::Model} application model
|
10
|
+
# objects. Implementation uses docile -Gem and builders classess
|
11
|
+
# in {Sbuilder::Al::Model::Builder}
|
12
|
+
#
|
13
|
+
# Api object primitives includes a configuration, which allows
|
14
|
+
# mapping one "appName" (=name in application namespace) to
|
15
|
+
# several application model elements, each corresponding to a #
|
16
|
+
# unique "specName" (=name in tla- model name space).
|
17
|
+
#
|
18
|
+
#
|
19
|
+
# Primitives included into an API object fall into the following
|
20
|
+
# categories:
|
21
|
+
#
|
22
|
+
# * class methods to construct an Api object for building
|
23
|
+
# {Sbuilder::Al::Model} application model objects
|
24
|
+
#
|
25
|
+
# * instance attribute to manage appName/specName mapping
|
26
|
+
#
|
27
|
+
# * instance methods to construct building application model
|
28
|
+
# objects (using Ruby domain specific language (DSL) implmented
|
29
|
+
# using Docile GEM.
|
30
|
+
#
|
31
|
+
#
|
32
|
+
module Api
|
33
|
+
|
34
|
+
# not catched
|
35
|
+
class ApiException < Sbuilder::Al::Util::AlException; end
|
36
|
+
# to be catched
|
37
|
+
class ApiError < Sbuilder::Al::Util::AlError; end
|
38
|
+
|
39
|
+
|
40
|
+
# @!group Class methods
|
41
|
+
|
42
|
+
# For the pattern to use modules in defining class methods
|
43
|
+
# https://stackoverflow.com/questions/10692961/inheriting-class-methods-from-modules-mixins-in-ruby
|
44
|
+
|
45
|
+
def self.included( base)
|
46
|
+
base.extend( ClassMethods )
|
47
|
+
# base.send( :include, Sbuilder::Al::Meta::MetaInstanceMethods )
|
48
|
+
end
|
49
|
+
|
50
|
+
module ClassMethods
|
51
|
+
|
52
|
+
|
53
|
+
|
54
|
+
def create( metaDefs={} )
|
55
|
+
warn "Sbuilder::Al::Model.create depracted - use Sbuilder::Al::Model.start, instead"
|
56
|
+
start( metaDefs )
|
57
|
+
# o = self.new
|
58
|
+
# o.metaDefs = metaDefs
|
59
|
+
# o
|
60
|
+
end
|
61
|
+
|
62
|
+
# Construct an api object with and initialize 'metaDefs' attribute
|
63
|
+
#
|
64
|
+
# @param metaDefs [Hash] see {Sbuilder::Al::Model::Api#metaDefs} meta
|
65
|
+
# definition configuration to set
|
66
|
+
#
|
67
|
+
|
68
|
+
def start( metaDefs )
|
69
|
+
o = self.new
|
70
|
+
o.metaDefs = metaDefs
|
71
|
+
o
|
72
|
+
end
|
73
|
+
|
74
|
+
end
|
75
|
+
|
76
|
+
# @!endgroup
|
77
|
+
|
78
|
+
# ------------------------------------------------------------------
|
79
|
+
# @!group Attributes
|
80
|
+
|
81
|
+
# @!attribute metaDefs [Hash]
|
82
|
+
#
|
83
|
+
# Allow mapping "appName" in application namespace to several
|
84
|
+
# "specNames" in tla-model namespace. Application build
|
85
|
+
# methods 'meta' -attribute to be a key in 'metaDefs' hash.
|
86
|
+
#
|
87
|
+
# * key [String] application build method 'meta' attribute
|
88
|
+
# must be a valid key in 'metaDefs'
|
89
|
+
#
|
90
|
+
# * value [Hash] metatype definition
|
91
|
+
# * :description [String] a short summary of the metatype
|
92
|
+
#
|
93
|
+
# * :prefix [String] optional, allow fixed string to be
|
94
|
+
# prefixed to 'appName' to create an
|
95
|
+
# unique 'specName', normally nil/not
|
96
|
+
# defined to allow sbuilder facade to
|
97
|
+
# choose prefix
|
98
|
+
attr_writer :metaDefs
|
99
|
+
|
100
|
+
def metaDefs
|
101
|
+
return @metaDefs || {}
|
102
|
+
end
|
103
|
+
|
104
|
+
# @!endgroup
|
105
|
+
|
106
|
+
# ------------------------------------------------------------------
|
107
|
+
# @!group Private methods
|
108
|
+
def lookupMeta( meta )
|
109
|
+
return meta if Sbuilder::Al::Plugin::Plugin.sbuilderMetatype?( meta )
|
110
|
+
raise ApiError, "Unknown meta '#{meta}', valid metas=#{metaDefs.keys.join(',')}" unless metaDefs.key?( meta )
|
111
|
+
meta
|
112
|
+
end
|
113
|
+
|
114
|
+
# @!endgroup
|
115
|
+
|
116
|
+
# ------------------------------------------------------------------
|
117
|
+
# @!group defines & parameter sets
|
118
|
+
|
119
|
+
|
120
|
+
def domain( &block )
|
121
|
+
Docile.dsl_eval( Sbuilder::Al::Model::Builders::DomainBuilder.new, &block ).build
|
122
|
+
end
|
123
|
+
|
124
|
+
def definition( &block )
|
125
|
+
Docile.dsl_eval( Sbuilder::Al::Model::Builders::DefinitionBuilder.new, &block ).build
|
126
|
+
end
|
127
|
+
def functionDefinition( &block )
|
128
|
+
Docile.dsl_eval( Sbuilder::Al::Model::Builders::FunctionDefinitionBuilder.new, &block ).build
|
129
|
+
end
|
130
|
+
def property( &block )
|
131
|
+
Docile.dsl_eval( Sbuilder::Al::Model::Builders::PropertyBuilder.new, &block ).build
|
132
|
+
end
|
133
|
+
module_function :property
|
134
|
+
public :property
|
135
|
+
|
136
|
+
def request( &block )
|
137
|
+
Docile.dsl_eval( Sbuilder::Al::Model::Builders::RequestBuilder.new, &block ).build
|
138
|
+
end
|
139
|
+
|
140
|
+
def response( &block )
|
141
|
+
Docile.dsl_eval( Sbuilder::Al::Model::Builders::ResponseBuilder.new, &block ).build
|
142
|
+
end
|
143
|
+
|
144
|
+
# @!endgroup
|
145
|
+
|
146
|
+
|
147
|
+
# ------------------------------------------------------------------
|
148
|
+
# @!group tx, macro function, operator
|
149
|
+
|
150
|
+
|
151
|
+
|
152
|
+
def transaction( meta, &block )
|
153
|
+
Docile.dsl_eval( Sbuilder::Al::Model::Builders::TransactionBuilder.new, &block ).build(lookupMeta(meta))
|
154
|
+
end
|
155
|
+
|
156
|
+
def snippet( meta, &block)
|
157
|
+
# block = Proc.new{
|
158
|
+
# expression msg
|
159
|
+
# } if block.nil?
|
160
|
+
Docile.dsl_eval( Sbuilder::Al::Model::Builders::SnippetBuilder.new, &block ).build(lookupMeta(meta))
|
161
|
+
end
|
162
|
+
|
163
|
+
# def function( meta, &block )
|
164
|
+
# Docile.dsl_eval( Sbuilder::Al::Model::Builders::FunctionBuilder.new, &block ).build(lookupMeta(meta))
|
165
|
+
# end
|
166
|
+
|
167
|
+
def operator( meta, &block )
|
168
|
+
Docile.dsl_eval( Sbuilder::Al::Model::Builders::OperatorBuilder.new, &block ).build(lookupMeta(meta))
|
169
|
+
end
|
170
|
+
|
171
|
+
def macro( meta, &block )
|
172
|
+
Docile.dsl_eval( Sbuilder::Al::Model::Builders::MacroBuilder.new, &block ).build(lookupMeta(meta))
|
173
|
+
end
|
174
|
+
|
175
|
+
def aliased( meta, &block )
|
176
|
+
Docile.dsl_eval( Sbuilder::Al::Model::Builders::AliasBuilder.new, &block ).build(lookupMeta(meta))
|
177
|
+
end
|
178
|
+
# storage
|
179
|
+
|
180
|
+
def local( meta, &block )
|
181
|
+
Docile.dsl_eval( Sbuilder::Al::Model::Builders::LocalBuilder.new, &block ).build( lookupMeta(meta) )
|
182
|
+
end
|
183
|
+
|
184
|
+
def variable( meta, &block )
|
185
|
+
Docile.dsl_eval( Sbuilder::Al::Model::Builders::VariableBuilder.new, &block ).build( lookupMeta(meta) )
|
186
|
+
end
|
187
|
+
|
188
|
+
def parameter( meta, &block )
|
189
|
+
Docile.dsl_eval( Sbuilder::Al::Model::Builders::ParameterBuilder.new, &block ).build( lookupMeta(meta) )
|
190
|
+
end
|
191
|
+
|
192
|
+
|
193
|
+
# @!endgroup
|
194
|
+
|
195
|
+
|
196
|
+
# ------------------------------------------------------------------
|
197
|
+
# @!group expression
|
198
|
+
|
199
|
+
|
200
|
+
|
201
|
+
|
202
|
+
#
|
203
|
+
|
204
|
+
def expression( e )
|
205
|
+
if ( e.is_a?(Symbol) && Constants::CONSTANT_EXPRESSIONS[e] )
|
206
|
+
constantExpression do
|
207
|
+
value e
|
208
|
+
end
|
209
|
+
else
|
210
|
+
case e
|
211
|
+
when String, Numeric, TrueClass, FalseClass
|
212
|
+
constantExpression do
|
213
|
+
value e
|
214
|
+
end
|
215
|
+
when Array
|
216
|
+
e.map{ |arrayElement| expression(arrayElement) }
|
217
|
+
when Sbuilder::Al::Model::Expression
|
218
|
+
e
|
219
|
+
when Sbuilder::Al::Model::Reference
|
220
|
+
referenceExpression do
|
221
|
+
reference e
|
222
|
+
end
|
223
|
+
else
|
224
|
+
raise raise ApiError, "Missing implementation for #{e.class}: #{e}"
|
225
|
+
end
|
226
|
+
end
|
227
|
+
end
|
228
|
+
module_function :expression
|
229
|
+
public :expression
|
230
|
+
|
231
|
+
def constantExpression(val=nil, &block )
|
232
|
+
block = Proc.new{
|
233
|
+
value val
|
234
|
+
} if block.nil? || !val.nil?
|
235
|
+
|
236
|
+
Docile.dsl_eval( Sbuilder::Al::Model::Builders::ConstantExpressionBuilder.new, &block ).build
|
237
|
+
end
|
238
|
+
module_function :constantExpression
|
239
|
+
public :constantExpression
|
240
|
+
|
241
|
+
def referenceExpression( &block )
|
242
|
+
Docile.dsl_eval( Sbuilder::Al::Model::Builders::ReferenceExpressionBuilder.new, &block ).build
|
243
|
+
end
|
244
|
+
module_function :referenceExpression
|
245
|
+
public :referenceExpression
|
246
|
+
|
247
|
+
|
248
|
+
def binaryExpression( &block )
|
249
|
+
Docile.dsl_eval( Sbuilder::Al::Model::Builders::BinaryExpressionBuilder.new, &block ).build
|
250
|
+
end
|
251
|
+
module_function :binaryExpression
|
252
|
+
public :binaryExpression
|
253
|
+
|
254
|
+
def unaryExpression( &block )
|
255
|
+
Docile.dsl_eval( Sbuilder::Al::Model::Builders::UnaryExpressionBuilder.new, &block ).build
|
256
|
+
end
|
257
|
+
module_function :unaryExpression
|
258
|
+
public :unaryExpression
|
259
|
+
|
260
|
+
def not( exprission, &block )
|
261
|
+
block = Proc.new{
|
262
|
+
op :not
|
263
|
+
expr exprission
|
264
|
+
} if block.nil? || !val.nil?
|
265
|
+
Docile.dsl_eval( Sbuilder::Al::Model::Builders::UnaryExpressionBuilder.new, &block ).build
|
266
|
+
end
|
267
|
+
module_function :not
|
268
|
+
public :not
|
269
|
+
|
270
|
+
def plus( l, r )
|
271
|
+
binaryExpression do
|
272
|
+
op :plus
|
273
|
+
lval expression(l)
|
274
|
+
rval expression(r)
|
275
|
+
end
|
276
|
+
end
|
277
|
+
module_function :plus
|
278
|
+
public :plus
|
279
|
+
|
280
|
+
def and( l, r )
|
281
|
+
binaryExpression do
|
282
|
+
op :and
|
283
|
+
lval expression(l)
|
284
|
+
rval expression(r)
|
285
|
+
end
|
286
|
+
end
|
287
|
+
module_function :and
|
288
|
+
public :and
|
289
|
+
|
290
|
+
def or( l, r )
|
291
|
+
binaryExpression do
|
292
|
+
op :or
|
293
|
+
lval expression(l)
|
294
|
+
rval expression(r)
|
295
|
+
end
|
296
|
+
end
|
297
|
+
module_function :or
|
298
|
+
public :or
|
299
|
+
|
300
|
+
def minus( l, r )
|
301
|
+
binaryExpression do
|
302
|
+
op :minus
|
303
|
+
lval expression(l)
|
304
|
+
rval expression(r)
|
305
|
+
end
|
306
|
+
end
|
307
|
+
module_function :minus
|
308
|
+
public :minus
|
309
|
+
|
310
|
+
def equal( l, r )
|
311
|
+
binaryExpression do
|
312
|
+
op :equal
|
313
|
+
lval expression(l)
|
314
|
+
rval expression(r)
|
315
|
+
end
|
316
|
+
end
|
317
|
+
module_function :equal
|
318
|
+
public :equal
|
319
|
+
|
320
|
+
def unequal( l, r )
|
321
|
+
binaryExpression do
|
322
|
+
op :unequal
|
323
|
+
lval expression(l)
|
324
|
+
rval expression(r)
|
325
|
+
end
|
326
|
+
end
|
327
|
+
module_function :unequal
|
328
|
+
public :unequal
|
329
|
+
|
330
|
+
|
331
|
+
def tlaExpression( &block )
|
332
|
+
Docile.dsl_eval( Sbuilder::Al::Model::Builders::TlaExpressionBuilder.new, &block ).build
|
333
|
+
end
|
334
|
+
module_function :tlaExpression
|
335
|
+
public :tlaExpression
|
336
|
+
|
337
|
+
def tlaSet( *args, &block )
|
338
|
+
args = args.map{ |a| expression(a) } unless args.nil?
|
339
|
+
tlaExpression do
|
340
|
+
template :set
|
341
|
+
args args
|
342
|
+
end
|
343
|
+
end
|
344
|
+
module_function :tlaSet
|
345
|
+
public :tlaSet
|
346
|
+
|
347
|
+
def tlaNil
|
348
|
+
tlaExpression do
|
349
|
+
template :nil
|
350
|
+
end
|
351
|
+
end
|
352
|
+
module_function :tlaNil
|
353
|
+
public :tlaNil
|
354
|
+
|
355
|
+
def tlaPlainname( name )
|
356
|
+
tlaExpression do
|
357
|
+
template :plainname
|
358
|
+
args name
|
359
|
+
end
|
360
|
+
end
|
361
|
+
module_function :tlaPlainname
|
362
|
+
public :tlaPlainname
|
363
|
+
|
364
|
+
def tlaParenthesis( expr )
|
365
|
+
tlaExpression do
|
366
|
+
template :parenthesis
|
367
|
+
args expression(expr)
|
368
|
+
end
|
369
|
+
end
|
370
|
+
module_function :tlaParenthesis
|
371
|
+
public :tlaParenthesis
|
372
|
+
|
373
|
+
# @param map [tlaExpressio] expression generatin the set
|
374
|
+
# @param variable [String] to iterate
|
375
|
+
# @param set [String] base set used to generate in map expression
|
376
|
+
def tlaSetGenerate( map, variable, set )
|
377
|
+
tlaExpression do
|
378
|
+
template :set_generate
|
379
|
+
args( expression(map) )
|
380
|
+
args( variable )
|
381
|
+
args( set )
|
382
|
+
end
|
383
|
+
end
|
384
|
+
module_function :tlaSetGenerate
|
385
|
+
public :tlaSetGenerate
|
386
|
+
|
387
|
+
# @param variable [String] used to iterate
|
388
|
+
# @param set [String] to iterate
|
389
|
+
def tlaSetIterate( variable, set )
|
390
|
+
tlaExpression do
|
391
|
+
template :set_iterate
|
392
|
+
args( variable )
|
393
|
+
args( set )
|
394
|
+
end
|
395
|
+
end
|
396
|
+
module_function :tlaSetIterate
|
397
|
+
public :tlaSetIterate
|
398
|
+
|
399
|
+
|
400
|
+
|
401
|
+
def tlaSetSelect( variable, set, select )
|
402
|
+
tlaExpression do
|
403
|
+
template :set_select
|
404
|
+
args( variable )
|
405
|
+
args( set )
|
406
|
+
args( select )
|
407
|
+
end
|
408
|
+
end
|
409
|
+
module_function :tlaSetSelect
|
410
|
+
public :tlaSetSelect
|
411
|
+
|
412
|
+
|
413
|
+
def tlaIF( condition, thenExpr, elseExpr )
|
414
|
+
tlaExpression do
|
415
|
+
template :IF_expression
|
416
|
+
args( condition )
|
417
|
+
args( thenExpr )
|
418
|
+
args( elseExpr )
|
419
|
+
end
|
420
|
+
end
|
421
|
+
module_function :tlaIF
|
422
|
+
public :tlaIF
|
423
|
+
|
424
|
+
|
425
|
+
def tlaEXCEPT( variable, excepts )
|
426
|
+
tlaExpression do
|
427
|
+
template :EXCEPT_expression
|
428
|
+
args( variable )
|
429
|
+
args( excepts )
|
430
|
+
end
|
431
|
+
end
|
432
|
+
module_function :tlaEXCEPT
|
433
|
+
public :tlaEXCEPT
|
434
|
+
|
435
|
+
def tlaRecordField( record, field )
|
436
|
+
tlaExpression do
|
437
|
+
template :record_field
|
438
|
+
args( record )
|
439
|
+
args( field )
|
440
|
+
end
|
441
|
+
end
|
442
|
+
module_function :tlaRecordField
|
443
|
+
public :tlaRecordField
|
444
|
+
|
445
|
+
|
446
|
+
def tlaRecordIndex( record, index )
|
447
|
+
tlaExpression do
|
448
|
+
template :record_index
|
449
|
+
args( record )
|
450
|
+
args( index )
|
451
|
+
end
|
452
|
+
end
|
453
|
+
module_function :tlaRecordIndex
|
454
|
+
public :tlaRecordIndex
|
455
|
+
|
456
|
+
|
457
|
+
def tlaRecord( fields )
|
458
|
+
tlaExpression do
|
459
|
+
template :record
|
460
|
+
args( fields )
|
461
|
+
end
|
462
|
+
end
|
463
|
+
module_function :tlaRecord
|
464
|
+
public :tlaRecord
|
465
|
+
|
466
|
+
def tlaRecordFieldDef( name, value )
|
467
|
+
tlaExpression do
|
468
|
+
template :record_field_definition
|
469
|
+
args( name )
|
470
|
+
args( value )
|
471
|
+
end
|
472
|
+
end
|
473
|
+
module_function :tlaRecordFieldDef
|
474
|
+
public :tlaRecordFieldDef
|
475
|
+
|
476
|
+
def tlaOperatorCall( operator, arguments )
|
477
|
+
tlaExpression do
|
478
|
+
template :operator_call
|
479
|
+
args( operator )
|
480
|
+
args( arguments )
|
481
|
+
end
|
482
|
+
end
|
483
|
+
module_function :tlaOperatorCall
|
484
|
+
public :tlaOperatorCall
|
485
|
+
|
486
|
+
|
487
|
+
def tlaSequence( *args, &block )
|
488
|
+
args = args.map{ |a| expression(a) } unless args.nil?
|
489
|
+
tlaExpression do
|
490
|
+
template :sequence
|
491
|
+
args args
|
492
|
+
end
|
493
|
+
end
|
494
|
+
module_function :tlaSequence
|
495
|
+
public :tlaSequence
|
496
|
+
|
497
|
+
# @!endgroup
|
498
|
+
|
499
|
+
|
500
|
+
# ------------------------------------------------------------------
|
501
|
+
# @!group references
|
502
|
+
|
503
|
+
|
504
|
+
|
505
|
+
|
506
|
+
def reference( v1, v2=nil )
|
507
|
+
if v1.is_a?(Sbuilder::Al::Model::Reference )
|
508
|
+
return v1
|
509
|
+
elsif v1.is_a?(String)
|
510
|
+
simpleReference(v1, v2)
|
511
|
+
elsif v1.is_a?(Array) && v1.length == 1
|
512
|
+
simpleReference( *v1, v2)
|
513
|
+
elsif v1.is_a?(Array) && v1.length == 2
|
514
|
+
variableReference( *v1, v2 )
|
515
|
+
elsif v1.is_a?(Array) && v1.length == 3
|
516
|
+
txParameterReference( *v1, v2 )
|
517
|
+
else
|
518
|
+
raise raise ApiError, "Missing implementation for #{v1.class}: #{v1} and #{v2.class}: #{v2}"
|
519
|
+
end
|
520
|
+
end
|
521
|
+
module_function :reference
|
522
|
+
public :reference
|
523
|
+
|
524
|
+
# refering named 'parameter'
|
525
|
+
def simpleReference( parameterName, fldArray=nil )
|
526
|
+
fldArray = [ fldArray ] unless fldArray.nil? || fldArray.is_a?(Array)
|
527
|
+
# define block for builder
|
528
|
+
block = Proc.new{
|
529
|
+
name parameterName
|
530
|
+
fldArray && fldArray.each do |fld|
|
531
|
+
fields fld
|
532
|
+
end
|
533
|
+
}
|
534
|
+
Docile.dsl_eval( Sbuilder::Al::Model::Builders::SimpleReferenceBuilder.new, &block ).build
|
535
|
+
end
|
536
|
+
module_function :simpleReference
|
537
|
+
public :simpleReference
|
538
|
+
|
539
|
+
# refering to a state 'variable' in namespace 'meta'
|
540
|
+
def variableReference( meta, variable, fldArray=nil )
|
541
|
+
fldArray = [ fldArray ] unless fldArray.nil? || fldArray.is_a?(Array)
|
542
|
+
# define block for builder
|
543
|
+
block = Proc.new{
|
544
|
+
meta meta
|
545
|
+
name variable
|
546
|
+
fldArray && fldArray.each do |fld|
|
547
|
+
fields fld
|
548
|
+
end
|
549
|
+
}
|
550
|
+
Docile.dsl_eval( Sbuilder::Al::Model::Builders::VariableReferenceBuilder.new, &block ).build
|
551
|
+
end
|
552
|
+
module_function :variableReference
|
553
|
+
public :variableReference
|
554
|
+
|
555
|
+
# refering to a state 'variable' in namespace 'meta'
|
556
|
+
def txParameterReference( meta, variable, op, fldArray=nil )
|
557
|
+
fldArray = [ fldArray ] unless fldArray.nil? || fldArray.is_a?(Array)
|
558
|
+
# define block for builder
|
559
|
+
block = Proc.new{
|
560
|
+
meta meta
|
561
|
+
name variable
|
562
|
+
operation op
|
563
|
+
fldArray && fldArray.each do |fld|
|
564
|
+
fields fld
|
565
|
+
end
|
566
|
+
}
|
567
|
+
Docile.dsl_eval( Sbuilder::Al::Model::Builders::TxParameterReferenceBuilder.new, &block ).build
|
568
|
+
end
|
569
|
+
module_function :txParameterReference
|
570
|
+
public :txParameterReference
|
571
|
+
|
572
|
+
# @!endgroup
|
573
|
+
|
574
|
+
# ------------------------------------------------------------------
|
575
|
+
# @!group statements
|
576
|
+
|
577
|
+
|
578
|
+
|
579
|
+
|
580
|
+
|
581
|
+
def block( &block )
|
582
|
+
Docile.dsl_eval( Sbuilder::Al::Model::Builders::BlockBuilder.new, &block ).build
|
583
|
+
end
|
584
|
+
module_function :block
|
585
|
+
public :block
|
586
|
+
|
587
|
+
def outputStatement( msg="", &block )
|
588
|
+
# allow skip without block
|
589
|
+
block = Proc.new{
|
590
|
+
expression msg
|
591
|
+
} if block.nil?
|
592
|
+
Docile.dsl_eval( Sbuilder::Al::Model::Builders::OutputStatementBuilder.new, &block ).build
|
593
|
+
end
|
594
|
+
module_function :outputStatement
|
595
|
+
public :outputStatement
|
596
|
+
|
597
|
+
def returnStatement( &block )
|
598
|
+
Docile.dsl_eval( Sbuilder::Al::Model::Builders::ReturnStatementBuilder.new, &block ).build
|
599
|
+
end
|
600
|
+
module_function :returnStatement
|
601
|
+
public :returnStatement
|
602
|
+
|
603
|
+
def jumpStatement( lab, &block )
|
604
|
+
block = Proc.new{ label lab } if block.nil?
|
605
|
+
Docile.dsl_eval( Sbuilder::Al::Model::Builders::JumpStatementBuilder.new, &block ).build
|
606
|
+
end
|
607
|
+
module_function :jumpStatement
|
608
|
+
public :jumpStatement
|
609
|
+
|
610
|
+
def assignStatement( &block )
|
611
|
+
# allow skip without block
|
612
|
+
Docile.dsl_eval( Sbuilder::Al::Model::Builders::AssignStatementBuilder.new, &block ).build
|
613
|
+
end
|
614
|
+
module_function :assignStatement
|
615
|
+
public :assignStatement
|
616
|
+
|
617
|
+
def callStatement( &block )
|
618
|
+
# allow skip without block
|
619
|
+
block = Proc.new{} if block.nil?
|
620
|
+
Docile.dsl_eval( Sbuilder::Al::Model::Builders::CallStatementBuilder.new, &block ).build
|
621
|
+
end
|
622
|
+
module_function :callStatement
|
623
|
+
public :callStatement
|
624
|
+
|
625
|
+
def conditionalStatement( &block )
|
626
|
+
Docile.dsl_eval( Sbuilder::Al::Model::Builders::ConditionalStatementBuilder.new, &block ).build
|
627
|
+
end
|
628
|
+
module_function :conditionalStatement
|
629
|
+
public :conditionalStatement
|
630
|
+
|
631
|
+
def skipStatement( &block )
|
632
|
+
# allow skip without block
|
633
|
+
block = Proc.new{} if block.nil?
|
634
|
+
Docile.dsl_eval( Sbuilder::Al::Model::Builders::SkipStatementBuilder.new, &block ).build
|
635
|
+
end
|
636
|
+
module_function :skipStatement
|
637
|
+
public :skipStatement
|
638
|
+
alias_method :skip, :skipStatement
|
639
|
+
|
640
|
+
# @!endgroup
|
641
|
+
|
642
|
+
# ------------------------------------------------------------------
|
643
|
+
# @!group str constants
|
644
|
+
|
645
|
+
def self.strLabelEnd( interfaceOperation )
|
646
|
+
"#{interfaceOperation}#{Sbuilder::Al::Translator::TlaGenerator::TLA_LABEL_END}"
|
647
|
+
end
|
648
|
+
def self.strLabelAbort( interfaceOperation )
|
649
|
+
"#{interfaceOperation}#{Sbuilder::Al::Translator::TlaGenerator::TLA_LABEL_ABORT}"
|
650
|
+
end
|
651
|
+
def self.strLabelFail( interfaceOperation )
|
652
|
+
"#{interfaceOperation}#{Sbuilder::Al::Translator::TlaGenerator::TLA_LABEL_FAIL}"
|
653
|
+
end
|
654
|
+
|
655
|
+
# @return [String] name of i-th input parameter to FunctionDefinition
|
656
|
+
def self.inputParameterName(i=1)
|
657
|
+
"p#{i}"
|
658
|
+
end
|
659
|
+
def inputParameterName(i=1)
|
660
|
+
Api.inputParameterName( i )
|
661
|
+
end
|
662
|
+
|
663
|
+
|
664
|
+
# @return [String] name of i-th output parameter to FunctionDefinition
|
665
|
+
def self.outputParameterName(i=1)
|
666
|
+
"ret#{i}"
|
667
|
+
end
|
668
|
+
def outputParameterName(i=1)
|
669
|
+
Api.outputParameterName( i )
|
670
|
+
end
|
671
|
+
|
672
|
+
# @!endgroup
|
673
|
+
|
674
|
+
|
675
|
+
end
|
676
|
+
end
|
677
|
+
end
|
678
|
+
end
|