kalc 0.5 → 0.5.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/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
|