pione 0.1.0 → 0.1.1
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 +13 -0
- data/Rakefile +3 -3
- data/example/DeferredChoice/DeferredChoice.pione +50 -0
- data/example/Fib/Fib.pione +17 -16
- data/example/SingleParticlesWithRef/SingleParticlesWithRef.Display2.pione +128 -0
- data/lib/pione.rb +1 -0
- data/lib/pione/agent/broker.rb +18 -4
- data/lib/pione/agent/task-worker.rb +19 -21
- data/lib/pione/command-option/task-worker-owner-option.rb +1 -1
- data/lib/pione/command/basic-command.rb +13 -8
- data/lib/pione/command/front-owner-command.rb +1 -1
- data/lib/pione/command/pione-broker.rb +2 -1
- data/lib/pione/command/pione-client.rb +41 -2
- data/lib/pione/command/pione-syntax-checker.rb +14 -3
- data/lib/pione/command/pione-task-worker.rb +4 -1
- data/lib/pione/command/pione-tuple-space-provider.rb +6 -7
- data/lib/pione/model/assignment.rb +6 -0
- data/lib/pione/model/message.rb +7 -3
- data/lib/pione/model/variable.rb +11 -0
- data/lib/pione/parser/common-parser.rb +36 -14
- data/lib/pione/parser/document-parser.rb +82 -5
- data/lib/pione/parser/rule-definition-parser.rb +2 -30
- data/lib/pione/system/config.rb +54 -6
- data/lib/pione/system/document.rb +13 -4
- data/lib/pione/system/global.rb +8 -8
- data/lib/pione/system/init.rb +3 -0
- data/lib/pione/transformer/document-transformer.rb +5 -1
- data/lib/pione/transformer/rule-definition-transformer.rb +8 -14
- data/lib/pione/tuple-space/tuple-space-receiver.rb +1 -1
- data/lib/pione/version.rb +2 -1
- data/pione.gemspec +2 -0
- data/test/parser/spec_document-parser.rb +5 -0
- data/test/parser/spec_document-parser.yml +62 -0
- data/test/{spec_document.rb → system/spec_document.rb} +22 -2
- data/test/test-util.rb +3 -3
- data/test/transformer/spec_rule-definition-transformer.rb +68 -73
- metadata +46 -5
- data/example/Fib/FibBC.pione +0 -56
@@ -73,6 +73,11 @@ module Pione
|
|
73
73
|
@name = name
|
74
74
|
end
|
75
75
|
|
76
|
+
# --list-parameters
|
77
|
+
define_option('--list-params', 'show user parameter list in the document') do
|
78
|
+
@list_params = true
|
79
|
+
end
|
80
|
+
|
76
81
|
attr_reader :tuple_space_server
|
77
82
|
attr_reader :name
|
78
83
|
|
@@ -91,6 +96,8 @@ module Pione
|
|
91
96
|
@relay = nil
|
92
97
|
@filename = "-"
|
93
98
|
@without_tuple_space_provider = false
|
99
|
+
@features = "^Interactive"
|
100
|
+
@list_params = false
|
94
101
|
end
|
95
102
|
|
96
103
|
private
|
@@ -172,10 +179,24 @@ module Pione
|
|
172
179
|
|
173
180
|
def start
|
174
181
|
read_process_document
|
182
|
+
|
183
|
+
if @list_params
|
184
|
+
print_parameter_list
|
185
|
+
exit
|
186
|
+
end
|
187
|
+
|
175
188
|
write_tuples
|
176
189
|
connect_relay if @relay
|
177
190
|
start_agents
|
178
|
-
|
191
|
+
|
192
|
+
# start tuple space provider with thread
|
193
|
+
# the thread is terminated when the client terminated
|
194
|
+
unless @without_tuple_space_provider
|
195
|
+
@start_tuple_space_provider_thread = Thread.new do
|
196
|
+
start_tuple_space_provider
|
197
|
+
end
|
198
|
+
end
|
199
|
+
|
179
200
|
start_workers
|
180
201
|
@agent = Agent[:process_manager].start(@tuple_space_server, @document, @params, @stream)
|
181
202
|
@agent.running_thread.join
|
@@ -183,6 +204,14 @@ module Pione
|
|
183
204
|
end
|
184
205
|
|
185
206
|
def terminate
|
207
|
+
# kill the thread for starting tuple space provider
|
208
|
+
if @start_tuple_space_provider_thread
|
209
|
+
if @start_tuple_space_provider_thread.alive?
|
210
|
+
@start_tuple_space_provider_thread.kill
|
211
|
+
end
|
212
|
+
end
|
213
|
+
|
214
|
+
# terminate tuple space provider
|
186
215
|
if @tuple_space_provider
|
187
216
|
@tuple_space_provider.terminate
|
188
217
|
end
|
@@ -244,7 +273,7 @@ module Pione
|
|
244
273
|
|
245
274
|
def start_workers
|
246
275
|
@task_worker.times do
|
247
|
-
Agent[:task_worker].spawn(Global.front, Util.generate_uuid, @features)
|
276
|
+
Thread.new { Agent[:task_worker].spawn(Global.front, Util.generate_uuid, @features) }
|
248
277
|
end
|
249
278
|
end
|
250
279
|
|
@@ -268,6 +297,16 @@ module Pione
|
|
268
297
|
rescue Relay::RelaySocket::AuthError
|
269
298
|
abort("You failed authentication to connect the relay server: %s" % @relay_ref.__drburi)
|
270
299
|
end
|
300
|
+
|
301
|
+
# Print parameter list of the document.
|
302
|
+
#
|
303
|
+
# @return [void]
|
304
|
+
def print_parameter_list
|
305
|
+
puts "Parameters:"
|
306
|
+
@document.params.data.select{|var, val| var.user_param}.each do |var, val|
|
307
|
+
puts " %s := %s" % [var.name, val.textize]
|
308
|
+
end
|
309
|
+
end
|
271
310
|
end
|
272
311
|
end
|
273
312
|
end
|
@@ -30,16 +30,27 @@ TXT
|
|
30
30
|
if @readline_mode
|
31
31
|
require 'readline'
|
32
32
|
restore_history
|
33
|
+
buf = ""
|
34
|
+
mark = ">"
|
33
35
|
|
34
36
|
# start loop
|
35
|
-
while buf
|
37
|
+
while buf += Readline.readline(Terminal.red("#{mark} "), true)
|
36
38
|
if /[^\s]/.match(buf)
|
37
39
|
# don't record if previous line is the same
|
38
40
|
if Readline::HISTORY.size > 1 && Readline::HISTORY[-2] == buf
|
39
41
|
Readline::HISTORY.pop
|
40
42
|
end
|
41
|
-
|
42
|
-
|
43
|
+
if buf[-1] == "\\"
|
44
|
+
buf[-1] = "\n"
|
45
|
+
mark = "+"
|
46
|
+
next
|
47
|
+
else
|
48
|
+
# print parsing result
|
49
|
+
puts buf
|
50
|
+
print_result(buf)
|
51
|
+
buf = ""
|
52
|
+
mark = ">"
|
53
|
+
end
|
43
54
|
else
|
44
55
|
# don't record if it is an empty line
|
45
56
|
Readline::HISTORY.pop
|
@@ -56,7 +56,10 @@ TXT
|
|
56
56
|
begin
|
57
57
|
@parent_front.uuid
|
58
58
|
rescue => e
|
59
|
-
|
59
|
+
if Pione.debug_mode?
|
60
|
+
debug_message "pione-task-worker cannot get the parent front server: %s" % e
|
61
|
+
end
|
62
|
+
abort
|
60
63
|
end
|
61
64
|
end
|
62
65
|
|
@@ -61,13 +61,13 @@ TXT
|
|
61
61
|
# start provider activity
|
62
62
|
@tuple_space_provider.start
|
63
63
|
|
64
|
-
# set my URI to caller front as its provider
|
65
|
-
unless @no_parent_mode
|
66
|
-
@parent_front.set_tuple_space_provider(Global.front.uri)
|
67
|
-
end
|
68
|
-
|
69
|
-
# wait
|
70
64
|
begin
|
65
|
+
# set my URI to caller front as its provider
|
66
|
+
unless @no_parent_mode
|
67
|
+
@parent_front.set_tuple_space_provider(Global.front.uri)
|
68
|
+
end
|
69
|
+
|
70
|
+
# wait
|
71
71
|
DRb.thread.join
|
72
72
|
rescue DRb::DRbConnError, DRb::ReplyReaderThreadError
|
73
73
|
terminate
|
@@ -76,7 +76,6 @@ TXT
|
|
76
76
|
|
77
77
|
# @api private
|
78
78
|
def terminate
|
79
|
-
puts "terminate %s" % program_name
|
80
79
|
@tuple_space_provider.terminate
|
81
80
|
super
|
82
81
|
rescue DRb::DRbConnError, DRb::ReplyReaderThreadError
|
@@ -41,10 +41,16 @@ module Pione::Model
|
|
41
41
|
vtable.set(@variable, @expr)
|
42
42
|
end
|
43
43
|
|
44
|
+
# Set truth of toplevel assignment.
|
44
45
|
def set_toplevel(b)
|
45
46
|
@variable.set_toplevel(b)
|
46
47
|
end
|
47
48
|
|
49
|
+
# Set truth of user parameter.
|
50
|
+
def set_user_param(b)
|
51
|
+
@variable.set_user_param(b)
|
52
|
+
end
|
53
|
+
|
48
54
|
# Returns true if the assignment is defined in toplevel.
|
49
55
|
# @return [Boolean]
|
50
56
|
# true if the assignment is defined in toplevel
|
data/lib/pione/model/message.rb
CHANGED
@@ -30,12 +30,16 @@ module Pione::Model
|
|
30
30
|
false
|
31
31
|
end
|
32
32
|
|
33
|
-
#
|
34
|
-
#
|
33
|
+
# Return PIONE model type of the message result according to type interface.
|
34
|
+
#
|
35
35
|
# @return [Symbol]
|
36
36
|
# PIONE model type
|
37
37
|
def pione_model_type
|
38
|
-
@receiver.pione_model_type.method_interface[@name.to_s]
|
38
|
+
if interface = @receiver.pione_model_type.method_interface[@name.to_s]
|
39
|
+
interface.output
|
40
|
+
else
|
41
|
+
raise MethodNotFound.new(@name.to_s, self)
|
42
|
+
end
|
39
43
|
end
|
40
44
|
|
41
45
|
# Evaluates the application expression and returns application result.
|
data/lib/pione/model/variable.rb
CHANGED
@@ -6,11 +6,16 @@ module Pione::Model
|
|
6
6
|
|
7
7
|
attr_reader :name
|
8
8
|
|
9
|
+
# true if the variable is user parameter
|
10
|
+
attr_reader :user_param
|
11
|
+
|
9
12
|
# Creates a variable with name.
|
10
13
|
# @param [String] name
|
11
14
|
# variable name
|
12
15
|
def initialize(name)
|
13
16
|
@name = name.to_s
|
17
|
+
@toplevel = nil
|
18
|
+
@user_param = nil
|
14
19
|
super()
|
15
20
|
end
|
16
21
|
|
@@ -33,10 +38,16 @@ module Pione::Model
|
|
33
38
|
true
|
34
39
|
end
|
35
40
|
|
41
|
+
# Set truth of toplevel variable.
|
36
42
|
def set_toplevel(b)
|
37
43
|
@toplevel = b
|
38
44
|
end
|
39
45
|
|
46
|
+
# Set truth of user parameter.
|
47
|
+
def set_user_param(b)
|
48
|
+
@user_param = b
|
49
|
+
end
|
50
|
+
|
40
51
|
# Returns true if the variable is defined in toplevel.
|
41
52
|
# @return [Boolean]
|
42
53
|
# true if the variable is defined in toplevel
|
@@ -65,6 +65,7 @@ module Pione
|
|
65
65
|
:keyword_input => 'input',
|
66
66
|
:keyword_output => 'output',
|
67
67
|
:keyword_param => 'param',
|
68
|
+
:keyword_Param => 'Param',
|
68
69
|
:keyword_feature => 'feature',
|
69
70
|
:keyword_rule => 'rule',
|
70
71
|
:keyword_if => 'if',
|
@@ -102,24 +103,45 @@ module Pione
|
|
102
103
|
# @return [Parslet::Atoms::Entity] +digit+ atom
|
103
104
|
rule(:digit) { match('[0-9]') }
|
104
105
|
|
105
|
-
# @!
|
106
|
-
#
|
107
|
-
#
|
108
|
-
|
106
|
+
# @!method space
|
107
|
+
#
|
108
|
+
# Return +space+ parser. +space+ matches sequences of space character,
|
109
|
+
# tab, or comment.
|
110
|
+
#
|
111
|
+
# @return [Parslet::Atoms::Entity] +space+ atom
|
112
|
+
rule(:space) {
|
113
|
+
( match("[ \t]") |
|
114
|
+
str("#") >> ((str("\n") | any.absent?).absent? >> any).repeat
|
115
|
+
).repeat(1)
|
116
|
+
}
|
109
117
|
|
110
|
-
# @!
|
111
|
-
#
|
112
|
-
#
|
118
|
+
# @!method space?
|
119
|
+
#
|
120
|
+
# Return +space?+ parser. +space?+ matches +space+ or empty.
|
121
|
+
#
|
122
|
+
# @return [Parslet::Atoms::Entity]
|
123
|
+
# +space?+ parser
|
113
124
|
rule(:space?) { space.maybe }
|
114
125
|
|
115
|
-
# @!
|
116
|
-
#
|
117
|
-
#
|
118
|
-
|
126
|
+
# @!method pad
|
127
|
+
#
|
128
|
+
# Return +pad+ parser. +pad+ matches sequences of space character, tab,
|
129
|
+
# newline, or comment.
|
130
|
+
#
|
131
|
+
# @return [Parslet::Atoms::Entity]
|
132
|
+
# +pad+ parser
|
133
|
+
rule(:pad) {
|
134
|
+
( match("[ \t\n]") |
|
135
|
+
str("#") >> ((str("\n") | any.absent?).absent? >> any).repeat
|
136
|
+
).repeat(1)
|
137
|
+
}
|
119
138
|
|
120
|
-
# @!
|
121
|
-
#
|
122
|
-
#
|
139
|
+
# @!method pad?
|
140
|
+
#
|
141
|
+
# Return +pad?+ parser. +pad?+ matches +pad+ or empty.
|
142
|
+
#
|
143
|
+
# @return [Parslet::Atoms::Entity]
|
144
|
+
# +pad?+ parser
|
123
145
|
rule(:pad?) { pad.maybe }
|
124
146
|
|
125
147
|
# @!attribute [r] line_end
|
@@ -10,15 +10,54 @@ module Pione
|
|
10
10
|
include BlockParser
|
11
11
|
include RuleDefinitionParser
|
12
12
|
|
13
|
-
def parse(str)
|
14
|
-
super(str.gsub(/^(?!#!)#.*/, ""))
|
15
|
-
end
|
16
|
-
|
17
13
|
#
|
18
14
|
# root
|
19
15
|
#
|
20
16
|
|
21
|
-
root(:
|
17
|
+
root(:toplevel_elements)
|
18
|
+
|
19
|
+
# @!method toplevel_elements
|
20
|
+
#
|
21
|
+
# Return +toplevel_elements+ parser. This is root parser for reading a
|
22
|
+
# document.
|
23
|
+
#
|
24
|
+
# @return [Parslet::Atoms::Entity]
|
25
|
+
# +toplevel_elements+ parser
|
26
|
+
rule(:toplevel_elements) {
|
27
|
+
(empty_lines? >> space? >> toplevel_element >> empty_lines?).repeat
|
28
|
+
}
|
29
|
+
|
30
|
+
# @!method toplevel_element
|
31
|
+
#
|
32
|
+
# Return +toplevel_element+ parser.
|
33
|
+
#
|
34
|
+
# @return [Parslet::Atoms::Entity]
|
35
|
+
# +toplevel_element+ parser
|
36
|
+
#
|
37
|
+
# @example
|
38
|
+
# # document toplevel assignment
|
39
|
+
# DocumentParser.toplevel_element.parse("$X := 1")
|
40
|
+
# @example
|
41
|
+
# # define rule
|
42
|
+
# DocumentParser.new.toplevel_element.parse <<TXT
|
43
|
+
# Rule Main
|
44
|
+
# input '*.txt'
|
45
|
+
# ...
|
46
|
+
# Flow
|
47
|
+
# rule SubRule
|
48
|
+
# ...
|
49
|
+
# End
|
50
|
+
# TXT
|
51
|
+
# @example
|
52
|
+
# # you can write any expressions in toplevel but it is ignored
|
53
|
+
# DocumentParser.new.toplevel_element.parse("1 + 1")
|
54
|
+
rule(:toplevel_element) {
|
55
|
+
rule_definition |
|
56
|
+
param_block |
|
57
|
+
param_line |
|
58
|
+
assignment_line |
|
59
|
+
expr
|
60
|
+
}
|
22
61
|
|
23
62
|
#
|
24
63
|
# document statement
|
@@ -34,6 +73,44 @@ module Pione
|
|
34
73
|
require_line
|
35
74
|
}
|
36
75
|
|
76
|
+
# @!method assignment_line
|
77
|
+
#
|
78
|
+
# Return +assignment_line+ parser.
|
79
|
+
#
|
80
|
+
# @return [Parslet::Atoms::Entity]
|
81
|
+
# +assignment_line+ parser
|
82
|
+
#
|
83
|
+
# @example
|
84
|
+
# DocumentParser.new.assignment_line("$X := 1")
|
85
|
+
rule(:assignment_line) {
|
86
|
+
space? >> assignment >> line_end
|
87
|
+
}
|
88
|
+
|
89
|
+
# @!method param_block
|
90
|
+
#
|
91
|
+
# Return +param_block+ parser.
|
92
|
+
#
|
93
|
+
# @return [Parslet::Atoms::Entity]
|
94
|
+
# +param block+ parser
|
95
|
+
#
|
96
|
+
# @example
|
97
|
+
# DocumentParser.new.param_block <<TXT
|
98
|
+
# Param
|
99
|
+
# $X := 1
|
100
|
+
# $Y := 2
|
101
|
+
# $Z := 3
|
102
|
+
# End
|
103
|
+
# TXT
|
104
|
+
rule(:param_block) {
|
105
|
+
( space? >>
|
106
|
+
keyword_Param >>
|
107
|
+
line_end >>
|
108
|
+
(assignment_line | pad).repeat >>
|
109
|
+
(keyword_End | syntax_error("it should be block end", :keyword_End)) >>
|
110
|
+
line_end
|
111
|
+
).as(:param_block)
|
112
|
+
}
|
113
|
+
|
37
114
|
# package_line
|
38
115
|
rule(:package_line) {
|
39
116
|
( space? >>
|
@@ -10,35 +10,6 @@ module Pione
|
|
10
10
|
include FlowElementParser
|
11
11
|
include BlockParser
|
12
12
|
|
13
|
-
# @!attribute [r] rule_definitions
|
14
|
-
# @return [Parslet::Atoms::Entity] toplevel element list
|
15
|
-
rule(:rule_definitions) {
|
16
|
-
(empty_lines? >> space? >> toplevel_element >> empty_lines?).repeat
|
17
|
-
}
|
18
|
-
|
19
|
-
# @!attribute [r] toplevel_element
|
20
|
-
# @return [Parslet::Atoms::Entity] toplevel element
|
21
|
-
# @example
|
22
|
-
# # document toplevel assignment
|
23
|
-
# $X := 1
|
24
|
-
# @example
|
25
|
-
# # define rule
|
26
|
-
# Rule Main
|
27
|
-
# input '*.txt'
|
28
|
-
# ...
|
29
|
-
# Flow
|
30
|
-
# rule SubRule
|
31
|
-
# ...
|
32
|
-
# End
|
33
|
-
# @example
|
34
|
-
# # you can write any expressions in toplevel but it is ignored
|
35
|
-
# 1 + 1
|
36
|
-
rule(:toplevel_element) {
|
37
|
-
rule_definition |
|
38
|
-
assignment |
|
39
|
-
expr
|
40
|
-
}
|
41
|
-
|
42
13
|
# @!attribute [r] rule_definition
|
43
14
|
# @return [Parslet::Atoms::Entity] rule definition
|
44
15
|
# @example
|
@@ -50,7 +21,8 @@ module Pione
|
|
50
21
|
# ...
|
51
22
|
# End
|
52
23
|
rule(:rule_definition) {
|
53
|
-
(
|
24
|
+
( space? >>
|
25
|
+
rule_header >>
|
54
26
|
rule_conditions >>
|
55
27
|
block.as(:block)
|
56
28
|
).as(:rule_definition)
|