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 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