kalc 0.5 → 0.5.1
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/kalc/ast.rb +18 -4
- data/lib/kalc/grammar.rb +17 -24
- data/lib/kalc/transform.rb +16 -12
- data/lib/kalc/version.rb +1 -1
- metadata +8 -8
data/lib/kalc/ast.rb
CHANGED
@@ -58,6 +58,24 @@ module Kalc
|
|
58
58
|
end
|
59
59
|
end
|
60
60
|
|
61
|
+
class Ops
|
62
|
+
attr_reader :left
|
63
|
+
attr_reader :ops
|
64
|
+
|
65
|
+
def initialize(left, ops)
|
66
|
+
@left = left
|
67
|
+
@ops = ops
|
68
|
+
end
|
69
|
+
|
70
|
+
def eval(context)
|
71
|
+
@ops.inject(@left.eval(context)) { |x, op|
|
72
|
+
a = Arithmetic.new(x, op[:right].eval(context), op[:operator])
|
73
|
+
a.eval(context)
|
74
|
+
}
|
75
|
+
end
|
76
|
+
|
77
|
+
end
|
78
|
+
|
61
79
|
class Arithmetic
|
62
80
|
attr_reader :left
|
63
81
|
attr_reader :right
|
@@ -70,10 +88,6 @@ module Kalc
|
|
70
88
|
end
|
71
89
|
|
72
90
|
def eval(context)
|
73
|
-
|
74
|
-
@left = @left.eval(context)
|
75
|
-
@right = @right.eval(context)
|
76
|
-
|
77
91
|
case @operator.to_s.strip
|
78
92
|
when '&&'
|
79
93
|
@left && @right
|
data/lib/kalc/grammar.rb
CHANGED
@@ -165,18 +165,16 @@ class Kalc::Grammar < Parslet::Parser
|
|
165
165
|
|
166
166
|
# 1 * 2
|
167
167
|
rule(:multiplicative_expression) {
|
168
|
-
function_call_expression.as(:left) >>
|
169
|
-
(power_of | multiply | divide | modulus) >>
|
170
|
-
|
171
|
-
function_call_expression
|
168
|
+
function_call_expression.as(:left) >>
|
169
|
+
((power_of | multiply | divide | modulus) >>
|
170
|
+
multiplicative_expression.as(:right)).repeat.as(:ops)
|
172
171
|
}
|
173
172
|
|
174
173
|
# 1 + 2
|
175
174
|
rule(:additive_expression) {
|
176
175
|
multiplicative_expression.as(:left) >>
|
177
|
-
(add | subtract) >>
|
178
|
-
|
179
|
-
multiplicative_expression
|
176
|
+
((add | subtract) >>
|
177
|
+
additive_expression.as(:right)).repeat.as(:ops)
|
180
178
|
}
|
181
179
|
|
182
180
|
# 1 < 2
|
@@ -185,43 +183,38 @@ class Kalc::Grammar < Parslet::Parser
|
|
185
183
|
# 1 >= 2
|
186
184
|
rule(:relational_expression) {
|
187
185
|
additive_expression.as(:left) >>
|
188
|
-
(less | greater | less_equal | greater_equal) >>
|
189
|
-
|
190
|
-
additive_expression
|
186
|
+
((less | greater | less_equal | greater_equal) >>
|
187
|
+
relational_expression.as(:right)).repeat.as(:ops)
|
191
188
|
}
|
192
189
|
|
193
190
|
# 1 == 2
|
194
191
|
rule(:equality_expression) {
|
195
192
|
relational_expression.as(:left) >>
|
196
|
-
(equal | not_equal) >>
|
197
|
-
|
198
|
-
relational_expression
|
193
|
+
((equal | not_equal) >>
|
194
|
+
equality_expression.as(:right)).repeat.as(:ops)
|
199
195
|
}
|
200
196
|
|
201
197
|
# 1 && 2
|
202
198
|
rule(:logical_and_expression) {
|
203
199
|
equality_expression.as(:left) >>
|
204
|
-
(logical_and | string_and) >>
|
205
|
-
|
206
|
-
equality_expression
|
200
|
+
((logical_and | string_and) >>
|
201
|
+
logical_and_expression.as(:right)).repeat.as(:ops)
|
207
202
|
}
|
208
203
|
|
209
204
|
# 1 || 2
|
210
205
|
rule(:logical_or_expression) {
|
211
206
|
logical_and_expression.as(:left) >>
|
212
|
-
(logical_or | string_or) >>
|
213
|
-
|
214
|
-
logical_and_expression
|
207
|
+
((logical_or | string_or) >>
|
208
|
+
logical_or_expression.as(:right)).repeat.as(:ops)
|
215
209
|
}
|
216
210
|
|
217
211
|
# 1 > 2 ? 3 : 4
|
218
212
|
rule(:conditional_expression) {
|
219
213
|
logical_or_expression.as(:condition) >>
|
220
|
-
question_mark >>
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
-
logical_or_expression
|
214
|
+
(question_mark >>
|
215
|
+
conditional_expression.as(:true) >>
|
216
|
+
colon >>
|
217
|
+
conditional_expression.as(:false)).maybe
|
225
218
|
}
|
226
219
|
|
227
220
|
# 'a' = 1
|
data/lib/kalc/transform.rb
CHANGED
@@ -1,6 +1,18 @@
|
|
1
1
|
module Kalc
|
2
2
|
class Transform < Parslet::Transform
|
3
|
-
|
3
|
+
|
4
|
+
rule(:condition => subtree(:condition)) {
|
5
|
+
condition
|
6
|
+
}
|
7
|
+
|
8
|
+
rule(:left => subtree(:left), :ops => []) {
|
9
|
+
left
|
10
|
+
}
|
11
|
+
|
12
|
+
rule(:right => subtree(:right), :ops => []) {
|
13
|
+
right
|
14
|
+
}
|
15
|
+
|
4
16
|
rule(:commands => sequence(:commands)) {
|
5
17
|
Ast::Commands.new(commands)
|
6
18
|
}
|
@@ -16,7 +28,7 @@ module Kalc
|
|
16
28
|
rule(:expressions => simple(:expressions)) {
|
17
29
|
Ast::Expressions.new([expressions])
|
18
30
|
}
|
19
|
-
|
31
|
+
|
20
32
|
rule(:string => simple(:string)) {
|
21
33
|
Ast::StringValue.new(string)
|
22
34
|
}
|
@@ -29,16 +41,8 @@ module Kalc
|
|
29
41
|
Ast::FloatingPointNumber.new(number)
|
30
42
|
}
|
31
43
|
|
32
|
-
rule(:left => subtree(:
|
33
|
-
|
34
|
-
}
|
35
|
-
|
36
|
-
rule(:right => subtree(:tree)) {
|
37
|
-
tree
|
38
|
-
}
|
39
|
-
|
40
|
-
rule(:line => subtree(:tree)) {
|
41
|
-
tree
|
44
|
+
rule(:left => simple(:left), :ops => subtree(:ops)) {
|
45
|
+
Ast::Ops.new(left, ops)
|
42
46
|
}
|
43
47
|
|
44
48
|
rule(:left => simple(:left), :right => simple(:right), :operator => simple(:operator)) {
|
data/lib/kalc/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: kalc
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 0.5.1
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-03-
|
12
|
+
date: 2012-03-08 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rake
|
16
|
-
requirement: &
|
16
|
+
requirement: &70319428937140 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: '0'
|
22
22
|
type: :development
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *70319428937140
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: rspec
|
27
|
-
requirement: &
|
27
|
+
requirement: &70319428936560 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ! '>='
|
@@ -32,10 +32,10 @@ dependencies:
|
|
32
32
|
version: '0'
|
33
33
|
type: :development
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *70319428936560
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: parslet
|
38
|
-
requirement: &
|
38
|
+
requirement: &70319428935920 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - ~>
|
@@ -43,7 +43,7 @@ dependencies:
|
|
43
43
|
version: '1.3'
|
44
44
|
type: :runtime
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *70319428935920
|
47
47
|
description: Calculation language slightly based on Excel's formula language.
|
48
48
|
email:
|
49
49
|
- mrcsparker@gmail.com
|