wml_action 0.0.3 → 0.0.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +3 -0
- data/lib/wml_action/cli.rb +51 -46
- data/lib/wml_action/expr.rb +45 -35
- data/lib/wml_action/lexer.rex +2 -1
- data/lib/wml_action/lexer.rex.rb +3 -1
- data/lib/wml_action/parser.tab.rb +173 -153
- data/lib/wml_action/parser.y +9 -1
- data/lib/wml_action/tag.rb +1 -0
- data/lib/wml_action/version.rb +1 -1
- data/spec/expr_spec.rb +66 -48
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5abd36604162ad81ae4384c177cccda0a78be1ba
|
4
|
+
data.tar.gz: 48ce5d4e111b731795958249d077ee4c3dd3f108
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: abf8e77bcaeac06f1f2ecf7e31feabafb4de66e65bb235ebe2893ea60af751f020c7f83b7bb3921f947fed20ee0e398e7124612cc707984538e3734ecf159bf7
|
7
|
+
data.tar.gz: b539147e04dbf2a71e87738f63ff067fc2c59744693b4eed04da5d847e65235847d60e70dcba3a6a7706353c1739d7abceeb20735824c879bd6bfc91b990677e
|
data/README.md
CHANGED
@@ -92,12 +92,14 @@ File:
|
|
92
92
|
[unit]
|
93
93
|
hp=10
|
94
94
|
level=2
|
95
|
+
name=_ "Archer"
|
95
96
|
[/unit]
|
96
97
|
```
|
97
98
|
Modifications:
|
98
99
|
```
|
99
100
|
[unit]
|
100
101
|
hp=`(hp+level)*2`
|
102
|
+
name=`"Tough ".name`
|
101
103
|
[/unit]
|
102
104
|
```
|
103
105
|
Becomes:
|
@@ -105,6 +107,7 @@ Becomes:
|
|
105
107
|
[unit]
|
106
108
|
hp=24
|
107
109
|
level=2
|
110
|
+
name=_ "Tough Archer"
|
108
111
|
[/unit]
|
109
112
|
```
|
110
113
|
|
data/lib/wml_action/cli.rb
CHANGED
@@ -3,53 +3,58 @@ require 'wml_action'
|
|
3
3
|
|
4
4
|
module WMLAction
|
5
5
|
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
d=Document.from_file(filename)
|
50
|
-
print d.root.to_s
|
51
|
-
end
|
6
|
+
class CLI < Thor
|
7
|
+
include Log
|
8
|
+
|
9
|
+
class_option :verbose, type: :boolean, aliases: '-v'
|
10
|
+
class_option :debug, type: :boolean, aliases: '-d'
|
11
|
+
|
12
|
+
desc "modify FILE MODS_FILES", "Modifies a WML"
|
13
|
+
def modify(target_name,*modlist_names)
|
14
|
+
log.level=Logger::INFO if options[:verbose]
|
15
|
+
log.level=Logger::DEBUG if options[:debug]
|
16
|
+
|
17
|
+
unless File.exist?(target_name)
|
18
|
+
log.fatal "Invalid target file: #{target_name}"
|
19
|
+
exit
|
20
|
+
end
|
21
|
+
|
22
|
+
if modlist_names.empty?
|
23
|
+
log.fatal "Need at least one modlist file"
|
24
|
+
exit
|
25
|
+
end
|
26
|
+
|
27
|
+
non_exist = modlist_names.clone.delete_if {|f| File.exist? f}
|
28
|
+
unless non_exist.empty?
|
29
|
+
log.fatal "Modlist files does not exist: #{non_exist.join(" ")}"
|
30
|
+
exit
|
31
|
+
end
|
32
|
+
|
33
|
+
target=Document.from_file(target_name)
|
34
|
+
modlist_names.each do |name|
|
35
|
+
modlist=Document.from_file(name)
|
36
|
+
target.root.merge(modlist.root)
|
37
|
+
end
|
38
|
+
|
39
|
+
print target.root.to_s
|
40
|
+
end
|
41
|
+
|
42
|
+
desc "read FILE", "Reads and outputs a wml"
|
43
|
+
def read(filename)
|
44
|
+
log.level=Logger::INFO if options[:verbose]
|
45
|
+
log.level=Logger::DEBUG if options[:debug]
|
46
|
+
d=Document.from_file(filename)
|
47
|
+
print d.root.to_s
|
48
|
+
end
|
52
49
|
|
50
|
+
desc "action_read FILE", "Reads and outputs an action wml"
|
51
|
+
def action_read(filename)
|
52
|
+
log.level=Logger::INFO if options[:verbose]
|
53
|
+
log.level=Logger::DEBUG if options[:debug]
|
54
|
+
d=Document.from_file(filename)
|
55
|
+
print d.root.to_s
|
53
56
|
end
|
54
57
|
|
58
|
+
end
|
59
|
+
|
55
60
|
end
|
data/lib/wml_action/expr.rb
CHANGED
@@ -5,15 +5,15 @@ module WMLAction
|
|
5
5
|
attr_accessor :line
|
6
6
|
|
7
7
|
Var = Struct.new(:name) do
|
8
|
-
|
9
|
-
|
10
|
-
|
8
|
+
def to_s
|
9
|
+
name.to_s
|
10
|
+
end
|
11
11
|
end
|
12
12
|
|
13
13
|
Op = Struct.new(:value) do
|
14
|
-
|
15
|
-
|
16
|
-
|
14
|
+
def to_s
|
15
|
+
value.to_s
|
16
|
+
end
|
17
17
|
end
|
18
18
|
|
19
19
|
|
@@ -22,51 +22,61 @@ module WMLAction
|
|
22
22
|
end
|
23
23
|
|
24
24
|
def result(vars={})
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
25
|
+
return '' if @line.empty?
|
26
|
+
stack=[]
|
27
|
+
@line.each do |e|
|
28
|
+
case e
|
29
|
+
when Var then stack.push vars[e.name]
|
30
|
+
when Op then
|
31
|
+
x2 = stack.pop
|
32
|
+
x1 = stack.pop
|
33
|
+
raise SyntaxError.new("Invalid expression #{dump}, no values in stack") unless x1 && x2
|
34
|
+
case e.value
|
35
|
+
when '+' then stack.push(x1+x2)
|
36
|
+
when '-' then stack.push(x1-x2)
|
37
|
+
when '*' then stack.push(x1.to_f*x2)
|
38
|
+
when '/' then stack.push(x1.to_f/x2)
|
39
|
+
when '.' then stack.push(dot_concat(x1,x2))
|
40
|
+
else raise NoMethodError.new("No such operation #{e.value}")
|
41
|
+
end
|
42
|
+
else stack.push e
|
43
43
|
end
|
44
|
-
|
45
|
-
|
46
|
-
|
44
|
+
end
|
45
|
+
raise SyntaxError.new("Invalid expression #{dump}, still have #{stack.size} values") unless stack.size == 1
|
46
|
+
return stack[0].to_i if stack[0].class==Float
|
47
|
+
return stack[0]
|
48
|
+
end
|
49
|
+
|
50
|
+
def dot_concat(s1,s2)
|
51
|
+
quote=/\"/
|
52
|
+
m1=s1.match(quote)
|
53
|
+
m2=s2.match(quote)
|
54
|
+
raise NoMethodError.new("Can not dot-concat #{s1} and #{s2}, all have quotes") if m1 && m2
|
55
|
+
return s1.clone.insert(s1.rindex(quote),s2) if m1
|
56
|
+
return s2.clone.insert(s2.index(quote)+1,s1) if m2
|
47
57
|
end
|
48
58
|
|
49
59
|
def ==(other)
|
50
|
-
|
60
|
+
@line==other.line
|
51
61
|
end
|
52
62
|
|
53
63
|
def to_s
|
54
|
-
|
55
|
-
|
56
|
-
|
64
|
+
#TODO should revert to infix notation for file output
|
65
|
+
# needed to read outputted file
|
66
|
+
dump
|
57
67
|
end
|
58
68
|
|
59
69
|
def dump
|
60
|
-
|
70
|
+
@line.join(' ')
|
61
71
|
end
|
62
72
|
|
63
73
|
def <<(other)
|
64
|
-
|
65
|
-
|
74
|
+
@line=@line+other.line
|
75
|
+
return self
|
66
76
|
end
|
67
77
|
|
68
78
|
def self.[](*elements)
|
69
|
-
|
79
|
+
new elements
|
70
80
|
end
|
71
81
|
|
72
82
|
end
|
data/lib/wml_action/lexer.rex
CHANGED
@@ -49,10 +49,11 @@ rule
|
|
49
49
|
:INEXPR /\*/ { [:EMUL,text] }
|
50
50
|
:INEXPR /\// { [:EDIV,text] }
|
51
51
|
:INEXPR /\-/ { [:EMINUS,text] }
|
52
|
+
:INEXPR /\./ { [:EDOT,text] }
|
52
53
|
:INEXPR /\(/ { [text,text] }
|
53
54
|
:INEXPR /\)/ { [text,text] }
|
54
55
|
:INEXPR /#{ANUMBER}/ { [:ENUM,text.to_f] }
|
55
|
-
:INEXPR /#{ASTR}/ { [:ESTR,text] }
|
56
|
+
:INEXPR /#{ASTR}/ { [:ESTR,text.slice(1..-2)] }
|
56
57
|
:INEXPR /#{VAR}/ { [:EVAR,text] }
|
57
58
|
|
58
59
|
/./
|
data/lib/wml_action/lexer.rex.rb
CHANGED
@@ -132,6 +132,8 @@ class Parser < Racc::Parser
|
|
132
132
|
action { [:EDIV,text] }
|
133
133
|
when text = ss.scan(/\-/) then
|
134
134
|
action { [:EMINUS,text] }
|
135
|
+
when text = ss.scan(/\./) then
|
136
|
+
action { [:EDOT,text] }
|
135
137
|
when text = ss.scan(/\(/) then
|
136
138
|
action { [text,text] }
|
137
139
|
when text = ss.scan(/\)/) then
|
@@ -139,7 +141,7 @@ class Parser < Racc::Parser
|
|
139
141
|
when text = ss.scan(/#{ANUMBER}/) then
|
140
142
|
action { [:ENUM,text.to_f] }
|
141
143
|
when text = ss.scan(/#{ASTR}/) then
|
142
|
-
action { [:ESTR,text] }
|
144
|
+
action { [:ESTR,text.slice(1..-2)] }
|
143
145
|
when text = ss.scan(/#{VAR}/) then
|
144
146
|
action { [:EVAR,text] }
|
145
147
|
else
|
@@ -16,59 +16,63 @@ require 'wml_action/log'
|
|
16
16
|
module WMLAction
|
17
17
|
class Parser < Racc::Parser
|
18
18
|
|
19
|
-
module_eval(<<'...end parser.y/module_eval...', 'parser.y',
|
19
|
+
module_eval(<<'...end parser.y/module_eval...', 'parser.y', 70)
|
20
20
|
include Log
|
21
21
|
|
22
22
|
...end parser.y/module_eval...
|
23
23
|
##### State transition tables begin ###
|
24
24
|
|
25
25
|
racc_action_table = [
|
26
|
-
4, 8, 14, 22,
|
27
|
-
|
28
|
-
26, 28, 29,
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
41, 42, 43, 44
|
26
|
+
16, 17, 31, 4, 8, 14, 22, 41, 42, 43,
|
27
|
+
44, 45, 48, 39, 54, 18, 38, 46, 18, 23,
|
28
|
+
25, 26, 28, 29, 33, 19, 4, 7, 21, 34,
|
29
|
+
33, 35, 36, 37, 5, 34, 33, 35, 36, 37,
|
30
|
+
4, 34, 33, 35, 36, 37, nil, 34, 33, 35,
|
31
|
+
36, 37, nil, 34, 33, 35, 36, 37, nil, 34,
|
32
|
+
33, 35, 36, 37, nil, 34, nil, 35, 36, 37,
|
33
|
+
40, 41, 42, 43, 44, 45, 41, 42, 43, 44,
|
34
|
+
45, 41, 42, 43, 44, 45, 41, 42, 43, 44,
|
35
|
+
45, 41, 42, 43, 44, 45, 41, 42, 43, 44,
|
36
|
+
45 ]
|
35
37
|
|
36
38
|
racc_action_check = [
|
37
|
-
6, 6, 6,
|
38
|
-
38,
|
39
|
-
18, 18, 18,
|
40
|
-
34, 43,
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
32, 32,
|
45
|
-
50, 50, 50, 50
|
39
|
+
6, 6, 19, 6, 6, 6, 18, 47, 47, 47,
|
40
|
+
47, 47, 38, 29, 47, 19, 24, 33, 6, 18,
|
41
|
+
18, 18, 18, 18, 43, 6, 15, 5, 15, 43,
|
42
|
+
34, 43, 43, 43, 1, 34, 44, 34, 34, 34,
|
43
|
+
0, 44, 41, 44, 44, 44, nil, 41, 22, 41,
|
44
|
+
41, 41, nil, 22, 45, 22, 22, 22, nil, 45,
|
45
|
+
42, 45, 45, 45, nil, 42, nil, 42, 42, 42,
|
46
|
+
32, 32, 32, 32, 32, 32, 51, 51, 51, 51,
|
47
|
+
51, 50, 50, 50, 50, 50, 52, 52, 52, 52,
|
48
|
+
52, 49, 49, 49, 49, 49, 53, 53, 53, 53,
|
49
|
+
53 ]
|
46
50
|
|
47
51
|
racc_action_pointer = [
|
48
|
-
|
49
|
-
nil, nil, nil, nil, nil,
|
50
|
-
nil, nil,
|
51
|
-
nil, nil,
|
52
|
-
nil,
|
53
|
-
74,
|
52
|
+
32, 34, nil, nil, nil, 27, -5, nil, nil, nil,
|
53
|
+
nil, nil, nil, nil, nil, 18, nil, nil, -5, -8,
|
54
|
+
nil, nil, 35, nil, -13, nil, nil, nil, nil, -14,
|
55
|
+
nil, nil, 59, 0, 17, nil, nil, nil, -13, nil,
|
56
|
+
nil, 29, 47, 11, 23, 41, nil, -5, nil, 79,
|
57
|
+
69, 64, 74, 84, nil ]
|
54
58
|
|
55
59
|
racc_action_default = [
|
56
|
-
-1, -
|
57
|
-
-7, -8, -9, -10, -11, -
|
58
|
-
-
|
59
|
-
-
|
60
|
-
-12, -
|
61
|
-
-15, -16, -
|
60
|
+
-1, -38, -2, -3, -5, -38, -38, 55, -4, -6,
|
61
|
+
-7, -8, -9, -10, -11, -38, -25, -26, -27, -38,
|
62
|
+
-23, -24, -38, -28, -29, -30, -31, -32, -33, -38,
|
63
|
+
-36, -37, -38, -38, -38, -20, -21, -22, -38, -34,
|
64
|
+
-12, -38, -38, -38, -38, -38, -18, -38, -35, -13,
|
65
|
+
-14, -15, -16, -17, -19 ]
|
62
66
|
|
63
67
|
racc_goto_table = [
|
64
68
|
32, 3, 12, 1, 9, 10, 6, 11, 13, 27,
|
65
|
-
2, 15,
|
66
|
-
|
69
|
+
2, 15, 47, 24, nil, 30, 20, nil, nil, 49,
|
70
|
+
50, 51, 52, 53 ]
|
67
71
|
|
68
72
|
racc_goto_check = [
|
69
73
|
10, 3, 7, 1, 5, 6, 4, 3, 8, 9,
|
70
74
|
2, 11, 10, 12, nil, 7, 3, nil, nil, 10,
|
71
|
-
10, 10, 10 ]
|
75
|
+
10, 10, 10, 10 ]
|
72
76
|
|
73
77
|
racc_goto_pointer = [
|
74
78
|
nil, 3, 10, 1, 2, -2, -1, -4, 2, -9,
|
@@ -80,77 +84,82 @@ racc_goto_default = [
|
|
80
84
|
|
81
85
|
racc_reduce_table = [
|
82
86
|
0, 0, :racc_error,
|
83
|
-
0,
|
84
|
-
1,
|
85
|
-
1,
|
86
|
-
3,
|
87
|
-
0,
|
88
|
-
2,
|
89
|
-
1,
|
90
|
-
1,
|
91
|
-
1,
|
92
|
-
1,
|
93
|
-
1,
|
94
|
-
3,
|
95
|
-
3,
|
96
|
-
3,
|
97
|
-
3,
|
98
|
-
3,
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
1,
|
103
|
-
1,
|
104
|
-
|
105
|
-
2,
|
106
|
-
|
107
|
-
1,
|
108
|
-
1,
|
109
|
-
|
110
|
-
2,
|
111
|
-
2,
|
112
|
-
2,
|
113
|
-
2,
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
2,
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
87
|
+
0, 32, :_reduce_none,
|
88
|
+
1, 32, :_reduce_2,
|
89
|
+
1, 33, :_reduce_3,
|
90
|
+
3, 34, :_reduce_4,
|
91
|
+
0, 35, :_reduce_5,
|
92
|
+
2, 35, :_reduce_6,
|
93
|
+
1, 36, :_reduce_none,
|
94
|
+
1, 36, :_reduce_8,
|
95
|
+
1, 36, :_reduce_none,
|
96
|
+
1, 36, :_reduce_none,
|
97
|
+
1, 36, :_reduce_11,
|
98
|
+
3, 40, :_reduce_12,
|
99
|
+
3, 41, :_reduce_13,
|
100
|
+
3, 41, :_reduce_14,
|
101
|
+
3, 41, :_reduce_15,
|
102
|
+
3, 41, :_reduce_16,
|
103
|
+
3, 41, :_reduce_17,
|
104
|
+
2, 41, :_reduce_18,
|
105
|
+
3, 41, :_reduce_19,
|
106
|
+
1, 41, :_reduce_20,
|
107
|
+
1, 41, :_reduce_21,
|
108
|
+
1, 41, :_reduce_22,
|
109
|
+
2, 37, :_reduce_23,
|
110
|
+
2, 37, :_reduce_24,
|
111
|
+
1, 42, :_reduce_none,
|
112
|
+
1, 42, :_reduce_none,
|
113
|
+
1, 38, :_reduce_27,
|
114
|
+
2, 38, :_reduce_28,
|
115
|
+
2, 38, :_reduce_29,
|
116
|
+
2, 38, :_reduce_30,
|
117
|
+
2, 38, :_reduce_31,
|
118
|
+
2, 38, :_reduce_32,
|
119
|
+
1, 43, :_reduce_33,
|
120
|
+
2, 43, :_reduce_34,
|
121
|
+
3, 43, :_reduce_35,
|
122
|
+
2, 39, :_reduce_36,
|
123
|
+
2, 39, :_reduce_37 ]
|
124
|
+
|
125
|
+
racc_reduce_n = 38
|
126
|
+
|
127
|
+
racc_shift_n = 55
|
123
128
|
|
124
129
|
racc_token_table = {
|
125
130
|
false => 0,
|
126
131
|
:error => 1,
|
127
|
-
:
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
:
|
134
|
-
:
|
135
|
-
:
|
136
|
-
:
|
137
|
-
|
138
|
-
|
139
|
-
:
|
140
|
-
:
|
141
|
-
:
|
142
|
-
|
143
|
-
"
|
144
|
-
|
145
|
-
:
|
146
|
-
:
|
147
|
-
:
|
148
|
-
:
|
149
|
-
:
|
150
|
-
:
|
151
|
-
:
|
152
|
-
|
153
|
-
|
132
|
+
:EUMIN => 2,
|
133
|
+
"*" => 3,
|
134
|
+
"/" => 4,
|
135
|
+
"+" => 5,
|
136
|
+
"-" => 6,
|
137
|
+
"." => 7,
|
138
|
+
:OTAG => 8,
|
139
|
+
:CTAG => 9,
|
140
|
+
:MACRO => 10,
|
141
|
+
:BACKQ => 11,
|
142
|
+
:EPLUS => 12,
|
143
|
+
:EMINUS => 13,
|
144
|
+
:EMUL => 14,
|
145
|
+
:EDIV => 15,
|
146
|
+
:EDOT => 16,
|
147
|
+
:ENUMBER => 17,
|
148
|
+
"(" => 18,
|
149
|
+
")" => 19,
|
150
|
+
:ESTR => 20,
|
151
|
+
:ENUM => 21,
|
152
|
+
:EVAR => 22,
|
153
|
+
:ATTR => 23,
|
154
|
+
:APLAIN => 24,
|
155
|
+
:AMACRO => 25,
|
156
|
+
:ANUMBER => 26,
|
157
|
+
:ASTR => 27,
|
158
|
+
:UNDERSC => 28,
|
159
|
+
:APLUS => 29,
|
160
|
+
:SLASH => 30 }
|
161
|
+
|
162
|
+
racc_nt_base = 31
|
154
163
|
|
155
164
|
racc_use_result_var = true
|
156
165
|
|
@@ -173,6 +182,12 @@ Racc_arg = [
|
|
173
182
|
Racc_token_to_s_table = [
|
174
183
|
"$end",
|
175
184
|
"error",
|
185
|
+
"EUMIN",
|
186
|
+
"\"*\"",
|
187
|
+
"\"/\"",
|
188
|
+
"\"+\"",
|
189
|
+
"\"-\"",
|
190
|
+
"\".\"",
|
176
191
|
"OTAG",
|
177
192
|
"CTAG",
|
178
193
|
"MACRO",
|
@@ -181,15 +196,13 @@ Racc_token_to_s_table = [
|
|
181
196
|
"EMINUS",
|
182
197
|
"EMUL",
|
183
198
|
"EDIV",
|
199
|
+
"EDOT",
|
184
200
|
"ENUMBER",
|
185
|
-
"EUMIN",
|
186
201
|
"\"(\"",
|
187
202
|
"\")\"",
|
188
203
|
"ESTR",
|
189
204
|
"ENUM",
|
190
205
|
"EVAR",
|
191
|
-
"\"+\"",
|
192
|
-
"\"-\"",
|
193
206
|
"ATTR",
|
194
207
|
"APLAIN",
|
195
208
|
"AMACRO",
|
@@ -220,35 +233,35 @@ Racc_debug_parser = false
|
|
220
233
|
|
221
234
|
# reduce 1 omitted
|
222
235
|
|
223
|
-
module_eval(<<'.,.,', 'parser.y',
|
236
|
+
module_eval(<<'.,.,', 'parser.y', 10)
|
224
237
|
def _reduce_2(val, _values, result)
|
225
238
|
log.debug 'Found a target'
|
226
239
|
result
|
227
240
|
end
|
228
241
|
.,.,
|
229
242
|
|
230
|
-
module_eval(<<'.,.,', 'parser.y',
|
243
|
+
module_eval(<<'.,.,', 'parser.y', 12)
|
231
244
|
def _reduce_3(val, _values, result)
|
232
245
|
log.debug 'Found a doc'
|
233
246
|
result
|
234
247
|
end
|
235
248
|
.,.,
|
236
249
|
|
237
|
-
module_eval(<<'.,.,', 'parser.y',
|
250
|
+
module_eval(<<'.,.,', 'parser.y', 14)
|
238
251
|
def _reduce_4(val, _values, result)
|
239
252
|
log.debug("Creating tag #{val[0]}"); return Tag.new(name: val[0], content: val[1])
|
240
253
|
result
|
241
254
|
end
|
242
255
|
.,.,
|
243
256
|
|
244
|
-
module_eval(<<'.,.,', 'parser.y',
|
257
|
+
module_eval(<<'.,.,', 'parser.y', 16)
|
245
258
|
def _reduce_5(val, _values, result)
|
246
259
|
return []
|
247
260
|
result
|
248
261
|
end
|
249
262
|
.,.,
|
250
263
|
|
251
|
-
module_eval(<<'.,.,', 'parser.y',
|
264
|
+
module_eval(<<'.,.,', 'parser.y', 17)
|
252
265
|
def _reduce_6(val, _values, result)
|
253
266
|
log.debug("Append #{val[1]} to #{val[0]}"); return val[0]? val[0].push(val[1]) : [val[1]]
|
254
267
|
result
|
@@ -257,7 +270,7 @@ module_eval(<<'.,.,', 'parser.y', 10)
|
|
257
270
|
|
258
271
|
# reduce 7 omitted
|
259
272
|
|
260
|
-
module_eval(<<'.,.,', 'parser.y',
|
273
|
+
module_eval(<<'.,.,', 'parser.y', 20)
|
261
274
|
def _reduce_8(val, _values, result)
|
262
275
|
log.debug "Found a content subtag #{val[0]}"
|
263
276
|
result
|
@@ -268,173 +281,180 @@ module_eval(<<'.,.,', 'parser.y', 13)
|
|
268
281
|
|
269
282
|
# reduce 10 omitted
|
270
283
|
|
271
|
-
module_eval(<<'.,.,', 'parser.y',
|
284
|
+
module_eval(<<'.,.,', 'parser.y', 23)
|
272
285
|
def _reduce_11(val, _values, result)
|
273
286
|
log.debug "Found a macro #{val[0]}"; return Tag::Macro[val[0]]
|
274
287
|
result
|
275
288
|
end
|
276
289
|
.,.,
|
277
290
|
|
278
|
-
module_eval(<<'.,.,', 'parser.y',
|
291
|
+
module_eval(<<'.,.,', 'parser.y', 25)
|
279
292
|
def _reduce_12(val, _values, result)
|
280
293
|
return val[1]
|
281
294
|
result
|
282
295
|
end
|
283
296
|
.,.,
|
284
297
|
|
285
|
-
module_eval(<<'.,.,', 'parser.y',
|
298
|
+
module_eval(<<'.,.,', 'parser.y', 27)
|
286
299
|
def _reduce_13(val, _values, result)
|
287
300
|
log.debug "Found a #{val[0]} #{val[1]} #{val[2]} expression"; return val[0] << val[2] << Tag::Expr[Tag::Expr::Op[val[1]]]
|
288
301
|
result
|
289
302
|
end
|
290
303
|
.,.,
|
291
304
|
|
292
|
-
module_eval(<<'.,.,', 'parser.y',
|
305
|
+
module_eval(<<'.,.,', 'parser.y', 28)
|
293
306
|
def _reduce_14(val, _values, result)
|
294
307
|
log.debug "Found a #{val[0]} #{val[1]} #{val[2]} expression"; return val[0] << val[2] << Tag::Expr[Tag::Expr::Op[val[1]]]
|
295
308
|
result
|
296
309
|
end
|
297
310
|
.,.,
|
298
311
|
|
299
|
-
module_eval(<<'.,.,', 'parser.y',
|
312
|
+
module_eval(<<'.,.,', 'parser.y', 29)
|
300
313
|
def _reduce_15(val, _values, result)
|
301
314
|
log.debug "Found a #{val[0]} #{val[1]} #{val[2]} expression"; return val[0] << val[2] << Tag::Expr[Tag::Expr::Op[val[1]]]
|
302
315
|
result
|
303
316
|
end
|
304
317
|
.,.,
|
305
318
|
|
306
|
-
module_eval(<<'.,.,', 'parser.y',
|
319
|
+
module_eval(<<'.,.,', 'parser.y', 30)
|
307
320
|
def _reduce_16(val, _values, result)
|
308
321
|
log.debug "Found a #{val[0]} #{val[1]} #{val[2]} expression"; return val[0] << val[2] << Tag::Expr[Tag::Expr::Op[val[1]]]
|
309
322
|
result
|
310
323
|
end
|
311
324
|
.,.,
|
312
325
|
|
313
|
-
module_eval(<<'.,.,', 'parser.y',
|
326
|
+
module_eval(<<'.,.,', 'parser.y', 31)
|
314
327
|
def _reduce_17(val, _values, result)
|
315
|
-
return Tag
|
328
|
+
log.debug "Found a #{val[0]} #{val[1]} #{val[2]} expression"; return val[0] << val[2] << Tag::Expr[Tag::Expr::Op[val[1]]]
|
316
329
|
result
|
317
330
|
end
|
318
331
|
.,.,
|
319
332
|
|
320
|
-
module_eval(<<'.,.,', 'parser.y',
|
333
|
+
module_eval(<<'.,.,', 'parser.y', 32)
|
321
334
|
def _reduce_18(val, _values, result)
|
322
|
-
return val[1]
|
335
|
+
return Tag:Expr[-val[1]]
|
323
336
|
result
|
324
337
|
end
|
325
338
|
.,.,
|
326
339
|
|
327
|
-
module_eval(<<'.,.,', 'parser.y',
|
340
|
+
module_eval(<<'.,.,', 'parser.y', 33)
|
328
341
|
def _reduce_19(val, _values, result)
|
329
|
-
|
342
|
+
return val[1]
|
330
343
|
result
|
331
344
|
end
|
332
345
|
.,.,
|
333
346
|
|
334
|
-
module_eval(<<'.,.,', 'parser.y',
|
347
|
+
module_eval(<<'.,.,', 'parser.y', 34)
|
335
348
|
def _reduce_20(val, _values, result)
|
336
|
-
log.debug "Found a
|
349
|
+
log.debug "Found a string #{val[0]}"; return Tag::Expr[val[0]]
|
337
350
|
result
|
338
351
|
end
|
339
352
|
.,.,
|
340
353
|
|
341
|
-
module_eval(<<'.,.,', 'parser.y',
|
354
|
+
module_eval(<<'.,.,', 'parser.y', 35)
|
342
355
|
def _reduce_21(val, _values, result)
|
343
|
-
log.debug "Found a
|
356
|
+
log.debug "Found a number #{val[0]}"; return Tag::Expr[val[0]]
|
344
357
|
result
|
345
358
|
end
|
346
359
|
.,.,
|
347
360
|
|
348
|
-
module_eval(<<'.,.,', 'parser.y',
|
361
|
+
module_eval(<<'.,.,', 'parser.y', 36)
|
349
362
|
def _reduce_22(val, _values, result)
|
350
|
-
log.debug "Found a
|
363
|
+
log.debug "Found a variable #{val[0]}"; return Tag::Expr[Tag::Expr::Var[val[0]]]
|
351
364
|
result
|
352
365
|
end
|
353
366
|
.,.,
|
354
367
|
|
355
|
-
module_eval(<<'.,.,', 'parser.y',
|
368
|
+
module_eval(<<'.,.,', 'parser.y', 38)
|
356
369
|
def _reduce_23(val, _values, result)
|
357
|
-
log.debug "Found a action
|
370
|
+
log.debug "Found a action tag #{val[0]}:#{val[1]}"; return Tag::Action[val[1],val[0]]
|
358
371
|
result
|
359
372
|
end
|
360
373
|
.,.,
|
361
374
|
|
362
|
-
|
375
|
+
module_eval(<<'.,.,', 'parser.y', 39)
|
376
|
+
def _reduce_24(val, _values, result)
|
377
|
+
log.debug "Found a action macro #{val[0]}:#{val[1]}"; return Tag::Action[Tag::Macro[val[1]],val[0]]
|
378
|
+
result
|
379
|
+
end
|
380
|
+
.,.,
|
363
381
|
|
364
382
|
# reduce 25 omitted
|
365
383
|
|
366
|
-
|
367
|
-
|
384
|
+
# reduce 26 omitted
|
385
|
+
|
386
|
+
module_eval(<<'.,.,', 'parser.y', 44)
|
387
|
+
def _reduce_27(val, _values, result)
|
368
388
|
log.debug "Found empty attribute: #{val[0]}"; return Tag::Attribute[val[0],'']
|
369
389
|
result
|
370
390
|
end
|
371
391
|
.,.,
|
372
392
|
|
373
|
-
module_eval(<<'.,.,', 'parser.y',
|
374
|
-
def
|
393
|
+
module_eval(<<'.,.,', 'parser.y', 45)
|
394
|
+
def _reduce_28(val, _values, result)
|
375
395
|
log.debug "Found plain attribute: #{val[0]}:#{val[1]}"; return Tag::Attribute[val[0],val[1]]
|
376
396
|
result
|
377
397
|
end
|
378
398
|
.,.,
|
379
399
|
|
380
|
-
module_eval(<<'.,.,', 'parser.y',
|
381
|
-
def
|
400
|
+
module_eval(<<'.,.,', 'parser.y', 46)
|
401
|
+
def _reduce_29(val, _values, result)
|
382
402
|
log.debug "Found string attribute: #{val[0]}:#{val[1]}"; return Tag::Attribute[val[0],val[1]]
|
383
403
|
result
|
384
404
|
end
|
385
405
|
.,.,
|
386
406
|
|
387
|
-
module_eval(<<'.,.,', 'parser.y',
|
388
|
-
def
|
407
|
+
module_eval(<<'.,.,', 'parser.y', 47)
|
408
|
+
def _reduce_30(val, _values, result)
|
389
409
|
log.debug "Found macro attribute: #{val[0]}:#{val[1]}"; return Tag::Attribute[val[0],val[1]]
|
390
410
|
result
|
391
411
|
end
|
392
412
|
.,.,
|
393
413
|
|
394
|
-
module_eval(<<'.,.,', 'parser.y',
|
395
|
-
def
|
414
|
+
module_eval(<<'.,.,', 'parser.y', 48)
|
415
|
+
def _reduce_31(val, _values, result)
|
396
416
|
log.debug "Found numeric attribute: #{val[0]}:#{val[1]}"; return Tag::Attribute[val[0],val[1]]
|
397
417
|
result
|
398
418
|
end
|
399
419
|
.,.,
|
400
420
|
|
401
|
-
module_eval(<<'.,.,', 'parser.y',
|
402
|
-
def
|
421
|
+
module_eval(<<'.,.,', 'parser.y', 49)
|
422
|
+
def _reduce_32(val, _values, result)
|
403
423
|
log.debug "Found expression attribute: #{val[0]}"; return Tag::Attribute[val[0],val[1]]
|
404
424
|
result
|
405
425
|
end
|
406
426
|
.,.,
|
407
427
|
|
408
|
-
module_eval(<<'.,.,', 'parser.y',
|
409
|
-
def
|
428
|
+
module_eval(<<'.,.,', 'parser.y', 51)
|
429
|
+
def _reduce_33(val, _values, result)
|
410
430
|
return " #{val[0]}"
|
411
431
|
result
|
412
432
|
end
|
413
433
|
.,.,
|
414
434
|
|
415
|
-
module_eval(<<'.,.,', 'parser.y',
|
416
|
-
def
|
435
|
+
module_eval(<<'.,.,', 'parser.y', 52)
|
436
|
+
def _reduce_34(val, _values, result)
|
417
437
|
return ' '+val[0]+' '+val[1]
|
418
438
|
result
|
419
439
|
end
|
420
440
|
.,.,
|
421
441
|
|
422
|
-
module_eval(<<'.,.,', 'parser.y',
|
423
|
-
def
|
442
|
+
module_eval(<<'.,.,', 'parser.y', 53)
|
443
|
+
def _reduce_35(val, _values, result)
|
424
444
|
return val[0] + '+' + val[2]
|
425
445
|
result
|
426
446
|
end
|
427
447
|
.,.,
|
428
448
|
|
429
|
-
module_eval(<<'.,.,', 'parser.y',
|
430
|
-
def
|
449
|
+
module_eval(<<'.,.,', 'parser.y', 55)
|
450
|
+
def _reduce_36(val, _values, result)
|
431
451
|
log.debug "Found an attribute filter #{val[1]}"; return Tag::Filter[val[1]]
|
432
452
|
result
|
433
453
|
end
|
434
454
|
.,.,
|
435
455
|
|
436
|
-
module_eval(<<'.,.,', 'parser.y',
|
437
|
-
def
|
456
|
+
module_eval(<<'.,.,', 'parser.y', 56)
|
457
|
+
def _reduce_37(val, _values, result)
|
438
458
|
log.debug "Found a macro filter #{val[1]}"; return Tag::Filter[Tag::Macro[val[1]]]
|
439
459
|
result
|
440
460
|
end
|
data/lib/wml_action/parser.y
CHANGED
@@ -1,4 +1,11 @@
|
|
1
1
|
class WMLAction::Parser
|
2
|
+
|
3
|
+
prechigh
|
4
|
+
nonassoc EUMIN
|
5
|
+
left '*' '/'
|
6
|
+
left '+' '-' '.'
|
7
|
+
preclow
|
8
|
+
|
2
9
|
rule
|
3
10
|
target : /* nothing */
|
4
11
|
| wml_doc { log.debug 'Found a target' }
|
@@ -22,6 +29,7 @@ rule
|
|
22
29
|
| expr EMINUS expr { log.debug "Found a #{val[0]} #{val[1]} #{val[2]} expression"; return val[0] << val[2] << Tag::Expr[Tag::Expr::Op[val[1]]] }
|
23
30
|
| expr EMUL expr { log.debug "Found a #{val[0]} #{val[1]} #{val[2]} expression"; return val[0] << val[2] << Tag::Expr[Tag::Expr::Op[val[1]]] }
|
24
31
|
| expr EDIV expr { log.debug "Found a #{val[0]} #{val[1]} #{val[2]} expression"; return val[0] << val[2] << Tag::Expr[Tag::Expr::Op[val[1]]] }
|
32
|
+
| expr EDOT expr { log.debug "Found a #{val[0]} #{val[1]} #{val[2]} expression"; return val[0] << val[2] << Tag::Expr[Tag::Expr::Op[val[1]]] }
|
25
33
|
| EMINUS ENUMBER =EUMIN { return Tag:Expr[-val[1]] }
|
26
34
|
| '(' expr ')' { return val[1] }
|
27
35
|
| ESTR { log.debug "Found a string #{val[0]}"; return Tag::Expr[val[0]] }
|
@@ -29,7 +37,7 @@ rule
|
|
29
37
|
| EVAR { log.debug "Found a variable #{val[0]}"; return Tag::Expr[Tag::Expr::Var[val[0]]] }
|
30
38
|
|
31
39
|
action : aop tag { log.debug "Found a action tag #{val[0]}:#{val[1]}"; return Tag::Action[val[1],val[0]] }
|
32
|
-
| aop MACRO { log.debug "Found a action
|
40
|
+
| aop MACRO { log.debug "Found a action macro #{val[0]}:#{val[1]}"; return Tag::Action[Tag::Macro[val[1]],val[0]] }
|
33
41
|
|
34
42
|
aop : '+'
|
35
43
|
| '-'
|
data/lib/wml_action/tag.rb
CHANGED
data/lib/wml_action/version.rb
CHANGED
data/spec/expr_spec.rb
CHANGED
@@ -6,83 +6,101 @@ module WMLAction
|
|
6
6
|
describe Tag::Expr do
|
7
7
|
|
8
8
|
before(:all) do
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
Expr=Tag::Expr unless WMLAction.const_defined? 'Expr'
|
10
|
+
Var=Tag::Expr::Var unless WMLAction.const_defined? 'Var'
|
11
|
+
Op=Tag::Expr::Op unless WMLAction.const_defined? 'Op'
|
12
12
|
end
|
13
13
|
|
14
14
|
describe '#result' do
|
15
15
|
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
16
|
+
it 'sums numbers' do
|
17
|
+
e=Expr[1,2,Op['+']]
|
18
|
+
expect(e.result).to eq 3
|
19
|
+
end
|
20
20
|
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
21
|
+
it 'substract numbers' do
|
22
|
+
e=Expr[2,1,Op['-']]
|
23
|
+
expect(e.result).to eq 1
|
24
|
+
end
|
25
25
|
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
26
|
+
it 'multiply numbers' do
|
27
|
+
e=Expr[2,3,Op['*']]
|
28
|
+
expect(e.result).to eq 6
|
29
|
+
end
|
30
30
|
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
31
|
+
it 'multiply numbers' do
|
32
|
+
e=Expr[6,3,Op['/']]
|
33
|
+
expect(e.result).to eq 2
|
34
|
+
end
|
35
35
|
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
36
|
+
it 'more than one operation' do
|
37
|
+
e=Expr[2,3,Op['*'],3,Op['-']]
|
38
|
+
expect(e.result).to eq 3
|
39
|
+
end
|
40
40
|
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
41
|
+
it 'results in integers' do
|
42
|
+
e=Expr[6,4,Op['/']]
|
43
|
+
expect(e.result).to be_integer
|
44
|
+
end
|
45
|
+
|
46
|
+
it 'substitute variables' do
|
47
|
+
e=Expr[Var[:a],Var[:b],Op['+']]
|
48
|
+
expect(e.result({a: 1, b: 3})).to eq 4
|
49
|
+
end
|
50
|
+
|
51
|
+
it 'returns empty string on empty expr' do
|
52
|
+
e=Expr[]
|
53
|
+
expect(e.result).to eq ''
|
54
|
+
end
|
55
|
+
|
56
|
+
context 'when operates with strings' do
|
45
57
|
|
46
58
|
it 'concatenates strings' do
|
47
|
-
|
48
|
-
|
59
|
+
e=Expr['Hello',' World!',Op['+']]
|
60
|
+
expect(e.result).to eq 'Hello World!'
|
49
61
|
end
|
50
62
|
|
51
|
-
it '
|
52
|
-
|
53
|
-
|
63
|
+
it 'keeps right quotes in string dot operation' do
|
64
|
+
e=Expr[%Q("Hello"),' World!',Op['.']]
|
65
|
+
expect(e.result).to eq %Q("Hello World!")
|
54
66
|
end
|
55
67
|
|
56
|
-
it '
|
57
|
-
|
58
|
-
|
68
|
+
it 'keeps left quotes in string dot operation' do
|
69
|
+
e=Expr['Hello ',%Q(_ "World!"),Op['.']]
|
70
|
+
expect(e.result).to eq %Q(_ "Hello World!")
|
59
71
|
end
|
60
72
|
|
73
|
+
end
|
74
|
+
|
75
|
+
context 'when invalid expression' do
|
76
|
+
|
61
77
|
it 'raises syntax error on error with binary op' do
|
62
|
-
|
63
|
-
|
78
|
+
e=Expr[1,Op['+']]
|
79
|
+
expect { e.result }.to raise_error
|
64
80
|
end
|
65
81
|
|
66
82
|
it 'raises syntax error on error with lack of op' do
|
67
|
-
|
68
|
-
|
83
|
+
e=Expr[1,2]
|
84
|
+
expect { e.result }.to raise_error
|
69
85
|
end
|
70
86
|
|
87
|
+
end
|
88
|
+
|
71
89
|
end
|
72
90
|
|
73
91
|
describe '#dump' do
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
92
|
+
it 'dumps expr to string' do
|
93
|
+
e=Expr[Var['hp'],1,Op['+'],2,Op['*']]
|
94
|
+
expect(e.dump).to eq 'hp 1 + 2 *'
|
95
|
+
end
|
78
96
|
end
|
79
97
|
|
80
98
|
describe '#to_s' do
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
99
|
+
it 'pretty prints for wml file output' do
|
100
|
+
pending('Do not think I need this feature')
|
101
|
+
e=Expr[Var['hp'],1,Op['+'],2,Op['*']]
|
102
|
+
expect(e.to_s).to eq '(hp+1)*2'
|
103
|
+
end
|
86
104
|
end
|
87
105
|
|
88
106
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: wml_action
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Pancho
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-06-
|
11
|
+
date: 2014-06-30 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|