keisan 0.7.0 → 0.8.4

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.
Files changed (69) hide show
  1. checksums.yaml +5 -5
  2. data/.travis.yml +6 -3
  3. data/README.md +47 -3
  4. data/keisan.gemspec +5 -5
  5. data/lib/keisan.rb +9 -3
  6. data/lib/keisan/ast.rb +25 -0
  7. data/lib/keisan/ast/bitwise_left_shift.rb +17 -0
  8. data/lib/keisan/ast/bitwise_right_shift.rb +17 -0
  9. data/lib/keisan/ast/block.rb +4 -0
  10. data/lib/keisan/ast/boolean.rb +1 -1
  11. data/lib/keisan/ast/builder.rb +2 -2
  12. data/lib/keisan/ast/cell.rb +10 -0
  13. data/lib/keisan/ast/date.rb +23 -0
  14. data/lib/keisan/ast/date_time_methods.rb +75 -0
  15. data/lib/keisan/ast/function.rb +9 -0
  16. data/lib/keisan/ast/function_assignment.rb +16 -6
  17. data/lib/keisan/ast/hash.rb +4 -0
  18. data/lib/keisan/ast/logical_and.rb +20 -3
  19. data/lib/keisan/ast/logical_equal.rb +6 -5
  20. data/lib/keisan/ast/logical_greater_than.rb +6 -4
  21. data/lib/keisan/ast/logical_greater_than_or_equal_to.rb +6 -4
  22. data/lib/keisan/ast/logical_less_than.rb +6 -4
  23. data/lib/keisan/ast/logical_less_than_or_equal_to.rb +6 -4
  24. data/lib/keisan/ast/logical_not_equal.rb +6 -5
  25. data/lib/keisan/ast/logical_operator.rb +24 -0
  26. data/lib/keisan/ast/logical_or.rb +18 -1
  27. data/lib/keisan/ast/node.rb +25 -0
  28. data/lib/keisan/ast/number.rb +24 -0
  29. data/lib/keisan/ast/operator.rb +3 -1
  30. data/lib/keisan/ast/parent.rb +5 -1
  31. data/lib/keisan/ast/plus.rb +10 -0
  32. data/lib/keisan/ast/time.rb +23 -0
  33. data/lib/keisan/ast/unary_inverse.rb +1 -1
  34. data/lib/keisan/ast/unary_operator.rb +1 -1
  35. data/lib/keisan/ast/variable.rb +10 -9
  36. data/lib/keisan/calculator.rb +17 -3
  37. data/lib/keisan/context.rb +27 -10
  38. data/lib/keisan/evaluator.rb +16 -4
  39. data/lib/keisan/exceptions.rb +3 -0
  40. data/lib/keisan/function.rb +6 -0
  41. data/lib/keisan/functions/break.rb +11 -0
  42. data/lib/keisan/functions/cmath_function.rb +3 -1
  43. data/lib/keisan/functions/continue.rb +11 -0
  44. data/lib/keisan/functions/default_registry.rb +39 -0
  45. data/lib/keisan/functions/enumerable_function.rb +10 -2
  46. data/lib/keisan/functions/expression_function.rb +16 -9
  47. data/lib/keisan/functions/filter.rb +6 -0
  48. data/lib/keisan/functions/loop_control_flow_function.rb +22 -0
  49. data/lib/keisan/functions/map.rb +6 -0
  50. data/lib/keisan/functions/proc_function.rb +2 -2
  51. data/lib/keisan/functions/reduce.rb +5 -0
  52. data/lib/keisan/functions/replace.rb +6 -6
  53. data/lib/keisan/functions/while.rb +7 -1
  54. data/lib/keisan/parser.rb +7 -5
  55. data/lib/keisan/parsing/bitwise_left_shift.rb +9 -0
  56. data/lib/keisan/parsing/bitwise_right_shift.rb +9 -0
  57. data/lib/keisan/parsing/function.rb +1 -1
  58. data/lib/keisan/parsing/hash.rb +2 -2
  59. data/lib/keisan/string_and_group_parser.rb +229 -0
  60. data/lib/keisan/token.rb +1 -1
  61. data/lib/keisan/tokenizer.rb +20 -18
  62. data/lib/keisan/tokens/assignment.rb +3 -1
  63. data/lib/keisan/tokens/bitwise_shift.rb +23 -0
  64. data/lib/keisan/tokens/group.rb +1 -7
  65. data/lib/keisan/tokens/string.rb +2 -4
  66. data/lib/keisan/util.rb +19 -0
  67. data/lib/keisan/variables/default_registry.rb +2 -1
  68. data/lib/keisan/version.rb +1 -1
  69. metadata +40 -28
@@ -13,7 +13,9 @@ module Keisan
13
13
  \% |
14
14
  \& |
15
15
  \| |
16
- \^
16
+ \^ |
17
+ \<\< |
18
+ \>\>
17
19
  )?
18
20
  \=
19
21
  (?!\=) # negative lookahead to prevent matching ==
@@ -0,0 +1,23 @@
1
+ module Keisan
2
+ module Tokens
3
+ class BitwiseShift < Operator
4
+ LEFT_SHIFT = /(?:<<)/
5
+ RIGHT_SHIFT = /(?:>>)/
6
+
7
+ REGEX = /(#{LEFT_SHIFT}|#{RIGHT_SHIFT})/
8
+
9
+ def self.regex
10
+ REGEX
11
+ end
12
+
13
+ def operator_type
14
+ case string
15
+ when LEFT_SHIFT
16
+ :<<
17
+ when RIGHT_SHIFT
18
+ :>>
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -1,19 +1,13 @@
1
1
  module Keisan
2
2
  module Tokens
3
3
  class Group < Token
4
- REGEX = /(\((?:[^\[\]\(\)\{\}]*+\g<1>*+)*+\)|\[(?:[^\[\]\(\)\{\}]*+\g<1>*+)*+\]|\{(?:[^\[\]\(\)\{\}]*+\g<1>*+)*+\})/
5
-
6
4
  attr_reader :sub_tokens
7
5
 
8
6
  def initialize(string)
9
- super
7
+ @string = string
10
8
  @sub_tokens = Tokenizer.new(string[1...-1]).tokens
11
9
  end
12
10
 
13
- def self.regex
14
- REGEX
15
- end
16
-
17
11
  # Either :round, :square
18
12
  def group_type
19
13
  case string[0]
@@ -1,10 +1,8 @@
1
1
  module Keisan
2
2
  module Tokens
3
3
  class String < Token
4
- REGEX = /(\"[^\"]*\"|\'[^\']*\')/
5
-
6
- def self.regex
7
- REGEX
4
+ def initialize(string)
5
+ @string = string
8
6
  end
9
7
 
10
8
  def value
@@ -0,0 +1,19 @@
1
+ module Keisan
2
+ class Util
3
+ def self.underscore(str)
4
+ str.to_s.gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2').downcase
5
+ end
6
+
7
+ def self.array_split(array, &block)
8
+ array.inject([[]]) do |results, element|
9
+ if yield(element)
10
+ results << []
11
+ else
12
+ results.last << element
13
+ end
14
+
15
+ results
16
+ end
17
+ end
18
+ end
19
+ end
@@ -4,7 +4,8 @@ module Keisan
4
4
  VARIABLES = {
5
5
  "PI" => Math::PI,
6
6
  "E" => Math::E,
7
- "I" => Complex(0,1)
7
+ "I" => Complex(0,1),
8
+ "INF" => Float::INFINITY
8
9
  }
9
10
 
10
11
  def self.registry
@@ -1,3 +1,3 @@
1
1
  module Keisan
2
- VERSION = "0.7.0"
2
+ VERSION = "0.8.4"
3
3
  end
metadata CHANGED
@@ -1,71 +1,57 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: keisan
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.0
4
+ version: 0.8.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Christopher Locke
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-01-29 00:00:00.000000000 Z
11
+ date: 2020-07-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: activesupport
14
+ name: cmath
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ">="
17
+ - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: 4.2.2
19
+ version: '1.0'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - ">="
25
- - !ruby/object:Gem::Version
26
- version: 4.2.2
27
- - !ruby/object:Gem::Dependency
28
- name: coveralls
29
- requirement: !ruby/object:Gem::Requirement
30
- requirements:
31
- - - ">="
32
- - !ruby/object:Gem::Version
33
- version: '0'
34
- type: :development
35
- prerelease: false
36
- version_requirements: !ruby/object:Gem::Requirement
37
- requirements:
38
- - - ">="
24
+ - - "~>"
39
25
  - !ruby/object:Gem::Version
40
- version: '0'
26
+ version: '1.0'
41
27
  - !ruby/object:Gem::Dependency
42
28
  name: bundler
43
29
  requirement: !ruby/object:Gem::Requirement
44
30
  requirements:
45
31
  - - "~>"
46
32
  - !ruby/object:Gem::Version
47
- version: '1.14'
33
+ version: '2.0'
48
34
  type: :development
49
35
  prerelease: false
50
36
  version_requirements: !ruby/object:Gem::Requirement
51
37
  requirements:
52
38
  - - "~>"
53
39
  - !ruby/object:Gem::Version
54
- version: '1.14'
40
+ version: '2.0'
55
41
  - !ruby/object:Gem::Dependency
56
42
  name: rake
57
43
  requirement: !ruby/object:Gem::Requirement
58
44
  requirements:
59
45
  - - "~>"
60
46
  - !ruby/object:Gem::Version
61
- version: '10.0'
47
+ version: '13.0'
62
48
  type: :development
63
49
  prerelease: false
64
50
  version_requirements: !ruby/object:Gem::Requirement
65
51
  requirements:
66
52
  - - "~>"
67
53
  - !ruby/object:Gem::Version
68
- version: '10.0'
54
+ version: '13.0'
69
55
  - !ruby/object:Gem::Dependency
70
56
  name: rspec
71
57
  requirement: !ruby/object:Gem::Requirement
@@ -108,6 +94,20 @@ dependencies:
108
94
  - - ">="
109
95
  - !ruby/object:Gem::Version
110
96
  version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: simplecov
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
111
  description: A library for parsing equations into an abstract syntax tree for evaluation
112
112
  email:
113
113
  - project.eutopia@gmail.com
@@ -131,8 +131,10 @@ files:
131
131
  - lib/keisan/ast/arithmetic_operator.rb
132
132
  - lib/keisan/ast/assignment.rb
133
133
  - lib/keisan/ast/bitwise_and.rb
134
+ - lib/keisan/ast/bitwise_left_shift.rb
134
135
  - lib/keisan/ast/bitwise_operator.rb
135
136
  - lib/keisan/ast/bitwise_or.rb
137
+ - lib/keisan/ast/bitwise_right_shift.rb
136
138
  - lib/keisan/ast/bitwise_xor.rb
137
139
  - lib/keisan/ast/block.rb
138
140
  - lib/keisan/ast/boolean.rb
@@ -140,6 +142,8 @@ files:
140
142
  - lib/keisan/ast/cell.rb
141
143
  - lib/keisan/ast/cell_assignment.rb
142
144
  - lib/keisan/ast/constant_literal.rb
145
+ - lib/keisan/ast/date.rb
146
+ - lib/keisan/ast/date_time_methods.rb
143
147
  - lib/keisan/ast/exponent.rb
144
148
  - lib/keisan/ast/function.rb
145
149
  - lib/keisan/ast/function_assignment.rb
@@ -166,6 +170,7 @@ files:
166
170
  - lib/keisan/ast/parent.rb
167
171
  - lib/keisan/ast/plus.rb
168
172
  - lib/keisan/ast/string.rb
173
+ - lib/keisan/ast/time.rb
169
174
  - lib/keisan/ast/times.rb
170
175
  - lib/keisan/ast/unary_bitwise_not.rb
171
176
  - lib/keisan/ast/unary_identity.rb
@@ -182,8 +187,10 @@ files:
182
187
  - lib/keisan/exceptions.rb
183
188
  - lib/keisan/function.rb
184
189
  - lib/keisan/functions/abs.rb
190
+ - lib/keisan/functions/break.rb
185
191
  - lib/keisan/functions/cbrt.rb
186
192
  - lib/keisan/functions/cmath_function.rb
193
+ - lib/keisan/functions/continue.rb
187
194
  - lib/keisan/functions/cos.rb
188
195
  - lib/keisan/functions/cosh.rb
189
196
  - lib/keisan/functions/cot.rb
@@ -201,6 +208,7 @@ files:
201
208
  - lib/keisan/functions/imag.rb
202
209
  - lib/keisan/functions/let.rb
203
210
  - lib/keisan/functions/log.rb
211
+ - lib/keisan/functions/loop_control_flow_function.rb
204
212
  - lib/keisan/functions/map.rb
205
213
  - lib/keisan/functions/math_function.rb
206
214
  - lib/keisan/functions/proc_function.rb
@@ -227,10 +235,12 @@ files:
227
235
  - lib/keisan/parsing/arithmetic_operator.rb
228
236
  - lib/keisan/parsing/assignment.rb
229
237
  - lib/keisan/parsing/bitwise_and.rb
238
+ - lib/keisan/parsing/bitwise_left_shift.rb
230
239
  - lib/keisan/parsing/bitwise_not.rb
231
240
  - lib/keisan/parsing/bitwise_not_not.rb
232
241
  - lib/keisan/parsing/bitwise_operator.rb
233
242
  - lib/keisan/parsing/bitwise_or.rb
243
+ - lib/keisan/parsing/bitwise_right_shift.rb
234
244
  - lib/keisan/parsing/bitwise_xor.rb
235
245
  - lib/keisan/parsing/boolean.rb
236
246
  - lib/keisan/parsing/component.rb
@@ -274,11 +284,13 @@ files:
274
284
  - lib/keisan/parsing/unary_plus.rb
275
285
  - lib/keisan/parsing/variable.rb
276
286
  - lib/keisan/repl.rb
287
+ - lib/keisan/string_and_group_parser.rb
277
288
  - lib/keisan/token.rb
278
289
  - lib/keisan/tokenizer.rb
279
290
  - lib/keisan/tokens/arithmetic_operator.rb
280
291
  - lib/keisan/tokens/assignment.rb
281
292
  - lib/keisan/tokens/bitwise_operator.rb
293
+ - lib/keisan/tokens/bitwise_shift.rb
282
294
  - lib/keisan/tokens/boolean.rb
283
295
  - lib/keisan/tokens/colon.rb
284
296
  - lib/keisan/tokens/comma.rb
@@ -292,6 +304,7 @@ files:
292
304
  - lib/keisan/tokens/string.rb
293
305
  - lib/keisan/tokens/unknown.rb
294
306
  - lib/keisan/tokens/word.rb
307
+ - lib/keisan/util.rb
295
308
  - lib/keisan/variables/default_registry.rb
296
309
  - lib/keisan/variables/registry.rb
297
310
  - lib/keisan/version.rb
@@ -308,15 +321,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
308
321
  requirements:
309
322
  - - ">="
310
323
  - !ruby/object:Gem::Version
311
- version: 2.0.0
324
+ version: 2.3.0
312
325
  required_rubygems_version: !ruby/object:Gem::Requirement
313
326
  requirements:
314
327
  - - ">="
315
328
  - !ruby/object:Gem::Version
316
329
  version: '0'
317
330
  requirements: []
318
- rubyforge_project:
319
- rubygems_version: 2.6.14
331
+ rubygems_version: 3.0.3
320
332
  signing_key:
321
333
  specification_version: 4
322
334
  summary: An equation parser and evaluator