pione 0.1.1 → 0.1.2
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.
- data/History.txt +9 -2
- data/Rakefile +1 -1
- data/example/Fib/Fib.pione +5 -5
- data/example/SequentialProcess/SequentialProcess.pione +69 -0
- data/lib/pione.rb +7 -11
- data/lib/pione/agent/input-generator.rb +3 -2
- data/lib/pione/agent/task-worker.rb +6 -3
- data/lib/pione/agent/trivial-routine-worker.rb +6 -5
- data/lib/pione/command/basic-command.rb +7 -1
- data/lib/pione/command/child-process.rb +5 -1
- data/lib/pione/command/front-owner-command.rb +15 -4
- data/lib/pione/command/pione-client.rb +16 -9
- data/lib/pione/command/pione-syntax-checker.rb +45 -30
- data/lib/pione/command/pione-task-worker.rb +22 -13
- data/lib/pione/command/pione-tuple-space-provider.rb +4 -2
- data/lib/pione/command/pione-tuple-space-receiver.rb +10 -5
- data/lib/pione/front/task-worker-owner.rb +1 -0
- data/lib/pione/model/basic-model.rb +3 -0
- data/lib/pione/model/block.rb +2 -1
- data/lib/pione/model/call-rule.rb +10 -0
- data/lib/pione/model/feature-expr.rb +143 -54
- data/lib/pione/model/float.rb +0 -1
- data/lib/pione/model/rule-expr.rb +132 -7
- data/lib/pione/model/rule.rb +53 -17
- data/lib/pione/model/ticket-expr.rb +124 -0
- data/lib/pione/parser/expr-parser.rb +75 -38
- data/lib/pione/parser/literal-parser.rb +14 -0
- data/lib/pione/parser/parslet-extension.rb +143 -0
- data/lib/pione/rule-handler/flow-handler.rb +33 -3
- data/lib/pione/system/global.rb +10 -3
- data/lib/pione/transformer.rb +24 -0
- data/lib/pione/transformer/block-transformer.rb +6 -5
- data/lib/pione/transformer/document-transformer.rb +5 -10
- data/lib/pione/transformer/expr-transformer.rb +56 -30
- data/lib/pione/transformer/feature-expr-transformer.rb +9 -5
- data/lib/pione/transformer/flow-element-transformer.rb +21 -23
- data/lib/pione/transformer/literal-transformer.rb +39 -35
- data/lib/pione/transformer/rule-definition-transformer.rb +8 -6
- data/lib/pione/transformer/transformer-module.rb +7 -5
- data/lib/pione/tuple/ticket-tuple.rb +8 -0
- data/lib/pione/util/{message.rb → console-message.rb} +54 -26
- data/lib/pione/version.rb +1 -1
- data/pione.gemspec +2 -1
- data/test/model/spec_feature-expr.rb +18 -3
- data/test/model/spec_feature-expr.yml +28 -16
- data/test/model/spec_ticket-expr.rb +67 -0
- data/test/parser/spec_expr-parser.yml +74 -25
- data/test/parser/spec_literal-parser.yml +11 -0
- data/test/test-util.rb +1 -1
- data/test/transformer/spec_expr-transformer.rb +27 -54
- data/test/transformer/spec_literal-transformer.rb +6 -0
- metadata +29 -7
- data/lib/pione/parser/syntax-error.rb +0 -61
data/lib/pione/model/float.rb
CHANGED
@@ -6,15 +6,27 @@ module Pione::Model
|
|
6
6
|
attr_reader :package
|
7
7
|
attr_reader :name
|
8
8
|
attr_reader :params
|
9
|
+
attr_reader :input_ticket_expr
|
10
|
+
attr_reader :output_ticket_expr
|
9
11
|
|
10
12
|
# Create a rule expression.
|
11
|
-
#
|
12
|
-
# @param [String]
|
13
|
-
#
|
14
|
-
|
13
|
+
#
|
14
|
+
# @param package [String]
|
15
|
+
# package name
|
16
|
+
# @param name [String]
|
17
|
+
# rule name
|
18
|
+
# @param params [Parameters]
|
19
|
+
# parameters
|
20
|
+
# @param input_ticket_expr [TicketExpr]
|
21
|
+
# input ticket condition
|
22
|
+
# @param output_ticket_expr [TicketExpr]
|
23
|
+
# output ticket condition
|
24
|
+
def initialize(package, name, params, input_ticket_expr, output_ticket_expr)
|
15
25
|
@package = package
|
16
26
|
@name = name
|
17
27
|
@params = params
|
28
|
+
@input_ticket_expr = input_ticket_expr
|
29
|
+
@output_ticket_expr = output_ticket_expr
|
18
30
|
super()
|
19
31
|
end
|
20
32
|
|
@@ -41,6 +53,28 @@ module Pione::Model
|
|
41
53
|
"rule_expr(%s,\"%s\")" % [@package.textize, @name]
|
42
54
|
end
|
43
55
|
|
56
|
+
# Create a new rule expression with adding the ticket expression as input
|
57
|
+
# condition.
|
58
|
+
#
|
59
|
+
# @param ticket_expr [TicketExpr]
|
60
|
+
# ticket expression as additional input condition
|
61
|
+
# @return [RuleExpr]
|
62
|
+
# new rule expression
|
63
|
+
def add_input_ticket_expr(ticket_expr)
|
64
|
+
return self.class.new(@package, @name, @params, @input_ticket_expr + ticket_expr, @output_ticket_expr)
|
65
|
+
end
|
66
|
+
|
67
|
+
# Create a new rule expression with adding the ticket expression as output
|
68
|
+
# condition.
|
69
|
+
#
|
70
|
+
# @param ticket_expr [TicketExpr]
|
71
|
+
# ticket expression as additional output condition
|
72
|
+
# @return [RuleExpr]
|
73
|
+
# new rule expression
|
74
|
+
def add_output_ticket_expr(ticket_expr)
|
75
|
+
return self.class.new(@package, @name, @params, @input_ticket_expr, @output_ticket_expr + ticket_expr)
|
76
|
+
end
|
77
|
+
|
44
78
|
# Sets a package name and returns a new expression.
|
45
79
|
# @param [String] package
|
46
80
|
# package name
|
@@ -56,7 +90,7 @@ module Pione::Model
|
|
56
90
|
# @return [RuleExpr]
|
57
91
|
# new rule expression with the parameters
|
58
92
|
def set_params(params)
|
59
|
-
return self.class.new(@package, @name, params)
|
93
|
+
return self.class.new(@package, @name, params, @input_ticket_expr, @output_ticket_expr)
|
60
94
|
end
|
61
95
|
|
62
96
|
# Evaluates the object with the variable table.
|
@@ -68,7 +102,9 @@ module Pione::Model
|
|
68
102
|
return self.class.new(
|
69
103
|
@package.eval(vtable),
|
70
104
|
@name,
|
71
|
-
@params.eval(vtable)
|
105
|
+
@params.eval(vtable),
|
106
|
+
@input_ticket_expr.eval(vtable),
|
107
|
+
@output_ticket_expr.eval(vtable)
|
72
108
|
)
|
73
109
|
end
|
74
110
|
|
@@ -76,7 +112,11 @@ module Pione::Model
|
|
76
112
|
# @return [Boolean]
|
77
113
|
# true if the package or parameters include variables
|
78
114
|
def include_variable?
|
79
|
-
@package.include_variable
|
115
|
+
[ @package.include_variable?,
|
116
|
+
@params.include_variable?,
|
117
|
+
@input_ticket_expr.include_variable?,
|
118
|
+
@output_ticket_expr.include_variable?
|
119
|
+
].any?
|
80
120
|
end
|
81
121
|
|
82
122
|
# @api private
|
@@ -95,6 +135,80 @@ module Pione::Model
|
|
95
135
|
def hash
|
96
136
|
@package.hash + @name.hash + @params.hash
|
97
137
|
end
|
138
|
+
|
139
|
+
# Return a set that contains self as a single element.
|
140
|
+
#
|
141
|
+
# @return [Set<RuleExpr>]
|
142
|
+
# a set that contains self
|
143
|
+
def to_set
|
144
|
+
Set.new([self])
|
145
|
+
end
|
146
|
+
end
|
147
|
+
|
148
|
+
class CompositionalRuleExpr < RuleExpr
|
149
|
+
# Create a new compositional rule expression. This consists from left and
|
150
|
+
# right child expressions.
|
151
|
+
#
|
152
|
+
# @param left [RuleExpr]
|
153
|
+
# left expression
|
154
|
+
# @param right [RuleExpr]
|
155
|
+
# right expression
|
156
|
+
def initialize(left, right)
|
157
|
+
@left = left
|
158
|
+
@right = right
|
159
|
+
end
|
160
|
+
|
161
|
+
# Create a new compositioanl rule expression with adding the ticket
|
162
|
+
# expression as input condition of left expression.
|
163
|
+
#
|
164
|
+
# @param ticket_expr [TicketExpr]
|
165
|
+
# ticket expression as additional input condition
|
166
|
+
# @return [CompositionalRuleExpr]
|
167
|
+
# new rule expression
|
168
|
+
def add_input_ticket_expr(ticket_expr)
|
169
|
+
return self.class.new(@left.add_input_ticket_expr(ticket_expr), @right)
|
170
|
+
end
|
171
|
+
|
172
|
+
# Create a new compositional rule expression with adding the ticket
|
173
|
+
# expression as output condition of right expression.
|
174
|
+
#
|
175
|
+
# @param ticket_expr [TicketExpr]
|
176
|
+
# ticket expression as additional output condition
|
177
|
+
# @return [CompositionalRuleExpr]
|
178
|
+
# new rule expression
|
179
|
+
def add_output_ticket_expr(ticket_expr)
|
180
|
+
return self.class.new(@left, @right.add_output_ticket_expr(ticket_expr))
|
181
|
+
end
|
182
|
+
|
183
|
+
# Evaluates left and right expressions with the variable table.
|
184
|
+
#
|
185
|
+
# @param [VariableTable] vtable
|
186
|
+
# variable table for evaluation
|
187
|
+
# @return [CompositionalRuleExpr]
|
188
|
+
# evaluation result
|
189
|
+
def eval(vtable)
|
190
|
+
return self.class.new(@left.eval(vtable), @right.eval(vtable))
|
191
|
+
end
|
192
|
+
|
193
|
+
# @api private
|
194
|
+
def ==(other)
|
195
|
+
return false unless other.kind_of?(self.class)
|
196
|
+
return to_set == other.to_set
|
197
|
+
end
|
198
|
+
alias :eql? :"=="
|
199
|
+
|
200
|
+
# @api private
|
201
|
+
def hash
|
202
|
+
@left.hash + @right.hash
|
203
|
+
end
|
204
|
+
|
205
|
+
# Return a set that contains all rule expressions of left and right.
|
206
|
+
#
|
207
|
+
# @return [Set<RuleExpr>]
|
208
|
+
# a set that contains all rule expressions of left and right
|
209
|
+
def to_set
|
210
|
+
@left.to_set + @right.to_set
|
211
|
+
end
|
98
212
|
end
|
99
213
|
|
100
214
|
TypeRuleExpr.instance_eval do
|
@@ -116,5 +230,16 @@ module Pione::Model
|
|
116
230
|
define_pione_method("as_string", [], TypeString) do |rec|
|
117
231
|
PioneString.new(rec.name)
|
118
232
|
end
|
233
|
+
|
234
|
+
define_pione_method("==>", [TypeTicketExpr], TypeRuleExpr) do |rec, ticket_expr|
|
235
|
+
rec.add_output_ticket_expr(ticket_expr)
|
236
|
+
end
|
237
|
+
|
238
|
+
define_pione_method(">>>", [TypeRuleExpr], TypeRuleExpr) do |rec, other|
|
239
|
+
ticket_expr = TicketExpr.new([rec.path])
|
240
|
+
left = rec.add_output_ticket_expr(ticket_expr)
|
241
|
+
right = other.add_input_ticket_expr(ticket_expr)
|
242
|
+
CompositionalRuleExpr.new(left, right)
|
243
|
+
end
|
119
244
|
end
|
120
245
|
end
|
data/lib/pione/model/rule.rb
CHANGED
@@ -1,53 +1,79 @@
|
|
1
1
|
module Pione::Model
|
2
2
|
# RuleCondition represents rule condition.
|
3
3
|
class RuleCondition < BasicModel
|
4
|
-
#
|
4
|
+
# the value of attribute inputs
|
5
|
+
#
|
5
6
|
# @return [Array<DataExpr, Array<DataExpr>>]
|
6
7
|
# rule inputs condition
|
7
8
|
attr_reader :inputs
|
8
9
|
|
9
|
-
#
|
10
|
+
# the value of attribute outputs
|
11
|
+
#
|
10
12
|
# @return [Array<DataExpr, Array<DataExpr>>]
|
11
|
-
#
|
13
|
+
# rule outputs condition
|
12
14
|
attr_reader :outputs
|
13
15
|
|
14
|
-
#
|
16
|
+
# the value of attribute params
|
17
|
+
#
|
15
18
|
# @return [Parameters]
|
16
19
|
# rule parameters table
|
17
20
|
attr_reader :params
|
18
21
|
|
19
|
-
#
|
22
|
+
# the value of attribute features
|
23
|
+
#
|
20
24
|
# @return [Feature]
|
21
25
|
# rule feature condition
|
22
26
|
attr_reader :features
|
23
27
|
|
24
|
-
#
|
25
|
-
#
|
28
|
+
# input ticket expression
|
29
|
+
#
|
30
|
+
# @return [TicketExpr]
|
31
|
+
# input ticket expression
|
32
|
+
attr_reader :input_ticket_expr
|
33
|
+
|
34
|
+
# output ticket expression
|
35
|
+
#
|
36
|
+
# @return [TicketExpr]
|
37
|
+
# output ticket
|
38
|
+
attr_reader :output_ticket_expr
|
39
|
+
|
40
|
+
# Create a rule condition.
|
41
|
+
#
|
42
|
+
# @param inputs [Array<DataExpr, Array<DataExpr>>]
|
26
43
|
# rule inputs
|
27
|
-
# @param [Array<DataExpr, Array<DataExpr>>]
|
44
|
+
# @param outputs [Array<DataExpr, Array<DataExpr>>]
|
28
45
|
# rule outputs
|
29
|
-
# @param [Parameters]
|
46
|
+
# @param params [Parameters]
|
30
47
|
# rule parameters
|
31
|
-
# @param [Feature]
|
48
|
+
# @param features [Feature]
|
32
49
|
# rule features
|
33
|
-
|
50
|
+
# @param input_ticket_expr [TicketExpr]
|
51
|
+
# input ticket expression
|
52
|
+
# @param output_ticket_expr [TicketExpr]
|
53
|
+
# output ticket expression
|
54
|
+
def initialize(inputs, outputs, params, features, input_ticket_expr, output_ticket_expr)
|
34
55
|
check_argument_type(params, Parameters)
|
35
56
|
check_argument_type(features, Feature::Expr)
|
36
57
|
@inputs = inputs
|
37
58
|
@outputs = outputs
|
38
59
|
@params = params
|
39
60
|
@features = features
|
61
|
+
@input_ticket_expr = input_ticket_expr
|
62
|
+
@output_ticket_expr = output_ticket_expr
|
40
63
|
super()
|
41
64
|
end
|
42
65
|
|
43
|
-
#
|
66
|
+
# Return true if the condition includes variable.
|
67
|
+
#
|
44
68
|
# @return [Boolean]
|
45
69
|
# true if the condition includes variable, or false
|
46
70
|
def include_variable?
|
47
71
|
[ @inputs.any? {|input| input.include_variable?},
|
48
72
|
@outputs.any? {|output| output.include_variable?},
|
49
73
|
@params.include_variable?,
|
50
|
-
@features.include_variable
|
74
|
+
@features.include_variable?,
|
75
|
+
@input_tickets.any? {|ticket| ticket.include_variable?},
|
76
|
+
@output_tickets.any? {|ticket| ticket.include_variable?}
|
51
77
|
].any?
|
52
78
|
end
|
53
79
|
|
@@ -60,6 +86,7 @@ module Pione::Model
|
|
60
86
|
return true
|
61
87
|
end
|
62
88
|
|
89
|
+
# @api private
|
63
90
|
alias :eql? :"=="
|
64
91
|
|
65
92
|
# @api private
|
@@ -86,6 +113,7 @@ module Pione::Model
|
|
86
113
|
attr_reader :body
|
87
114
|
|
88
115
|
def_delegators :@condition, :inputs, :outputs, :params, :features
|
116
|
+
def_delegators :@condition, :input_ticket_expr, :output_ticket_expr
|
89
117
|
|
90
118
|
# Creates a rule.
|
91
119
|
# @param [RuleExpr] expr
|
@@ -211,7 +239,7 @@ module Pione::Model
|
|
211
239
|
@params = params
|
212
240
|
condition = make_condition
|
213
241
|
super(
|
214
|
-
RuleExpr.new(Package.new("root"), "Root"),
|
242
|
+
RuleExpr.new(Package.new("root"), "Root", Parameters.empty, TicketExpr.empty, TicketExpr.empty),
|
215
243
|
condition,
|
216
244
|
FlowBlock.new(CallRule.new(@main.expr.set_params(@params)))
|
217
245
|
)
|
@@ -244,7 +272,9 @@ module Pione::Model
|
|
244
272
|
@main.inputs,
|
245
273
|
@main.outputs,
|
246
274
|
Parameters.empty,
|
247
|
-
Feature.empty
|
275
|
+
Feature.empty,
|
276
|
+
TicketExpr.empty,
|
277
|
+
TicketExpr.empty
|
248
278
|
)
|
249
279
|
end
|
250
280
|
|
@@ -263,7 +293,13 @@ module Pione::Model
|
|
263
293
|
# @param [Proc] b
|
264
294
|
# rule process
|
265
295
|
def initialize(name, &b)
|
266
|
-
expr = RuleExpr.new(
|
296
|
+
expr = RuleExpr.new(
|
297
|
+
Package.new('system'),
|
298
|
+
name,
|
299
|
+
Parameters.empty,
|
300
|
+
TicketExpr.empty,
|
301
|
+
TicketExpr.empty
|
302
|
+
)
|
267
303
|
condition = make_condition
|
268
304
|
super(expr, condition, b)
|
269
305
|
end
|
@@ -273,7 +309,7 @@ module Pione::Model
|
|
273
309
|
# @api private
|
274
310
|
def make_condition
|
275
311
|
inputs = [DataExpr.new('*')]
|
276
|
-
RuleCondition.new(inputs, [], Parameters.empty, Feature::EmptyFeature.new)
|
312
|
+
RuleCondition.new(inputs, [], Parameters.empty, Feature::EmptyFeature.new, TicketExpr.empty, TicketExpr.empty)
|
277
313
|
end
|
278
314
|
|
279
315
|
# @api private
|
@@ -0,0 +1,124 @@
|
|
1
|
+
module Pione
|
2
|
+
module Model
|
3
|
+
# TicketExpr is a ticket expression as alternative input or output
|
4
|
+
# conditions of rules for sequential process. An object of this class
|
5
|
+
# represents a set of ticket conditions.
|
6
|
+
#
|
7
|
+
# @example Sequencial process of rule A and B by tickets in PIONE flow rule
|
8
|
+
# Rule Main
|
9
|
+
# input '*.in'
|
10
|
+
# output '*.out'
|
11
|
+
# Flow
|
12
|
+
# rule A ==> <T>
|
13
|
+
# <T> ==> rule B
|
14
|
+
# End
|
15
|
+
# @example TicketExpr represents a set
|
16
|
+
# TicketExpr.new("T1") + TicketExpr.new("T2") #=> TicketExpr.new(["T1", "T2"])
|
17
|
+
class TicketExpr < BasicModel
|
18
|
+
set_pione_model_type TypeTicketExpr
|
19
|
+
|
20
|
+
class << self
|
21
|
+
# Return an emtpy ticket expression. Empty ticket expression has no
|
22
|
+
# ticket conditions.
|
23
|
+
def empty
|
24
|
+
self.new(Set.new)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
# ticket names
|
29
|
+
attr_reader :names
|
30
|
+
|
31
|
+
# Create a ticket expression with names.
|
32
|
+
#
|
33
|
+
# @param names [Set, Array]
|
34
|
+
# ticket names
|
35
|
+
#
|
36
|
+
# @example
|
37
|
+
# TicketExpr.new(["T1", "T2"])
|
38
|
+
# @example
|
39
|
+
# TicketExpr.new(Set.new(["T1", "T2"]))
|
40
|
+
def initialize(names)
|
41
|
+
@names = Set.new(names)
|
42
|
+
super()
|
43
|
+
end
|
44
|
+
|
45
|
+
# Return true if the ticket expression is empty.
|
46
|
+
def empty?
|
47
|
+
@names.empty?
|
48
|
+
end
|
49
|
+
|
50
|
+
# Evaluate the object with the variable table.
|
51
|
+
#
|
52
|
+
# @param vtable [VariableTable]
|
53
|
+
# variable table for evaluation
|
54
|
+
# @return [BasicModel]
|
55
|
+
# evaluation result
|
56
|
+
def eval(vtable)
|
57
|
+
self
|
58
|
+
end
|
59
|
+
|
60
|
+
# Return true if the value includes variables.
|
61
|
+
#
|
62
|
+
# @return [Boolean]
|
63
|
+
# true if the value includes variables
|
64
|
+
def include_variable?
|
65
|
+
false
|
66
|
+
end
|
67
|
+
|
68
|
+
# Composite ticket expressions between this and another.
|
69
|
+
#
|
70
|
+
# @param other [TicketExpr]
|
71
|
+
# another ticket expression
|
72
|
+
# @return [TicketExpr]
|
73
|
+
# compositional ticket expression
|
74
|
+
def +(other)
|
75
|
+
raise ArgumentError.new(other) unless other.kind_of?(TicketExpr)
|
76
|
+
self == other ? self : TicketExpr.new(@names + other.names)
|
77
|
+
end
|
78
|
+
|
79
|
+
# @api private
|
80
|
+
def task_id_string
|
81
|
+
"TicketExpr<#{@names}>"
|
82
|
+
end
|
83
|
+
|
84
|
+
# @api private
|
85
|
+
def textize
|
86
|
+
"<%s>" % [@names]
|
87
|
+
end
|
88
|
+
|
89
|
+
# @api private
|
90
|
+
def ==(other)
|
91
|
+
return false unless other.kind_of?(self.class)
|
92
|
+
@names == other.names
|
93
|
+
end
|
94
|
+
alias :eql? :"=="
|
95
|
+
|
96
|
+
# @api private
|
97
|
+
def hash
|
98
|
+
@names.hash
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
TypeTicketExpr.instance_eval do
|
103
|
+
define_pione_method("==", [TypeTicketExpr], TypeBoolean) do |rec, other|
|
104
|
+
PioneBoolean.new(rec.names == other.names)
|
105
|
+
end
|
106
|
+
|
107
|
+
define_pione_method("!=", [TypeTicketExpr], TypeBoolean) do |rec, other|
|
108
|
+
PioneBoolean.not(rec.call_pione_method("==", other))
|
109
|
+
end
|
110
|
+
|
111
|
+
define_pione_method("==>", [TypeRuleExpr], TypeRuleExpr) do |rec, other|
|
112
|
+
other.add_input_ticket_expr(rec)
|
113
|
+
end
|
114
|
+
|
115
|
+
define_pione_method("+", [TypeTicketExpr], TypeTicketExpr) do |rec, other|
|
116
|
+
rec + other
|
117
|
+
end
|
118
|
+
|
119
|
+
define_pione_method("as_string", [], TypeString) do |rec|
|
120
|
+
rec.textize
|
121
|
+
end
|
122
|
+
end
|
123
|
+
end
|
124
|
+
end
|