sfp 0.3.18 → 0.3.19
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/VERSION +1 -1
- data/lib/sfp/Sfplib.rb +2 -1
- data/lib/sfp/sas_translator.rb +133 -74
- data/lib/sfp/visitors.rb +6 -2
- metadata +20 -16
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: ca049ea19fd6ff1ee58312bdd03bdefa3358e342
|
4
|
+
data.tar.gz: d6808887e1039d2e75f5360491d9584b5e842cb0
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: be71d391cc8d77de2fec90208d31d232643eebe216e0677eb7641d0cc0ff5d4c8e8bb5fc435cf5f230d884ca8f5964337c760cb757ffa82381098fb736d2ba2f
|
7
|
+
data.tar.gz: b1394aabf249f510ebb843a4228299a4ed1028419e10f86054924a200c3b3507b82a8494e9d14b616664c89666e1745d4777e10d46a341d7a2fb83f3c8eb223c
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.3.
|
1
|
+
0.3.19
|
data/lib/sfp/Sfplib.rb
CHANGED
@@ -218,7 +218,8 @@ end
|
|
218
218
|
Hash.send(:define_method, "ref") {
|
219
219
|
return '$' if not self.has_key?('_parent') or self['_parent'] == nil
|
220
220
|
me = (self.has_key?('_self') ? self['_self'] : '')
|
221
|
-
|
221
|
+
r = self['_parent'].ref
|
222
|
+
r << ".#{me}"
|
222
223
|
}
|
223
224
|
|
224
225
|
# accept method as implementation of Visitor pattern
|
data/lib/sfp/sas_translator.rb
CHANGED
@@ -144,7 +144,8 @@ module Sfp
|
|
144
144
|
@root['sometime'].accept(value_collector) if @root.has_key?('sometime')
|
145
145
|
|
146
146
|
# remove duplicates from type's set of value
|
147
|
-
|
147
|
+
#@types.each_value { |values| values.uniq! }
|
148
|
+
@types.keys.each { |type| @types[type] = to_set(@types[type]) }
|
148
149
|
|
149
150
|
# set domain values for each variable
|
150
151
|
self.set_variable_values
|
@@ -185,7 +186,7 @@ module Sfp
|
|
185
186
|
@types[var.type] << var.goal
|
186
187
|
end
|
187
188
|
end
|
188
|
-
@types.
|
189
|
+
@types.keys.each { |type| @types[type] = to_set(@types[type]) }
|
189
190
|
|
190
191
|
# add Sfp::Unknown and Sfp::Undefined value to all non-final variables
|
191
192
|
self.add_unknown_undefined_value_to_variables
|
@@ -221,6 +222,10 @@ module Sfp
|
|
221
222
|
end
|
222
223
|
end
|
223
224
|
|
225
|
+
def to_set(array)
|
226
|
+
array.inject([]) { |result,item| result << item unless result.include?(item); result }
|
227
|
+
end
|
228
|
+
|
224
229
|
def variable_name_and_value(var_id, value_index)
|
225
230
|
i = @vars.index { |v| v.id == var_id }
|
226
231
|
var = @vars[i]
|
@@ -629,67 +634,65 @@ module Sfp
|
|
629
634
|
# version
|
630
635
|
out = "begin_version\n3\nend_version\n"
|
631
636
|
# metric
|
632
|
-
out
|
637
|
+
out << "begin_metric\n1\nend_metric\n"
|
638
|
+
|
639
|
+
benchmarks = {}
|
640
|
+
|
641
|
+
vars = {}
|
642
|
+
benchmarks[:conversion] = Benchmark.measure do
|
643
|
+
@variables.each { |k,v| vars[k.to_sym] = v }
|
644
|
+
end
|
645
|
+
names = vars.keys
|
646
|
+
|
633
647
|
# variables
|
634
|
-
|
635
|
-
|
636
|
-
|
637
|
-
|
638
|
-
|
639
|
-
out
|
640
|
-
|
648
|
+
out << "#{names.length}\n"
|
649
|
+
names.sort!
|
650
|
+
names.each_index do |i|
|
651
|
+
var = vars[ names[i] ]
|
652
|
+
var.id = i
|
653
|
+
out << var.to_sas(@root['initial']) + "\n"
|
654
|
+
end
|
655
|
+
|
641
656
|
# mutex
|
642
|
-
out
|
643
|
-
|
644
|
-
|
645
|
-
|
646
|
-
|
647
|
-
|
648
|
-
|
649
|
-
|
650
|
-
|
657
|
+
out << "0\n"
|
658
|
+
|
659
|
+
# initial & goal state
|
660
|
+
out << "begin_state\n"
|
661
|
+
goal = ''
|
662
|
+
goal_count = 0
|
663
|
+
names.each do |name|
|
664
|
+
var = vars[name]
|
665
|
+
if var.init.is_a?(Hash) and var.init.isnull
|
666
|
+
out << "0\n"
|
667
|
+
elsif var.init.is_a?(::Sfp::Unknown)
|
668
|
+
out << "#{var.length - 1}\n"
|
651
669
|
else
|
652
|
-
val =
|
653
|
-
|
654
|
-
|
655
|
-
raise TranslationException,
|
656
|
-
"Unknown init: #{@variables[i].name} = #{@variables[i].init.inspect}"
|
657
|
-
end
|
670
|
+
val = var.index(var.init).to_s
|
671
|
+
raise TranslationException, "Unknown init: #{var.name}=#{var.init.inspect}" if val.length <= 0
|
672
|
+
out << "#{val}\n"
|
658
673
|
end
|
659
|
-
|
660
|
-
|
661
|
-
|
662
|
-
|
663
|
-
count = 0
|
664
|
-
goal = ''
|
665
|
-
variable_index.each { |i|
|
666
|
-
if @variables[i].goal != nil
|
667
|
-
goal += variable_index.index(i).to_s + ' ' +
|
668
|
-
@variables[i].index(@variables[i].goal).to_s + "\n"
|
669
|
-
count += 1
|
674
|
+
|
675
|
+
if var.goal != nil
|
676
|
+
goal << "#{var.id} #{var.index(var.goal)}\n"
|
677
|
+
goal_count += 1
|
670
678
|
end
|
671
|
-
|
672
|
-
out
|
679
|
+
end
|
680
|
+
out << "end_state\nbegin_goal\n#{goal_count}\n#{goal}end_goal\n"
|
681
|
+
|
673
682
|
# operators
|
674
|
-
#out += "#{@operators.length}\n"
|
675
683
|
ops = ''
|
676
684
|
total = 0
|
677
|
-
@operators.each_value
|
678
|
-
next if
|
679
|
-
|
680
|
-
|
681
|
-
|
682
|
-
|
683
|
-
|
684
|
-
|
685
|
-
end
|
686
|
-
}
|
687
|
-
out += "#{total}\n"
|
688
|
-
out += ops
|
689
|
-
# axioms
|
690
|
-
out += "0"
|
685
|
+
@operators.each_value do |operator|
|
686
|
+
next if operator.total_preposts <= 0
|
687
|
+
ops << operator.to_sas2(@root['initial'], vars)
|
688
|
+
ops << "\n"
|
689
|
+
total += 1
|
690
|
+
end
|
691
|
+
out << "#{total}\n"
|
692
|
+
out << ops
|
691
693
|
|
692
|
-
|
694
|
+
# axioms
|
695
|
+
out << "0"
|
693
696
|
end
|
694
697
|
|
695
698
|
def reset_operators_name
|
@@ -1810,24 +1813,29 @@ module Sfp
|
|
1810
1813
|
|
1811
1814
|
def to_s
|
1812
1815
|
s = @name.to_s + '|' + @type.to_s
|
1813
|
-
s
|
1814
|
-
s
|
1815
|
-
s
|
1816
|
-
s
|
1817
|
-
|
1818
|
-
s
|
1819
|
-
|
1816
|
+
s << '|'
|
1817
|
+
s << (@init == nil ? '-' : (@init.is_a?(Hash) ? @init.tostring : @init.to_s))
|
1818
|
+
s << '|'
|
1819
|
+
s << (@goal == nil ? '-' : (@goal.is_a?(Hash) ? @goal.tostring : @goal.to_s))
|
1820
|
+
s << '|'
|
1821
|
+
s << (@is_final ? 'final' : 'notfinal') + "\n"
|
1822
|
+
s << "\t["
|
1823
|
+
self.each { |v| s << (v.is_a?(Hash) ? v.tostring : v.to_s) + ',' }
|
1824
|
+
s = (self.length > 0 ? s.chop : s)
|
1825
|
+
s << "]"
|
1820
1826
|
end
|
1821
1827
|
|
1822
1828
|
# return variable representation in SAS+ format
|
1823
1829
|
def to_sas(root)
|
1824
1830
|
sas = "begin_variable\nvar_#{@id}#{@name}\n#{@layer}\n#{self.length}\n"
|
1825
1831
|
self.each { |v|
|
1826
|
-
|
1832
|
+
if v.is_a?(String) and v.isref
|
1833
|
+
v = root.at?(v)
|
1834
|
+
end
|
1827
1835
|
v = '"' + v + '"' if v.is_a?(String)
|
1828
|
-
sas
|
1836
|
+
sas << (v.is_a?(Hash) ? (v.isnull ? "null\n" : "#{v.ref}\n") : "#{v}\n")
|
1829
1837
|
}
|
1830
|
-
|
1838
|
+
sas << "end_variable"
|
1831
1839
|
end
|
1832
1840
|
|
1833
1841
|
def not(x)
|
@@ -1956,23 +1964,51 @@ module Sfp
|
|
1956
1964
|
end
|
1957
1965
|
}
|
1958
1966
|
sas = "begin_operator\n#{@name}"
|
1959
|
-
@params.each { |k,v| sas
|
1960
|
-
sas
|
1967
|
+
@params.each { |k,v| sas << " #{k}=#{v}" if k != '$.this' } if @params != nil
|
1968
|
+
sas << "\n#{prevail.length}\n"
|
1961
1969
|
prevail.each { |p|
|
1962
1970
|
line = p.to_sas(root, variables)
|
1963
1971
|
raise TranslationException if line[line.length-1] == ' '
|
1964
|
-
sas
|
1972
|
+
sas << "#{line}\n"
|
1965
1973
|
}
|
1966
|
-
sas
|
1974
|
+
sas << "#{prepost.length}\n"
|
1967
1975
|
prepost.each { |p|
|
1968
1976
|
line = p.to_sas(root, variables, false)
|
1969
1977
|
raise TranslationException if line[line.length-1] == ' '
|
1970
|
-
sas
|
1978
|
+
sas << "#{line}\n"
|
1971
1979
|
}
|
1972
|
-
sas
|
1980
|
+
sas << "#{@cost}\nend_operator"
|
1973
1981
|
return sas
|
1974
1982
|
end
|
1975
1983
|
|
1984
|
+
def to_sas2(root, variables)
|
1985
|
+
prevails = self.values.select { |p| p.post.nil? }
|
1986
|
+
preposts = self.values.select { |p| not p.post.nil? }
|
1987
|
+
|
1988
|
+
sas = "begin_operator\n#{@name}"
|
1989
|
+
@params.each do |key,val|
|
1990
|
+
sas << " #{key}=#{val}" if key != '$.this'
|
1991
|
+
end if @params.is_a?(Hash)
|
1992
|
+
|
1993
|
+
sas << "\n#{prevails.length}\n"
|
1994
|
+
prevails.each do |p|
|
1995
|
+
line = p.to_sas2(root, variables)
|
1996
|
+
raise TranslationException if line[-1] == ' '
|
1997
|
+
sas << line
|
1998
|
+
sas << "\n"
|
1999
|
+
end
|
2000
|
+
|
2001
|
+
sas << "#{preposts.length}\n"
|
2002
|
+
preposts.each do |p|
|
2003
|
+
line = p.to_sas2(root, variables, false)
|
2004
|
+
raise TranslationException if line[-1] == ' '
|
2005
|
+
sas << line
|
2006
|
+
sas << "\n"
|
2007
|
+
end
|
2008
|
+
|
2009
|
+
sas << "#{@cost}\nend_operator"
|
2010
|
+
end
|
2011
|
+
|
1976
2012
|
def to_sfw
|
1977
2013
|
if not (@name =~ /.*\$.*/)
|
1978
2014
|
id , name = @name.split('-', 2)
|
@@ -2025,10 +2061,10 @@ module Sfp
|
|
2025
2061
|
raise Exception, "Invalid axiom: total preposts <= 0" if preposts.length <= 0
|
2026
2062
|
|
2027
2063
|
sas = "begin_rule"
|
2028
|
-
sas
|
2029
|
-
prevails.each { |var,param| sas
|
2030
|
-
preposts.each { |var,param| sas
|
2031
|
-
sas
|
2064
|
+
sas << "\n#{prevails.length}"
|
2065
|
+
prevails.each { |var,param| sas << "\n#{param.to_sas(root, variables)}" }
|
2066
|
+
preposts.each { |var,param| sas << "\n#{param.to_sas(root, variables)}" }
|
2067
|
+
sas << "\nend_rule"
|
2032
2068
|
return sas
|
2033
2069
|
end
|
2034
2070
|
end
|
@@ -2073,6 +2109,29 @@ module Sfp
|
|
2073
2109
|
return "0 #{@var.id} #{pre} #{post}"
|
2074
2110
|
end
|
2075
2111
|
|
2112
|
+
def to_sas2(root, variables, is_prevail=true)
|
2113
|
+
### resolve reference
|
2114
|
+
pre = ((@pre.is_a?(String) and @pre.isref) ? variables[@pre.to_sym].init : @pre)
|
2115
|
+
### calculate index
|
2116
|
+
if pre.is_a?(Hash) and pre.isnull
|
2117
|
+
pre = 0
|
2118
|
+
elsif pre.nil?
|
2119
|
+
pre = -1
|
2120
|
+
else
|
2121
|
+
pre = @var.index(pre)
|
2122
|
+
end
|
2123
|
+
return "#{@var.id} #{pre}" if is_prevail
|
2124
|
+
|
2125
|
+
### resolve reference
|
2126
|
+
post = ((@post.is_a?(String) and @post.isref) ? variables[@post.to_sym].init : @post)
|
2127
|
+
### calculate index
|
2128
|
+
if post.is_a?(Hash) and post.isnull
|
2129
|
+
"0 #{@var.id} #{pre} 0"
|
2130
|
+
else
|
2131
|
+
"0 #{@var.id} #{pre} #{@var.index(post)}"
|
2132
|
+
end
|
2133
|
+
end
|
2134
|
+
|
2076
2135
|
def to_s
|
2077
2136
|
return @var.name + ',' +
|
2078
2137
|
(@pre == nil ? '-' : (@pre.is_a?(Hash) ? @pre.tostring : @pre.to_s)) + ',' +
|
data/lib/sfp/visitors.rb
CHANGED
@@ -92,13 +92,17 @@ module Sfp
|
|
92
92
|
if value.length >= 8 and value[0,8] == '$.parent'
|
93
93
|
_, _, rest = value.split('.', 3)
|
94
94
|
if parent.has_key?('_parent')
|
95
|
-
|
95
|
+
val = parent['_parent'].ref
|
96
|
+
val << ".#{rest}" if not rest.nil?
|
97
|
+
parent[name] = val
|
96
98
|
else
|
97
99
|
raise Exception
|
98
100
|
end
|
99
101
|
elsif value.length >= 6 and value[0,6] == '$.this'
|
100
102
|
_, _, rest = value.split('.', 3)
|
101
|
-
|
103
|
+
val = parent.ref
|
104
|
+
val << ".#{rest}" if not rest.nil?
|
105
|
+
parent[name] = val
|
102
106
|
end
|
103
107
|
end
|
104
108
|
true
|
metadata
CHANGED
@@ -1,38 +1,43 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sfp
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
5
|
-
prerelease:
|
4
|
+
version: 0.3.19
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Herry
|
9
8
|
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
date: 2013-11-
|
11
|
+
date: 2013-11-20 00:00:00.000000000 Z
|
13
12
|
dependencies:
|
14
13
|
- !ruby/object:Gem::Dependency
|
15
14
|
name: antlr3
|
16
|
-
requirement:
|
17
|
-
none: false
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
18
16
|
requirements:
|
19
17
|
- - ~>
|
20
18
|
- !ruby/object:Gem::Version
|
21
19
|
version: 1.10.0
|
22
20
|
type: :runtime
|
23
21
|
prerelease: false
|
24
|
-
version_requirements:
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ~>
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 1.10.0
|
25
27
|
- !ruby/object:Gem::Dependency
|
26
28
|
name: rake
|
27
|
-
requirement:
|
28
|
-
none: false
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
29
30
|
requirements:
|
30
|
-
- -
|
31
|
+
- - '>='
|
31
32
|
- !ruby/object:Gem::Version
|
32
33
|
version: '0'
|
33
34
|
type: :development
|
34
35
|
prerelease: false
|
35
|
-
version_requirements:
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - '>='
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
36
41
|
description: A Ruby API and script for SFP language parser
|
37
42
|
email: herry13@gmail.com
|
38
43
|
executables:
|
@@ -67,26 +72,25 @@ files:
|
|
67
72
|
homepage: https://github.com/herry13/sfp-ruby
|
68
73
|
licenses:
|
69
74
|
- BSD
|
75
|
+
metadata: {}
|
70
76
|
post_install_message:
|
71
77
|
rdoc_options: []
|
72
78
|
require_paths:
|
73
79
|
- lib
|
74
80
|
required_ruby_version: !ruby/object:Gem::Requirement
|
75
|
-
none: false
|
76
81
|
requirements:
|
77
|
-
- -
|
82
|
+
- - '>='
|
78
83
|
- !ruby/object:Gem::Version
|
79
84
|
version: '0'
|
80
85
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
81
|
-
none: false
|
82
86
|
requirements:
|
83
|
-
- -
|
87
|
+
- - '>='
|
84
88
|
- !ruby/object:Gem::Version
|
85
89
|
version: '0'
|
86
90
|
requirements: []
|
87
91
|
rubyforge_project: sfp
|
88
|
-
rubygems_version: 1.
|
92
|
+
rubygems_version: 2.1.10
|
89
93
|
signing_key:
|
90
|
-
specification_version:
|
94
|
+
specification_version: 4
|
91
95
|
summary: SFP Parser
|
92
96
|
test_files: []
|