linmeric 0.1.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.
- checksums.yaml +7 -0
- data/bin/linmeric +547 -0
- data/doc/Instructions_en.html +231 -0
- data/doc/Instructions_en.txt +208 -0
- data/doc/Instructions_it.html +231 -0
- data/doc/Instructions_it.txt +214 -0
- data/doc/README_en.html +177 -0
- data/doc/README_en.txt +30 -0
- data/doc/README_it.html +187 -0
- data/doc/README_it.txt +32 -0
- data/lib/linmeric/Archive.rb +50 -0
- data/lib/linmeric/CnGal_Matrix_class.rb +358 -0
- data/lib/linmeric/CnGal_new_classes.rb +231 -0
- data/lib/linmeric/CnGal_tools.rb +80 -0
- data/lib/linmeric/Error_print.rb +66 -0
- data/lib/linmeric/Function_class.rb +249 -0
- data/lib/linmeric/Integrators.rb +76 -0
- data/lib/linmeric/LU.rb +84 -0
- data/lib/linmeric/Lexer.rb +54 -0
- data/lib/linmeric/Listener.rb +191 -0
- data/lib/linmeric/Parser.rb +118 -0
- data/lib/linmeric/Scopify.rb +206 -0
- data/lib/linmeric/Sizer.rb +328 -0
- data/lib/linmeric/Token.rb +53 -0
- data/lib/linmeric.rb +10 -0
- metadata +76 -0
checksums.yaml
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
---
|
|
2
|
+
SHA1:
|
|
3
|
+
metadata.gz: 341e267a03b8fea5821479cf3572e1525b80c328
|
|
4
|
+
data.tar.gz: 59fb9adb800c906fdbc186ace484ac4392323c44
|
|
5
|
+
SHA512:
|
|
6
|
+
metadata.gz: 6c57ef652f21153f0b2ad5bccb3c184db5919591535bfe73f809bd68cf38ff7025584e7bf07c3b8339f74a775a4c67d5f5b95dc4e37bcc4bc148200173886933
|
|
7
|
+
data.tar.gz: 288c4ec1de4395995a952e3af6ad96999414a3575d0897c217e4568c723959ab446476ec58d071aefec7b5e631d122dba457bcf993c319b0036d983fd818273d
|
data/bin/linmeric
ADDED
|
@@ -0,0 +1,547 @@
|
|
|
1
|
+
#! /usr/bin/env ruby
|
|
2
|
+
|
|
3
|
+
require "linmeric"
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
@error = false
|
|
7
|
+
@vars = {}
|
|
8
|
+
@operators = {
|
|
9
|
+
:+ => lambda do |a,b|
|
|
10
|
+
a = evaluate(a) if a.is_a? Array
|
|
11
|
+
b = evaluate(b) if b.is_a? Array
|
|
12
|
+
a = replace_var(a) if a.is_a? String
|
|
13
|
+
b = replace_var(b) if b.is_a? String
|
|
14
|
+
unless @error
|
|
15
|
+
if a.similar_to? b then
|
|
16
|
+
return a + b
|
|
17
|
+
elsif a.is_a? Matrix and b.is_a? Matrix then
|
|
18
|
+
t = b.tr
|
|
19
|
+
if a.similar_to? t then
|
|
20
|
+
a += t
|
|
21
|
+
# if a.raised_exception? != nil then
|
|
22
|
+
# puts " " + a.raised_exception?
|
|
23
|
+
# @error = true
|
|
24
|
+
# return nil
|
|
25
|
+
# end
|
|
26
|
+
return a
|
|
27
|
+
else
|
|
28
|
+
puts " Argument Error: Cannot sum #{a.getRws}x#{a.getCls} matrix with #{b.getRws}x#{b.getCls}"#; puts
|
|
29
|
+
@error = true
|
|
30
|
+
return nil
|
|
31
|
+
end
|
|
32
|
+
else
|
|
33
|
+
puts " Math Error: cannot sum #{a.class} with #{b.class}"#; puts
|
|
34
|
+
@error = true
|
|
35
|
+
return nil
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end,
|
|
39
|
+
|
|
40
|
+
:- => lambda do |a,b|
|
|
41
|
+
a = evaluate(a) if a.is_a? Array
|
|
42
|
+
b = evaluate(b) if b.is_a? Array
|
|
43
|
+
a = replace_var(a) if a.is_a? String
|
|
44
|
+
b = replace_var(b) if b.is_a? String
|
|
45
|
+
unless @error
|
|
46
|
+
if (a.is_a? Numeric or a == nil) and b.is_a? Numeric then
|
|
47
|
+
return (a || 0) - b
|
|
48
|
+
elsif a.is_a? Matrix and b.is_a? Matrix then
|
|
49
|
+
if a.similar_to? b then
|
|
50
|
+
a = a - b
|
|
51
|
+
else
|
|
52
|
+
t = b.tr
|
|
53
|
+
if a.similar_to? t then
|
|
54
|
+
a = a - t
|
|
55
|
+
else
|
|
56
|
+
puts " Argument Error: Cannot subtract #{a.getRws}x#{a.getCls} matrix with #{b.getRws}x#{b.getCls}"#; puts
|
|
57
|
+
@error = true
|
|
58
|
+
return nil
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
# if a.raised_exception? != nil then
|
|
62
|
+
# puts " " + a.raised_exception?
|
|
63
|
+
# @error = true
|
|
64
|
+
# return nil
|
|
65
|
+
# else
|
|
66
|
+
return a
|
|
67
|
+
# end
|
|
68
|
+
else
|
|
69
|
+
puts " Math Error: cannot subtract #{a.class} with #{b.class}"#; puts
|
|
70
|
+
@error = true
|
|
71
|
+
return nil
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
end,
|
|
75
|
+
|
|
76
|
+
:"=" => lambda do |a,b|
|
|
77
|
+
a = evaluate(a) if a.is_a? Array
|
|
78
|
+
b = evaluate(b) if b.is_a? Array
|
|
79
|
+
b = replace_var(b) if b.is_a? String
|
|
80
|
+
unless @error
|
|
81
|
+
if a.is_a? Numeric or a.is_a? Matrix then
|
|
82
|
+
a == b ? (puts true) : (puts false);puts
|
|
83
|
+
else
|
|
84
|
+
@vars[a] = b
|
|
85
|
+
if not b.is_a? Matrix then
|
|
86
|
+
print "=> "; b.show#; puts
|
|
87
|
+
else
|
|
88
|
+
puts "=>"
|
|
89
|
+
b.show#; puts
|
|
90
|
+
end
|
|
91
|
+
end
|
|
92
|
+
end
|
|
93
|
+
end,
|
|
94
|
+
|
|
95
|
+
:* => lambda do |a,b|
|
|
96
|
+
a = evaluate(a) if a.is_a? Array
|
|
97
|
+
b = evaluate(b) if b.is_a? Array
|
|
98
|
+
a = replace_var(a) if a.is_a? String
|
|
99
|
+
b = replace_var(b) if b.is_a? String
|
|
100
|
+
unless @error
|
|
101
|
+
if a.can_multiply? b then
|
|
102
|
+
return a * b
|
|
103
|
+
elsif a.is_a? Matrix and b.is_a? Matrix then
|
|
104
|
+
t = b.tr
|
|
105
|
+
if a.can_multiply? t then
|
|
106
|
+
return a * t
|
|
107
|
+
else
|
|
108
|
+
puts " Cannot multiply #{a.getRws}x#{a.getCls} matrix with #{b.getRws}x#{b.getCls}"#; puts
|
|
109
|
+
@error = true
|
|
110
|
+
return nil
|
|
111
|
+
end
|
|
112
|
+
else
|
|
113
|
+
puts " Cannot multiply #{a.class} with #{b.class}"#; puts
|
|
114
|
+
end
|
|
115
|
+
end
|
|
116
|
+
end,
|
|
117
|
+
|
|
118
|
+
:/ => lambda do |a,b|
|
|
119
|
+
a = evaluate(a) if a.is_a? Array
|
|
120
|
+
b = evaluate(b) if b.is_a? Array
|
|
121
|
+
a = replace_var(a) if a.is_a? String
|
|
122
|
+
b = replace_var(b) if b.is_a? String
|
|
123
|
+
unless @error
|
|
124
|
+
if (a.can_divide? b) and b != 0 then
|
|
125
|
+
return a / b.to_f
|
|
126
|
+
#elsif (a.is_a? Matrix and b.s_a? Numeric) or (a.is_a? Numeric and b.is_a? Matrix) then
|
|
127
|
+
# return a / b
|
|
128
|
+
else
|
|
129
|
+
@error = true
|
|
130
|
+
if b == 0 then
|
|
131
|
+
puts " Math Error: division for 0"#; puts
|
|
132
|
+
else
|
|
133
|
+
puts " Math Error: invalid divison between #{a.class} and #{b.class}"#; puts
|
|
134
|
+
end
|
|
135
|
+
return nil
|
|
136
|
+
end
|
|
137
|
+
end
|
|
138
|
+
end,
|
|
139
|
+
|
|
140
|
+
:^ => lambda do |a,b|
|
|
141
|
+
a = evaluate(a) if a.is_a? Array
|
|
142
|
+
b = evaluate(b) if b.is_a? Array
|
|
143
|
+
a = replace_var(a) if a.is_a? String
|
|
144
|
+
b = replace_var(b) if b.is_a? String
|
|
145
|
+
unless @error
|
|
146
|
+
if a != 0 or b != 0 then
|
|
147
|
+
if a.is_a? Numeric and b.is_a? Numeric then
|
|
148
|
+
return a ** b
|
|
149
|
+
elsif (a.is_a? Matrix and b.is_a? Numeric) or (a.is_a? Numeric and b.is_a? Matrix)
|
|
150
|
+
return a ** b
|
|
151
|
+
else
|
|
152
|
+
puts " Math Error: invalid power #{a.class}-#{b.class}"#; puts
|
|
153
|
+
@error = true
|
|
154
|
+
return nil
|
|
155
|
+
end
|
|
156
|
+
else
|
|
157
|
+
puts " Math Error: 0^0"#; puts
|
|
158
|
+
@error = true
|
|
159
|
+
return nil
|
|
160
|
+
end
|
|
161
|
+
end
|
|
162
|
+
end,
|
|
163
|
+
|
|
164
|
+
:> => lambda do |a,b|
|
|
165
|
+
a = evaluate(a) if a.is_a? Array
|
|
166
|
+
a = replace_var(a) if a.is_a? String
|
|
167
|
+
b = b - '"'
|
|
168
|
+
unless @error
|
|
169
|
+
if a.is_a? Matrix then
|
|
170
|
+
a.to_file(b)
|
|
171
|
+
# unless a.raised_exception? == nil
|
|
172
|
+
# puts " " + a.raised_exception?; puts
|
|
173
|
+
# @error = true
|
|
174
|
+
# end
|
|
175
|
+
else
|
|
176
|
+
if Dir.exist? File.dirname(b) then
|
|
177
|
+
File.open(b,"w") do |ln|
|
|
178
|
+
ln.puts "#{a}"
|
|
179
|
+
end
|
|
180
|
+
else
|
|
181
|
+
puts " Argument Error: Invalid directory; Directory not found"#; puts
|
|
182
|
+
@error = true
|
|
183
|
+
end
|
|
184
|
+
end
|
|
185
|
+
end
|
|
186
|
+
return nil
|
|
187
|
+
end,
|
|
188
|
+
|
|
189
|
+
:"t:" => lambda do |a|
|
|
190
|
+
a = evaluate(a) if a.is_a? Array
|
|
191
|
+
a = replace_var(a) if a.is_a? String
|
|
192
|
+
unless @error
|
|
193
|
+
if a.is_a? Matrix then
|
|
194
|
+
return a.tr
|
|
195
|
+
else
|
|
196
|
+
puts " Math Error: cannot traspose a #{a.class} value"#; puts
|
|
197
|
+
@error = true
|
|
198
|
+
return nil
|
|
199
|
+
end
|
|
200
|
+
end
|
|
201
|
+
end,
|
|
202
|
+
|
|
203
|
+
:"det:" => lambda do |a|
|
|
204
|
+
a = evaluate(a) if a.is_a? Array
|
|
205
|
+
a = replace_var(a) if a.is_a? String
|
|
206
|
+
unless @error
|
|
207
|
+
if a.is_a? Matrix then
|
|
208
|
+
if a.is_squared? then
|
|
209
|
+
return a.laplace
|
|
210
|
+
else
|
|
211
|
+
puts " Math Error: determinant on a non-squared Matrix"#; puts
|
|
212
|
+
@error = true
|
|
213
|
+
return nil
|
|
214
|
+
end
|
|
215
|
+
else
|
|
216
|
+
puts " Math Error: determinant on #{a.class} value"#; puts
|
|
217
|
+
@error = true
|
|
218
|
+
return nil
|
|
219
|
+
end
|
|
220
|
+
end
|
|
221
|
+
end,
|
|
222
|
+
|
|
223
|
+
:"norm:" => lambda do |a|
|
|
224
|
+
a = evaluate(a) if a.is_a? Array
|
|
225
|
+
a = replace_var(a) if a.is_a? String
|
|
226
|
+
unless @error
|
|
227
|
+
if a.is_a? Matrix then
|
|
228
|
+
return a.norma
|
|
229
|
+
else
|
|
230
|
+
puts " Math Error: norm on a #{a.class} value"#; puts
|
|
231
|
+
@error = true
|
|
232
|
+
return nil
|
|
233
|
+
end
|
|
234
|
+
end
|
|
235
|
+
end,
|
|
236
|
+
|
|
237
|
+
:"id_mx:" => lambda do |a|
|
|
238
|
+
a = evaluate(a) if a.is_a? Array
|
|
239
|
+
a = replace_var(a) if a.is_a? String
|
|
240
|
+
unless @error
|
|
241
|
+
if a.is_a? Fixnum
|
|
242
|
+
return Matrix.identity(a) if a > 0
|
|
243
|
+
end
|
|
244
|
+
@error = true
|
|
245
|
+
puts " Argument Error: bad value #{a} for Identity Matrix"#; puts
|
|
246
|
+
return nil
|
|
247
|
+
end
|
|
248
|
+
end,
|
|
249
|
+
|
|
250
|
+
:"from:" => lambda do |a|
|
|
251
|
+
a = a - "\"" if a.is_a? String
|
|
252
|
+
return Filename.new(a) if a.is_a? String
|
|
253
|
+
@error = true
|
|
254
|
+
puts " Argument Error: bad filename #{a}"#; puts
|
|
255
|
+
return nil
|
|
256
|
+
end,
|
|
257
|
+
|
|
258
|
+
:"as:" => lambda do |a|
|
|
259
|
+
if a.include? '"' then
|
|
260
|
+
a = a - '"'
|
|
261
|
+
return Function.new(a)
|
|
262
|
+
else
|
|
263
|
+
return replace_var(a)
|
|
264
|
+
end
|
|
265
|
+
end,
|
|
266
|
+
|
|
267
|
+
:"mx:" => lambda do |a,b|
|
|
268
|
+
b = evaluate(b) if b.is_a? Array
|
|
269
|
+
b = replace_var(b) if b.is_a? String
|
|
270
|
+
a = evaluate(a) if a.is_a? Array
|
|
271
|
+
unless a.class == Filename
|
|
272
|
+
if '123456789,"'.contain_all? a then
|
|
273
|
+
a = Dim.new(a)
|
|
274
|
+
if a.sx == nil then
|
|
275
|
+
@error = true
|
|
276
|
+
return nil
|
|
277
|
+
end
|
|
278
|
+
else
|
|
279
|
+
puts "viene"
|
|
280
|
+
puts " Argument Error: invalid range for matrix"
|
|
281
|
+
@error = true
|
|
282
|
+
return nil
|
|
283
|
+
end
|
|
284
|
+
end
|
|
285
|
+
unless @error
|
|
286
|
+
if b == nil then
|
|
287
|
+
case a.class.to_s
|
|
288
|
+
when "Filename"
|
|
289
|
+
m = Matrix.from_file(a)
|
|
290
|
+
when "Dim"
|
|
291
|
+
m = Matrix.new(a.sx,a.dx)
|
|
292
|
+
else
|
|
293
|
+
puts " Argument Error: invalid #{a.class} #{a} found"
|
|
294
|
+
@error = true
|
|
295
|
+
return nil
|
|
296
|
+
end
|
|
297
|
+
else
|
|
298
|
+
unless b.is_a? Function
|
|
299
|
+
@error = true
|
|
300
|
+
return nil
|
|
301
|
+
end
|
|
302
|
+
unless @error
|
|
303
|
+
b = b.to_block(2)
|
|
304
|
+
if b == nil then
|
|
305
|
+
@error = true
|
|
306
|
+
puts " Argument Error: bad function for Matrix"#; puts
|
|
307
|
+
return nil
|
|
308
|
+
end
|
|
309
|
+
m = eval(" Matrix.new(a.sx,a.dx) #{b}")
|
|
310
|
+
end
|
|
311
|
+
end
|
|
312
|
+
# if m.raised_exception? != nil then
|
|
313
|
+
# @error = true
|
|
314
|
+
# puts " " + m.raised_exception?; puts
|
|
315
|
+
# return nil
|
|
316
|
+
# end
|
|
317
|
+
return m
|
|
318
|
+
end
|
|
319
|
+
return nil
|
|
320
|
+
end,
|
|
321
|
+
|
|
322
|
+
:"f:" => lambda do |a|
|
|
323
|
+
a = a - '"'
|
|
324
|
+
a = Function.new(a)
|
|
325
|
+
unless a.ok?
|
|
326
|
+
puts " Argument Error: bad function inserted. Maybe sintax error?"#; puts
|
|
327
|
+
@error = true
|
|
328
|
+
return nil
|
|
329
|
+
end
|
|
330
|
+
return a
|
|
331
|
+
end,
|
|
332
|
+
|
|
333
|
+
:"shw:" => lambda do |a|
|
|
334
|
+
if a.is_a? String then
|
|
335
|
+
a = replace_var(a)
|
|
336
|
+
unless @error
|
|
337
|
+
print "=> " if not a.is_a? Matrix
|
|
338
|
+
puts "=>" if a.is_a? Matrix
|
|
339
|
+
a.show; puts
|
|
340
|
+
return nil
|
|
341
|
+
end
|
|
342
|
+
else
|
|
343
|
+
puts " Argument Error: Bad argument #{a} for 'shw:' command"#; puts
|
|
344
|
+
end
|
|
345
|
+
end,
|
|
346
|
+
|
|
347
|
+
:"shwvar:" => lambda do ||
|
|
348
|
+
if @vars.size > 0
|
|
349
|
+
Tool.print_stack(@vars)
|
|
350
|
+
else
|
|
351
|
+
puts " No variables defined yet"
|
|
352
|
+
end
|
|
353
|
+
end,
|
|
354
|
+
|
|
355
|
+
:"solve:" => lambda do |a,b|
|
|
356
|
+
a = evaluate(a) if a.is_a? Array
|
|
357
|
+
b = evaluate(b) if b.is_a? Array
|
|
358
|
+
a = replace_var(a) if a.is_a? String
|
|
359
|
+
b = replace_var(b) if b.is_a? String
|
|
360
|
+
[a,b].each do |m|
|
|
361
|
+
unless m.is_a? Matrix
|
|
362
|
+
puts " Argument Error: expecting matrix for LU factorization, but '#{m.class}' found"
|
|
363
|
+
@error = true
|
|
364
|
+
return nil
|
|
365
|
+
end
|
|
366
|
+
end
|
|
367
|
+
unless a.is_squared?
|
|
368
|
+
puts " Argument Error: non-squared matrix for LU factorization found"
|
|
369
|
+
@error = true
|
|
370
|
+
return nil
|
|
371
|
+
end
|
|
372
|
+
unless a.getRws == b.getRws
|
|
373
|
+
puts " Argument Error: invalid #{b.getRws}x1 solution for #{a.getRws}x#{a.getCls} matrix"
|
|
374
|
+
@error = true
|
|
375
|
+
return nil
|
|
376
|
+
end
|
|
377
|
+
unless b.getCls == 1
|
|
378
|
+
puts " Argument Error: invalid solution matrix #{b.getRws}x#{b.getCls}"
|
|
379
|
+
@error = true
|
|
380
|
+
return nil
|
|
381
|
+
end
|
|
382
|
+
LU.reset
|
|
383
|
+
solution = LU.factorize(a,b)
|
|
384
|
+
@vars['L'] = LU.L
|
|
385
|
+
@vars['U'] = LU.U
|
|
386
|
+
return solution
|
|
387
|
+
end,
|
|
388
|
+
|
|
389
|
+
:"integ:" => lambda do |f,r,n,m|
|
|
390
|
+
if f.is_a? String then
|
|
391
|
+
if f.include? '"'
|
|
392
|
+
f = f - '"'
|
|
393
|
+
f = Function.new(f)
|
|
394
|
+
unless f.ok?
|
|
395
|
+
@error = true
|
|
396
|
+
puts " Argument Error: bad function for integration"#; puts
|
|
397
|
+
return nil
|
|
398
|
+
end
|
|
399
|
+
else
|
|
400
|
+
f = replace_var(f)
|
|
401
|
+
end
|
|
402
|
+
end
|
|
403
|
+
unless f.is_a? Function
|
|
404
|
+
puts " Argument Error: function for integration expected but #{f.class} found"
|
|
405
|
+
@error = true
|
|
406
|
+
return nil
|
|
407
|
+
end
|
|
408
|
+
r = Dim.new(r)
|
|
409
|
+
if r.sx == nil then
|
|
410
|
+
@error = true
|
|
411
|
+
return nil
|
|
412
|
+
end
|
|
413
|
+
if n <= 0 then
|
|
414
|
+
puts " Argument Error: bad NumPoints for integration"#; puts
|
|
415
|
+
@error = true
|
|
416
|
+
return nil
|
|
417
|
+
end
|
|
418
|
+
unless @error
|
|
419
|
+
if m == nil then
|
|
420
|
+
res = f.integrate(r,n)
|
|
421
|
+
else
|
|
422
|
+
res = f.integrate(r,n,m)
|
|
423
|
+
end
|
|
424
|
+
if res == nil
|
|
425
|
+
@error = true
|
|
426
|
+
return nil
|
|
427
|
+
else
|
|
428
|
+
return res
|
|
429
|
+
end
|
|
430
|
+
end
|
|
431
|
+
end
|
|
432
|
+
|
|
433
|
+
}
|
|
434
|
+
|
|
435
|
+
|
|
436
|
+
|
|
437
|
+
def replace_var(var)
|
|
438
|
+
if @vars.include? var then
|
|
439
|
+
return @vars[var]
|
|
440
|
+
else
|
|
441
|
+
puts " Argument Error: variable '#{var}' not defined"#; puts
|
|
442
|
+
@error = true
|
|
443
|
+
return nil
|
|
444
|
+
end
|
|
445
|
+
end
|
|
446
|
+
|
|
447
|
+
|
|
448
|
+
def evaluate(token_arr)
|
|
449
|
+
return 0 if token_arr.size == 0
|
|
450
|
+
return token_arr[0] if token_arr.size == 1 and !(token_arr[0].is_a? Array) and !(token_arr[0].is_a? Symbol)
|
|
451
|
+
return evaluate(token_arr[0]) if token_arr.size == 1 and token_arr[0].is_a? Array
|
|
452
|
+
for i in 0...token_arr.size
|
|
453
|
+
if token_arr[i].is_a? Symbol then
|
|
454
|
+
if @operators.include? token_arr[i] then
|
|
455
|
+
if Tool.keys.include? token_arr[i].to_s then
|
|
456
|
+
case token_arr[i]
|
|
457
|
+
when :"solve:"
|
|
458
|
+
token_arr[i+2] = @operators[token_arr[i]][token_arr[i+1],token_arr[i+2]]
|
|
459
|
+
when :"mx:"
|
|
460
|
+
token_arr[i+2] = @operators[token_arr[i]][token_arr[i+1],token_arr[i+2]]
|
|
461
|
+
when :"integ:"
|
|
462
|
+
token_arr[i+4] = @operators[token_arr[i]][token_arr[i+1],
|
|
463
|
+
token_arr[i+2],
|
|
464
|
+
token_arr[i+3],
|
|
465
|
+
token_arr[i+4]]
|
|
466
|
+
when :"shwvar:"
|
|
467
|
+
token_arr[i] = @operators[token_arr[i]][]
|
|
468
|
+
else
|
|
469
|
+
token_arr[i+1] = @operators[token_arr[i]][token_arr[i+1]]
|
|
470
|
+
end
|
|
471
|
+
else
|
|
472
|
+
token_arr[i+1] = @operators[token_arr[i]][token_arr[i - 1],token_arr[i + 1]]
|
|
473
|
+
end
|
|
474
|
+
else
|
|
475
|
+
puts " Unknown keyword or operator '#{token_arr[i]}'"#; puts
|
|
476
|
+
@error = true
|
|
477
|
+
return nil
|
|
478
|
+
end
|
|
479
|
+
end
|
|
480
|
+
return nil if @error
|
|
481
|
+
end
|
|
482
|
+
return token_arr[token_arr.size - 1]
|
|
483
|
+
end
|
|
484
|
+
|
|
485
|
+
|
|
486
|
+
|
|
487
|
+
|
|
488
|
+
##############################################
|
|
489
|
+
# BODY #
|
|
490
|
+
##############################################
|
|
491
|
+
|
|
492
|
+
scp = Scp.new
|
|
493
|
+
parser = Parser.new
|
|
494
|
+
reader = Listener.new
|
|
495
|
+
sizer = Sizer.new
|
|
496
|
+
print "Linmeric-main> "
|
|
497
|
+
begin
|
|
498
|
+
string = reader.gets
|
|
499
|
+
while string != "exit"
|
|
500
|
+
if sizer.analyze(string)
|
|
501
|
+
tree = parser.parse(scp.scopify(string.compact))
|
|
502
|
+
unless tree == nil or tree == []
|
|
503
|
+
ev = evaluate(tree)
|
|
504
|
+
ev = replace_var(ev) if ev.is_a? String
|
|
505
|
+
unless (string.include? '=') or (string.include? "shw:" or
|
|
506
|
+
string.include? "shwvar:") or @error
|
|
507
|
+
if ev.is_a? Matrix then
|
|
508
|
+
puts "=>"
|
|
509
|
+
ev.show
|
|
510
|
+
else
|
|
511
|
+
print "=> "; ev.show#; puts
|
|
512
|
+
end
|
|
513
|
+
end
|
|
514
|
+
end
|
|
515
|
+
end
|
|
516
|
+
@error = false
|
|
517
|
+
parser.reset
|
|
518
|
+
print "Linmeric-main> "
|
|
519
|
+
reader.reset
|
|
520
|
+
string = reader.gets
|
|
521
|
+
end
|
|
522
|
+
|
|
523
|
+
rescue => error
|
|
524
|
+
puts error
|
|
525
|
+
retry
|
|
526
|
+
end
|
|
527
|
+
|
|
528
|
+
|
|
529
|
+
|
|
530
|
+
##############################################
|
|
531
|
+
# TESTS #
|
|
532
|
+
##############################################
|
|
533
|
+
=begin
|
|
534
|
+
a = Matrix.new(2,3) {|i,j| i + j}
|
|
535
|
+
b = Matrix.new(3,2) {|i,j| i + j}
|
|
536
|
+
@vars = {"a" => a, "b" => b}
|
|
537
|
+
scopify = Scp.new
|
|
538
|
+
@operators[:"shwvar:" ][]#["2,3",Function.new("i+j")].show
|
|
539
|
+
#puts evaluate(Parser.parse(scopify.scopify('12=3*4')))#.show
|
|
540
|
+
puts @vars
|
|
541
|
+
=end
|
|
542
|
+
|
|
543
|
+
|
|
544
|
+
|
|
545
|
+
|
|
546
|
+
|
|
547
|
+
|