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 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
- multiplicative_expression.as(:right) |
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
- additive_expression.as(:right) |
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
- relational_expression.as(:right) |
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
- equality_expression.as(:right) |
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
- logical_and_expression.as(:right) |
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
- logical_or_expression.as(:right) |
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
- conditional_expression.as(:true) >>
222
- colon >>
223
- conditional_expression.as(:false) |
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
@@ -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(:tree)) {
33
- tree
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
@@ -1,3 +1,3 @@
1
1
  module Kalc
2
- VERSION = "0.5"
2
+ VERSION = "0.5.1"
3
3
  end
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: '0.5'
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-07 00:00:00.000000000 Z
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: &70142802434300 !ruby/object:Gem::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: *70142802434300
24
+ version_requirements: *70319428937140
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: rspec
27
- requirement: &70142802433760 !ruby/object:Gem::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: *70142802433760
35
+ version_requirements: *70319428936560
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: parslet
38
- requirement: &70142802433140 !ruby/object:Gem::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: *70142802433140
46
+ version_requirements: *70319428935920
47
47
  description: Calculation language slightly based on Excel's formula language.
48
48
  email:
49
49
  - mrcsparker@gmail.com