maths 0.0.10 → 0.0.11
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +2 -0
- data/lib/maths/calc.rb +101 -84
- data/lib/maths/calc.y +5 -0
- data/lib/maths/percentage.rb +5 -0
- data/lib/maths/version.rb +1 -1
- metadata +1 -1
data/README.md
CHANGED
data/lib/maths/calc.rb
CHANGED
@@ -10,7 +10,7 @@ require 'racc/parser.rb'
|
|
10
10
|
module Maths
|
11
11
|
class Calculator < Racc::Parser
|
12
12
|
|
13
|
-
module_eval(<<'...end calc.y/module_eval...', 'calc.y',
|
13
|
+
module_eval(<<'...end calc.y/module_eval...', 'calc.y', 41)
|
14
14
|
|
15
15
|
def parse(str)
|
16
16
|
@q = []
|
@@ -30,6 +30,9 @@ module_eval(<<'...end calc.y/module_eval...', 'calc.y', 39)
|
|
30
30
|
when /\Aas % of/
|
31
31
|
@q.push [:PERCENTAGE_OF, $&]
|
32
32
|
|
33
|
+
when /\Aas a % change from/
|
34
|
+
@q.push [:PERCENTAGE_TO, $&]
|
35
|
+
|
33
36
|
# special terms
|
34
37
|
when /\Api/
|
35
38
|
@q.push [:NUMBER, BigDecimal.new("3.14159265358979323846264338327")]
|
@@ -67,60 +70,64 @@ module_eval(<<'...end calc.y/module_eval...', 'calc.y', 39)
|
|
67
70
|
##### State transition tables begin ###
|
68
71
|
|
69
72
|
racc_action_table = [
|
70
|
-
9, 16, 13, 14, 15,
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
8,
|
77
|
-
6, nil,
|
78
|
-
9,
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
nil, nil,
|
83
|
-
16, 13, 14, 15, 11, 12,
|
84
|
-
|
73
|
+
9, 16, 13, 14, 15, 9, 6, 10, 22, 23,
|
74
|
+
4, 6, 5, 8, 7, 4, 9, 5, 8, 7,
|
75
|
+
25, 9, 6, nil, nil, nil, 4, 6, 5, 8,
|
76
|
+
20, 4, 9, 5, 8, 20, nil, 9, 6, nil,
|
77
|
+
nil, nil, 4, 6, 5, 8, 20, 4, 9, 5,
|
78
|
+
8, 20, nil, 9, 6, nil, nil, nil, 4, 6,
|
79
|
+
5, 8, 20, 4, 9, 5, 8, 20, nil, 9,
|
80
|
+
6, nil, nil, nil, 4, 6, 5, 8, 20, 4,
|
81
|
+
9, 5, 8, 20, nil, 9, 6, nil, nil, nil,
|
82
|
+
4, 6, 5, 8, 20, 4, 9, 5, 8, 20,
|
83
|
+
nil, nil, 6, nil, nil, nil, 4, nil, 5, 8,
|
84
|
+
20, 16, 13, 14, 15, 11, 12, 17, 18, nil,
|
85
|
+
nil, nil, 35, 16, 13, 14, 15, 11, 12, 17,
|
86
|
+
18, nil, nil, 34, 16, 13, 14, 15, 11, 12,
|
87
|
+
17, 18, 16, 13, 14, 15, 11, 12, 17, 18,
|
88
|
+
16, 13, 14, 15, 11, 12, 17, 18, 16, 13,
|
89
|
+
14, 15, 11, 12, 17, 16, 13, 14, 15 ]
|
85
90
|
|
86
91
|
racc_action_check = [
|
87
|
-
0,
|
88
|
-
|
89
|
-
|
90
|
-
4,
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
12, 11,
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
nil, nil,
|
100
|
-
|
101
|
-
|
92
|
+
0, 27, 27, 27, 27, 23, 0, 1, 6, 7,
|
93
|
+
0, 23, 0, 0, 0, 23, 18, 23, 23, 23,
|
94
|
+
10, 4, 18, nil, nil, nil, 18, 4, 18, 18,
|
95
|
+
18, 4, 5, 4, 4, 4, nil, 17, 5, nil,
|
96
|
+
nil, nil, 5, 17, 5, 5, 5, 17, 16, 17,
|
97
|
+
17, 17, nil, 9, 16, nil, nil, nil, 16, 9,
|
98
|
+
16, 16, 16, 9, 15, 9, 9, 9, nil, 11,
|
99
|
+
15, nil, nil, nil, 15, 11, 15, 15, 15, 11,
|
100
|
+
12, 11, 11, 11, nil, 13, 12, nil, nil, nil,
|
101
|
+
12, 13, 12, 12, 12, 13, 14, 13, 13, 13,
|
102
|
+
nil, nil, 14, nil, nil, nil, 14, nil, 14, 14,
|
103
|
+
14, 21, 21, 21, 21, 21, 21, 21, 21, nil,
|
104
|
+
nil, nil, 21, 19, 19, 19, 19, 19, 19, 19,
|
105
|
+
19, nil, nil, 19, 36, 36, 36, 36, 36, 36,
|
106
|
+
36, 36, 2, 2, 2, 2, 2, 2, 2, 2,
|
107
|
+
33, 33, 33, 33, 33, 33, 33, 33, 32, 32,
|
108
|
+
32, 32, 32, 32, 32, 26, 26, 26, 26 ]
|
102
109
|
|
103
110
|
racc_action_pointer = [
|
104
|
-
-3, 7,
|
105
|
-
|
106
|
-
|
107
|
-
nil,
|
111
|
+
-3, 7, 138, nil, 18, 29, -8, -3, nil, 50,
|
112
|
+
20, 66, 77, 82, 93, 61, 45, 34, 13, 119,
|
113
|
+
nil, 107, nil, 2, nil, nil, 161, -3, nil, nil,
|
114
|
+
nil, nil, 154, 146, nil, nil, 130, nil ]
|
108
115
|
|
109
116
|
racc_action_default = [
|
110
|
-
-3, -
|
111
|
-
-
|
112
|
-
-
|
113
|
-
-9, -16, -10, -11, -
|
117
|
+
-3, -20, -1, -2, -20, -20, -20, -13, -14, -20,
|
118
|
+
-20, -20, -20, -20, -20, -20, -20, -20, -20, -20,
|
119
|
+
-13, -20, -12, -20, -15, 38, -4, -5, -6, -7,
|
120
|
+
-8, -9, -16, -17, -10, -11, -18, -19 ]
|
114
121
|
|
115
122
|
racc_goto_table = [
|
116
|
-
3, 2, 1, nil, nil,
|
117
|
-
|
118
|
-
nil, nil,
|
123
|
+
3, 2, 1, nil, nil, 19, 21, nil, nil, nil,
|
124
|
+
24, nil, 26, 27, 28, 29, 30, 31, 32, 33,
|
125
|
+
nil, nil, nil, 37, 36 ]
|
119
126
|
|
120
127
|
racc_goto_check = [
|
121
128
|
3, 2, 1, nil, nil, 2, 2, nil, nil, nil,
|
122
|
-
2, nil, 2, 2, 2, 2, 2, 2, 2,
|
123
|
-
nil, nil, 3, 2 ]
|
129
|
+
2, nil, 2, 2, 2, 2, 2, 2, 2, 2,
|
130
|
+
nil, nil, nil, 3, 2 ]
|
124
131
|
|
125
132
|
racc_goto_pointer = [
|
126
133
|
nil, 2, 1, 0 ]
|
@@ -130,28 +137,29 @@ racc_goto_default = [
|
|
130
137
|
|
131
138
|
racc_reduce_table = [
|
132
139
|
0, 0, :racc_error,
|
133
|
-
1, 18, :_reduce_none,
|
134
|
-
1, 18, :_reduce_none,
|
135
|
-
0, 18, :_reduce_3,
|
136
|
-
3, 19, :_reduce_4,
|
137
|
-
3, 19, :_reduce_5,
|
138
|
-
3, 19, :_reduce_6,
|
139
|
-
3, 19, :_reduce_7,
|
140
|
-
3, 19, :_reduce_8,
|
141
|
-
3, 19, :_reduce_9,
|
142
|
-
3, 19, :_reduce_10,
|
143
|
-
3, 19, :_reduce_11,
|
144
|
-
2, 19, :_reduce_12,
|
145
|
-
1, 19, :_reduce_13,
|
146
140
|
1, 19, :_reduce_none,
|
147
|
-
|
148
|
-
|
141
|
+
1, 19, :_reduce_none,
|
142
|
+
0, 19, :_reduce_3,
|
143
|
+
3, 20, :_reduce_4,
|
144
|
+
3, 20, :_reduce_5,
|
145
|
+
3, 20, :_reduce_6,
|
146
|
+
3, 20, :_reduce_7,
|
147
|
+
3, 20, :_reduce_8,
|
148
|
+
3, 20, :_reduce_9,
|
149
|
+
3, 20, :_reduce_10,
|
150
|
+
3, 20, :_reduce_11,
|
151
|
+
2, 20, :_reduce_12,
|
152
|
+
1, 20, :_reduce_13,
|
153
|
+
1, 20, :_reduce_none,
|
154
|
+
2, 20, :_reduce_15,
|
155
|
+
3, 20, :_reduce_16,
|
149
156
|
3, 20, :_reduce_17,
|
150
|
-
3,
|
157
|
+
3, 21, :_reduce_18,
|
158
|
+
3, 21, :_reduce_19 ]
|
151
159
|
|
152
|
-
racc_reduce_n =
|
160
|
+
racc_reduce_n = 20
|
153
161
|
|
154
|
-
racc_shift_n =
|
162
|
+
racc_shift_n = 38
|
155
163
|
|
156
164
|
racc_token_table = {
|
157
165
|
false => 0,
|
@@ -165,14 +173,15 @@ racc_token_table = {
|
|
165
173
|
"+" => 8,
|
166
174
|
"-" => 9,
|
167
175
|
:PERCENTAGE_OF => 10,
|
168
|
-
|
169
|
-
"
|
170
|
-
"
|
171
|
-
"
|
172
|
-
|
173
|
-
:
|
176
|
+
:PERCENTAGE_TO => 11,
|
177
|
+
"=" => 12,
|
178
|
+
"(" => 13,
|
179
|
+
")" => 14,
|
180
|
+
"|" => 15,
|
181
|
+
:NUMBER => 16,
|
182
|
+
:VARIABLE => 17 }
|
174
183
|
|
175
|
-
racc_nt_base =
|
184
|
+
racc_nt_base = 18
|
176
185
|
|
177
186
|
racc_use_result_var = true
|
178
187
|
|
@@ -204,6 +213,7 @@ Racc_token_to_s_table = [
|
|
204
213
|
"\"+\"",
|
205
214
|
"\"-\"",
|
206
215
|
"PERCENTAGE_OF",
|
216
|
+
"PERCENTAGE_TO",
|
207
217
|
"\"=\"",
|
208
218
|
"\"(\"",
|
209
219
|
"\")\"",
|
@@ -225,77 +235,77 @@ Racc_debug_parser = false
|
|
225
235
|
|
226
236
|
# reduce 2 omitted
|
227
237
|
|
228
|
-
module_eval(<<'.,.,', 'calc.y',
|
238
|
+
module_eval(<<'.,.,', 'calc.y', 14)
|
229
239
|
def _reduce_3(val, _values, result)
|
230
240
|
result = 0
|
231
241
|
result
|
232
242
|
end
|
233
243
|
.,.,
|
234
244
|
|
235
|
-
module_eval(<<'.,.,', 'calc.y',
|
245
|
+
module_eval(<<'.,.,', 'calc.y', 16)
|
236
246
|
def _reduce_4(val, _values, result)
|
237
247
|
result += val[2]
|
238
248
|
result
|
239
249
|
end
|
240
250
|
.,.,
|
241
251
|
|
242
|
-
module_eval(<<'.,.,', 'calc.y',
|
252
|
+
module_eval(<<'.,.,', 'calc.y', 17)
|
243
253
|
def _reduce_5(val, _values, result)
|
244
254
|
result -= val[2]
|
245
255
|
result
|
246
256
|
end
|
247
257
|
.,.,
|
248
258
|
|
249
|
-
module_eval(<<'.,.,', 'calc.y',
|
259
|
+
module_eval(<<'.,.,', 'calc.y', 18)
|
250
260
|
def _reduce_6(val, _values, result)
|
251
261
|
result *= val[2]
|
252
262
|
result
|
253
263
|
end
|
254
264
|
.,.,
|
255
265
|
|
256
|
-
module_eval(<<'.,.,', 'calc.y',
|
266
|
+
module_eval(<<'.,.,', 'calc.y', 19)
|
257
267
|
def _reduce_7(val, _values, result)
|
258
268
|
result /= val[2]
|
259
269
|
result
|
260
270
|
end
|
261
271
|
.,.,
|
262
272
|
|
263
|
-
module_eval(<<'.,.,', 'calc.y',
|
273
|
+
module_eval(<<'.,.,', 'calc.y', 20)
|
264
274
|
def _reduce_8(val, _values, result)
|
265
275
|
result %= val[2]
|
266
276
|
result
|
267
277
|
end
|
268
278
|
.,.,
|
269
279
|
|
270
|
-
module_eval(<<'.,.,', 'calc.y',
|
280
|
+
module_eval(<<'.,.,', 'calc.y', 21)
|
271
281
|
def _reduce_9(val, _values, result)
|
272
282
|
result = result.power(val[2])
|
273
283
|
result
|
274
284
|
end
|
275
285
|
.,.,
|
276
286
|
|
277
|
-
module_eval(<<'.,.,', 'calc.y',
|
287
|
+
module_eval(<<'.,.,', 'calc.y', 22)
|
278
288
|
def _reduce_10(val, _values, result)
|
279
289
|
result = val[1]
|
280
290
|
result
|
281
291
|
end
|
282
292
|
.,.,
|
283
293
|
|
284
|
-
module_eval(<<'.,.,', 'calc.y',
|
294
|
+
module_eval(<<'.,.,', 'calc.y', 23)
|
285
295
|
def _reduce_11(val, _values, result)
|
286
296
|
result = val[1].abs
|
287
297
|
result
|
288
298
|
end
|
289
299
|
.,.,
|
290
300
|
|
291
|
-
module_eval(<<'.,.,', 'calc.y',
|
301
|
+
module_eval(<<'.,.,', 'calc.y', 24)
|
292
302
|
def _reduce_12(val, _values, result)
|
293
303
|
result = -val[1]
|
294
304
|
result
|
295
305
|
end
|
296
306
|
.,.,
|
297
307
|
|
298
|
-
module_eval(<<'.,.,', 'calc.y',
|
308
|
+
module_eval(<<'.,.,', 'calc.y', 25)
|
299
309
|
def _reduce_13(val, _values, result)
|
300
310
|
result = Brain.lookup(val[0])
|
301
311
|
result
|
@@ -304,14 +314,14 @@ module_eval(<<'.,.,', 'calc.y', 24)
|
|
304
314
|
|
305
315
|
# reduce 14 omitted
|
306
316
|
|
307
|
-
module_eval(<<'.,.,', 'calc.y',
|
317
|
+
module_eval(<<'.,.,', 'calc.y', 27)
|
308
318
|
def _reduce_15(val, _values, result)
|
309
319
|
result = Maths::Functions.exec(val[0], val[1])
|
310
320
|
result
|
311
321
|
end
|
312
322
|
.,.,
|
313
323
|
|
314
|
-
module_eval(<<'.,.,', 'calc.y',
|
324
|
+
module_eval(<<'.,.,', 'calc.y', 28)
|
315
325
|
def _reduce_16(val, _values, result)
|
316
326
|
result = Percentage.build(val[0], val[2])
|
317
327
|
result
|
@@ -320,18 +330,25 @@ module_eval(<<'.,.,', 'calc.y', 27)
|
|
320
330
|
|
321
331
|
module_eval(<<'.,.,', 'calc.y', 29)
|
322
332
|
def _reduce_17(val, _values, result)
|
323
|
-
result =
|
333
|
+
result = Percentage.change(val[2], val[0])
|
324
334
|
result
|
325
335
|
end
|
326
336
|
.,.,
|
327
337
|
|
328
|
-
module_eval(<<'.,.,', 'calc.y',
|
338
|
+
module_eval(<<'.,.,', 'calc.y', 31)
|
329
339
|
def _reduce_18(val, _values, result)
|
330
340
|
result = Brain.assign(val[0], val[2])
|
331
341
|
result
|
332
342
|
end
|
333
343
|
.,.,
|
334
344
|
|
345
|
+
module_eval(<<'.,.,', 'calc.y', 32)
|
346
|
+
def _reduce_19(val, _values, result)
|
347
|
+
result = Brain.assign(val[0], val[2])
|
348
|
+
result
|
349
|
+
end
|
350
|
+
.,.,
|
351
|
+
|
335
352
|
def _reduce_none(val, _values, result)
|
336
353
|
val[0]
|
337
354
|
end
|
data/lib/maths/calc.y
CHANGED
@@ -6,6 +6,7 @@ class Calculator
|
|
6
6
|
left "^" "*" '/' '%'
|
7
7
|
left "+" "-"
|
8
8
|
right PERCENTAGE_OF
|
9
|
+
right PERCENTAGE_TO
|
9
10
|
right "="
|
10
11
|
preclow
|
11
12
|
rule
|
@@ -26,6 +27,7 @@ rule
|
|
26
27
|
| NUMBER
|
27
28
|
| FUNC exp { result = Maths::Functions.exec(val[0], val[1]) }
|
28
29
|
| exp PERCENTAGE_OF exp { result = Percentage.build(val[0], val[2]) }
|
30
|
+
| exp PERCENTAGE_TO exp { result = Percentage.change(val[2], val[0]) }
|
29
31
|
|
30
32
|
assign: VARIABLE "=" exp { result = Brain.assign(val[0], val[2]) }
|
31
33
|
| VARIABLE "=" assign { result = Brain.assign(val[0], val[2]) }
|
@@ -55,6 +57,9 @@ module Maths
|
|
55
57
|
when /\Aas % of/
|
56
58
|
@q.push [:PERCENTAGE_OF, $&]
|
57
59
|
|
60
|
+
when /\Aas a % change from/
|
61
|
+
@q.push [:PERCENTAGE_TO, $&]
|
62
|
+
|
58
63
|
# special terms
|
59
64
|
when /\Api/
|
60
65
|
@q.push [:NUMBER, BigDecimal.new("3.14159265358979323846264338327")]
|
data/lib/maths/percentage.rb
CHANGED
@@ -9,5 +9,10 @@ module Maths
|
|
9
9
|
denominator = BigDecimal.new(denominator.to_s)
|
10
10
|
Percentage.new(((numerator / denominator) * 100).to_s)
|
11
11
|
end
|
12
|
+
|
13
|
+
# Public: Calculates the % change of from to to
|
14
|
+
def self.change(from, to)
|
15
|
+
Percentage.new((((to / from) - 1) * 100).to_s)
|
16
|
+
end
|
12
17
|
end
|
13
18
|
end
|
data/lib/maths/version.rb
CHANGED