kalc 0.8.1 → 0.9.0

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/Gemfile CHANGED
@@ -1,3 +1,3 @@
1
- source "http://rubygems.org"
1
+ source 'http://rubygems.org'
2
2
 
3
3
  gemspec
data/Gemfile.lock CHANGED
@@ -1,27 +1,28 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- kalc (0.8.0)
5
- parslet (~> 1.4)
4
+ kalc (0.9.0)
5
+ parslet (~> 1.5)
6
6
 
7
7
  GEM
8
8
  remote: http://rubygems.org/
9
9
  specs:
10
10
  blankslate (2.1.2.4)
11
- diff-lcs (1.1.3)
12
- parslet (1.4.0)
11
+ diff-lcs (1.2.4)
12
+ parslet (1.5.0)
13
13
  blankslate (~> 2.0)
14
- rake (0.9.2.2)
15
- rspec (2.11.0)
16
- rspec-core (~> 2.11.0)
17
- rspec-expectations (~> 2.11.0)
18
- rspec-mocks (~> 2.11.0)
19
- rspec-core (2.11.1)
20
- rspec-expectations (2.11.2)
21
- diff-lcs (~> 1.1.3)
22
- rspec-mocks (2.11.2)
14
+ rake (10.1.0)
15
+ rspec (2.14.1)
16
+ rspec-core (~> 2.14.0)
17
+ rspec-expectations (~> 2.14.0)
18
+ rspec-mocks (~> 2.14.0)
19
+ rspec-core (2.14.5)
20
+ rspec-expectations (2.14.2)
21
+ diff-lcs (>= 1.1.3, < 2.0)
22
+ rspec-mocks (2.14.3)
23
23
 
24
24
  PLATFORMS
25
+ java
25
26
  ruby
26
27
 
27
28
  DEPENDENCIES
data/bin/ikalc CHANGED
@@ -3,6 +3,6 @@
3
3
  kalc_dir = File.expand_path(File.join(File.dirname(__FILE__), '..', 'lib'))
4
4
  $LOAD_PATH.unshift(kalc_dir) unless $LOAD_PATH.include?(kalc_dir)
5
5
 
6
- require "kalc"
6
+ require 'kalc'
7
7
 
8
- repl = Kalc::Repl.new.run
8
+ Kalc::Repl.new.run
data/bin/kalc CHANGED
@@ -3,8 +3,8 @@
3
3
  kalc_dir = File.expand_path(File.join(File.dirname(__FILE__), '..', 'lib'))
4
4
  $LOAD_PATH.unshift(kalc_dir) unless $LOAD_PATH.include?(kalc_dir)
5
5
 
6
- require "kalc"
7
- require "pp"
6
+ require 'kalc'
7
+ require 'pp'
8
8
 
9
9
  if ARGV.first
10
10
  input = File.read(ARGV.first)
data/kalc.gemspec CHANGED
@@ -1,25 +1,25 @@
1
1
  # -*- encoding: utf-8 -*-
2
- $:.push File.expand_path("../lib", __FILE__)
3
- require "kalc/version"
2
+ $:.push File.expand_path('../lib', __FILE__)
3
+ require 'kalc/version'
4
4
  #
5
5
  Gem::Specification.new do |s|
6
- s.name = "kalc"
7
- s.version = Kalc::VERSION
8
- s.authors = ["Chris Parker"]
9
- s.email = ["mrcsparker@gmail.com"]
10
- s.homepage = "https://github.com/mrcsparker/kalc"
11
- s.summary = %q{Small calculation language.}
6
+ s.name = 'kalc'
7
+ s.version = Kalc::VERSION
8
+ s.authors = ['Chris Parker']
9
+ s.email = %w(mrcsparker@gmail.com)
10
+ s.homepage = 'https://github.com/mrcsparker/kalc'
11
+ s.summary = %q{Small calculation language.}
12
12
  s.description = %q{Calculation language slightly based on Excel's formula language.}
13
13
 
14
- s.rubyforge_project = "kalc"
14
+ s.rubyforge_project = 'kalc'
15
15
 
16
- s.files = `git ls-files`.split("\n")
17
- s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
18
- s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
19
- s.require_paths = ["lib"]
16
+ s.files = `git ls-files`.split("\n")
17
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
18
+ s.executables = `git ls-files -- bin/*`.split("\n").map { |f| File.basename(f) }
19
+ s.require_paths = %w(lib)
20
20
 
21
21
  # specify any dependencies here; for example:
22
- s.add_development_dependency "rake"
23
- s.add_development_dependency "rspec"
24
- s.add_runtime_dependency "parslet", "~> 1.4"
22
+ s.add_development_dependency 'rake'
23
+ s.add_development_dependency 'rspec'
24
+ s.add_runtime_dependency 'parslet', '~> 1.5'
25
25
  end
data/lib/kalc.rb CHANGED
@@ -11,7 +11,7 @@ require 'kalc/repl'
11
11
 
12
12
  module Kalc
13
13
  class Runner
14
-
14
+
15
15
  attr_accessor :grammar
16
16
  attr_accessor :transform
17
17
  attr_accessor :interpreter
@@ -40,13 +40,13 @@ module Kalc
40
40
 
41
41
  private
42
42
  def load_environment
43
- @log.debug "Loading grammar" if @debug
43
+ @log.debug 'Loading grammar' if @debug
44
44
  @grammar = Kalc::Grammar.new
45
- @log.debug "Loading transform" if @debug
45
+ @log.debug 'Loading transform' if @debug
46
46
  @transform = Kalc::Transform.new
47
- @log.debug "Loading interpreter" if @debug
47
+ @log.debug 'Loading interpreter' if @debug
48
48
  @interpreter = Kalc::Interpreter.new
49
- @log.debug "Loading stdlib" if @debug
49
+ @log.debug 'Loading stdlib' if @debug
50
50
  @interpreter.load_stdlib(@grammar, @transform)
51
51
  end
52
52
  end
data/lib/kalc/ast.rb CHANGED
@@ -117,7 +117,7 @@ module Kalc
117
117
  class Ops
118
118
  attr_reader :left
119
119
  attr_reader :ops
120
-
120
+
121
121
  def initialize(left, ops)
122
122
  @left = left
123
123
  @ops = ops
@@ -145,40 +145,40 @@ module Kalc
145
145
 
146
146
  def eval(context)
147
147
  case @operator.to_s.strip
148
- when '&&'
149
- @left && @right
150
- when 'and'
151
- @left && @right
152
- when '||'
153
- @left || @right
154
- when 'or'
155
- @left || @right
156
- when '<='
157
- @left <= @right
158
- when '>='
159
- @left >= @right
160
- when '='
161
- @left == @right
162
- when '=='
163
- @left == @right
164
- when '!='
165
- @left != @right
166
- when '-'
167
- @left - @right
168
- when '+'
169
- @left + @right
170
- when '^'
171
- @left ** @right
172
- when '*'
173
- @left * @right
174
- when '/'
175
- @left / @right
176
- when '%'
177
- @left % @right
178
- when '<'
179
- @left < @right
180
- when '>'
181
- @left > @right
148
+ when '&&'
149
+ @left && @right
150
+ when 'and'
151
+ @left && @right
152
+ when '||'
153
+ @left || @right
154
+ when 'or'
155
+ @left || @right
156
+ when '<='
157
+ @left <= @right
158
+ when '>='
159
+ @left >= @right
160
+ when '='
161
+ @left == @right
162
+ when '=='
163
+ @left == @right
164
+ when '!='
165
+ @left != @right
166
+ when '-'
167
+ @left - @right
168
+ when '+'
169
+ @left + @right
170
+ when '^'
171
+ @left ** @right
172
+ when '*'
173
+ @left * @right
174
+ when '/'
175
+ @left / @right
176
+ when '%'
177
+ @left % @right
178
+ when '<'
179
+ @left < @right
180
+ when '>'
181
+ @left > @right
182
182
  end
183
183
  end
184
184
  end
@@ -213,6 +213,7 @@ module Kalc
213
213
 
214
214
  class Variable
215
215
  attr_reader :variable
216
+
216
217
  def initialize(variable)
217
218
  @variable = variable
218
219
  end
@@ -12,7 +12,7 @@ module Kalc
12
12
  end
13
13
 
14
14
  def add_function(name, value)
15
- @functions.update({ name.to_s.strip => value })
15
+ @functions.update({name.to_s.strip => value})
16
16
  end
17
17
 
18
18
  def get_function(name)
@@ -26,7 +26,7 @@ module Kalc
26
26
  end
27
27
 
28
28
  def add_variable(name, value)
29
- @variables.update({ name.to_s.strip => value })
29
+ @variables.update({name.to_s.strip => value})
30
30
  value
31
31
  end
32
32
 
data/lib/kalc/grammar.rb CHANGED
@@ -22,7 +22,7 @@ class Kalc::Grammar < Parslet::Parser
22
22
  rule(:new_line) { match('[\n\r]').repeat(1) }
23
23
  rule(:separator) { str(';') >> spaces? }
24
24
 
25
- def self.symbols(symbols)
25
+ def self.symbols(symbols)
26
26
  symbols.each do |name, symbol|
27
27
  rule(name) { str(symbol) >> spaces? }
28
28
  end
@@ -37,21 +37,21 @@ class Kalc::Grammar < Parslet::Parser
37
37
  :question_mark => '?'
38
38
 
39
39
  def self.operators(operators={})
40
- trailing_chars = Hash.new { |hash,symbol| hash[symbol] = [] }
40
+ trailing_chars = Hash.new { |hash, symbol| hash[symbol] = [] }
41
41
 
42
42
  operators.each_value do |symbol|
43
43
  operators.each_value do |op|
44
- if op[0,symbol.length] == symbol
45
- char = op[symbol.length,1]
44
+ if op[0, symbol.length] == symbol
45
+ char = op[symbol.length, 1]
46
46
 
47
- unless (char.nil? || char.empty?)
47
+ unless char.nil? || char.empty?
48
48
  trailing_chars[symbol] << char
49
49
  end
50
50
  end
51
51
  end
52
52
  end
53
53
 
54
- operators.each do |name,symbol|
54
+ operators.each do |name, symbol|
55
55
  trailing = trailing_chars[symbol]
56
56
 
57
57
  if trailing.empty?
@@ -101,12 +101,12 @@ class Kalc::Grammar < Parslet::Parser
101
101
  }
102
102
 
103
103
  rule(:string) {
104
- str('"') >>
105
- (
106
- str('\\') >> any |
107
- str('"').absnt? >> any
108
- ).repeat.as(:string) >>
109
- str('"')
104
+ str('"') >>
105
+ (
106
+ str('\\') >> any |
107
+ str('"').absnt? >> any
108
+ ).repeat.as(:string) >>
109
+ str('"')
110
110
  }
111
111
 
112
112
  rule(:exponent) {
@@ -116,10 +116,10 @@ class Kalc::Grammar < Parslet::Parser
116
116
  # We are using a really broad definition of what a number is.
117
117
  # Numbers can be 1, 1.0, 0.1, 1.0e4, +1.0E10, etc
118
118
  rule(:number) {
119
- (match('[+-]').maybe >>
120
- (str('.') >> digits >> exponent.maybe).as(:number) >> spaces?) |
121
- (match('[+-]').maybe >>
122
- digits >> (str('.') >> digits).maybe >> exponent.maybe).as(:number) >> spaces?
119
+ (match('[+-]').maybe >>
120
+ (str('.') >> digits >> exponent.maybe).as(:number) >> spaces?) |
121
+ (match('[+-]').maybe >>
122
+ digits >> (str('.') >> digits).maybe >> exponent.maybe).as(:number) >> spaces?
123
123
  }
124
124
 
125
125
  rule(:identifier) {
@@ -127,11 +127,11 @@ class Kalc::Grammar < Parslet::Parser
127
127
  }
128
128
 
129
129
  rule(:quoted_identifier) {
130
- str("'") >>
131
- (
132
- str('\\') >> any | str("'").absnt? >> any
133
- ).repeat(1) >>
134
- str("'") >> spaces?
130
+ str("'") >>
131
+ (
132
+ str('\\') >> any | str("'").absnt? >> any
133
+ ).repeat(1) >>
134
+ str("'") >> spaces?
135
135
  }
136
136
 
137
137
  rule(:argument) {
@@ -176,31 +176,31 @@ class Kalc::Grammar < Parslet::Parser
176
176
  }
177
177
 
178
178
  rule(:non_ops_expression) {
179
- (atom.as(:left) >>
180
- power_of >>
181
- atom.as(:right)).as(:non_ops) | atom
179
+ (atom.as(:left) >>
180
+ power_of >>
181
+ atom.as(:right)).as(:non_ops) | atom
182
182
  }
183
183
 
184
184
  # IF(1, 2, 3)
185
185
  # AND(1, 2, ...)
186
186
  rule(:function_call_expression) {
187
187
  (identifier.as(:name) >> paren_variable_list.as(:variable_list)).as(:function_call) |
188
- (str('+') >> non_ops_expression).as(:positive) |
189
- (str('-') >> non_ops_expression).as(:negative) | non_ops_expression
188
+ (str('+') >> non_ops_expression).as(:positive) |
189
+ (str('-') >> non_ops_expression).as(:negative) | non_ops_expression
190
190
  }
191
191
 
192
192
  # 1 + 2
193
193
  rule(:additive_expression) {
194
- multiplicative_expression.as(:left) >>
195
- ((add | subtract) >>
196
- multiplicative_expression.as(:right)).repeat.as(:ops)
194
+ multiplicative_expression.as(:left) >>
195
+ ((add | subtract) >>
196
+ multiplicative_expression.as(:right)).repeat.as(:ops)
197
197
  }
198
198
 
199
199
  # 1 * 2
200
200
  rule(:multiplicative_expression) {
201
- function_call_expression.as(:left) >>
202
- ((multiply | divide | modulus) >>
203
- function_call_expression.as(:right)).repeat.as(:ops)
201
+ function_call_expression.as(:left) >>
202
+ ((multiply | divide | modulus) >>
203
+ function_call_expression.as(:right)).repeat.as(:ops)
204
204
  }
205
205
 
206
206
  # 1 < 2
@@ -208,49 +208,49 @@ class Kalc::Grammar < Parslet::Parser
208
208
  # 1 <= 2
209
209
  # 1 >= 2
210
210
  rule(:relational_expression) {
211
- additive_expression.as(:left) >>
212
- ((less | greater | less_equal | greater_equal) >>
213
- relational_expression.as(:right)).repeat.as(:ops)
211
+ additive_expression.as(:left) >>
212
+ ((less | greater | less_equal | greater_equal) >>
213
+ relational_expression.as(:right)).repeat.as(:ops)
214
214
  }
215
215
 
216
216
  # 1 = 2
217
217
  rule(:equality_expression) {
218
218
  relational_expression.as(:left) >>
219
- ((excel_equal | equal | not_equal) >>
220
- equality_expression.as(:right)).repeat.as(:ops)
219
+ ((excel_equal | equal | not_equal) >>
220
+ equality_expression.as(:right)).repeat.as(:ops)
221
221
  }
222
222
 
223
223
  # 1 && 2
224
224
  rule(:logical_and_expression) {
225
225
  equality_expression.as(:left) >>
226
- ((logical_and | string_and) >>
227
- logical_and_expression.as(:right)).repeat.as(:ops)
226
+ ((logical_and | string_and) >>
227
+ logical_and_expression.as(:right)).repeat.as(:ops)
228
228
  }
229
229
 
230
230
  # 1 || 2
231
231
  rule(:logical_or_expression) {
232
232
  logical_and_expression.as(:left) >>
233
- ((logical_or | string_or) >>
234
- logical_or_expression.as(:right)).repeat.as(:ops)
233
+ ((logical_or | string_or) >>
234
+ logical_or_expression.as(:right)).repeat.as(:ops)
235
235
  }
236
236
 
237
237
  # 1 > 2 ? 3 : 4
238
238
  rule(:conditional_expression) {
239
- logical_or_expression.as(:condition) >>
240
- (question_mark >>
241
- conditional_expression.as(:true_cond) >>
242
- colon >>
243
- conditional_expression.as(:false_cond)).maybe
239
+ logical_or_expression.as(:condition) >>
240
+ (question_mark >>
241
+ conditional_expression.as(:true_cond) >>
242
+ colon >>
243
+ conditional_expression.as(:false_cond)).maybe
244
244
  }
245
245
 
246
246
  # 'a' = 1
247
247
  # We don't allow for nested assignments:
248
248
  # IF('a' = 1, 1, 2)
249
249
  rule(:assignment_expression) {
250
- (variable.as(:identifier) >>
251
- assign >>
252
- assignment_expression.as(:value)).as(:assign) |
253
- conditional_expression
250
+ (variable.as(:identifier) >>
251
+ assign >>
252
+ assignment_expression.as(:value)).as(:assign) |
253
+ conditional_expression
254
254
  }
255
255
 
256
256
  rule(:expression) {
@@ -267,9 +267,9 @@ class Kalc::Grammar < Parslet::Parser
267
267
 
268
268
  rule(:function_definition_expression) {
269
269
  (str('DEFINE') >> spaces? >> identifier.as(:name) >>
270
- paren_argument_list.as(:argument_list) >>
271
- left_brace >> function_body.as(:body) >> right_brace).as(:function_definition) |
272
- expressions.as(:expressions)
270
+ paren_argument_list.as(:argument_list) >>
271
+ left_brace >> function_body.as(:body) >> right_brace).as(:function_definition) |
272
+ expressions.as(:expressions)
273
273
  }
274
274
 
275
275
  rule(:function_definition_expressions) {