keisan 0.7.0 → 0.8.4

Sign up to get free protection for your applications and to get access to all the features.
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