trxl 0.1.9 → 0.1.10
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/VERSION +1 -1
- data/lib/trxl/trxl.rb +29 -0
- data/lib/trxl/trxl_grammar.rb +189 -31
- data/lib/trxl/trxl_grammar.treetop +27 -26
- data/spec/trxl/builtins_spec.rb +11 -0
- data/trxl.gemspec +1 -1
- metadata +3 -3
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.1.
|
1
|
+
0.1.10
|
data/lib/trxl/trxl.rb
CHANGED
@@ -313,6 +313,35 @@ module Trxl
|
|
313
313
|
|
314
314
|
end
|
315
315
|
|
316
|
+
module Builtin
|
317
|
+
|
318
|
+
def self.avg(values)
|
319
|
+
strict = true
|
320
|
+
nr_of_vals = 0
|
321
|
+
strict_flag = values.first
|
322
|
+
if strict_flag.is_a?(TrueClass) || strict_flag.is_a?(FalseClass)
|
323
|
+
values.shift
|
324
|
+
strict = strict_flag
|
325
|
+
end
|
326
|
+
|
327
|
+
# if all values are nil return nil
|
328
|
+
return nil if values.compact.size == 0
|
329
|
+
|
330
|
+
s = values.inject(0) do |sum, next_val|
|
331
|
+
sum + if next_val.is_a?(Array)
|
332
|
+
next_val.flatten.inject(0) do |next_sum, val|
|
333
|
+
nr_of_vals += 1 if val && (strict || (!strict && val != 0))
|
334
|
+
next_sum + (val || 0)
|
335
|
+
end
|
336
|
+
else
|
337
|
+
nr_of_vals += 1 if next_val && (strict || (!strict && next_val != 0))
|
338
|
+
next_val || 0
|
339
|
+
end
|
340
|
+
end
|
341
|
+
(s != 0 && nr_of_vals != 0) ? s.to_f / nr_of_vals : 0
|
342
|
+
end
|
343
|
+
end
|
344
|
+
|
316
345
|
module StdLib
|
317
346
|
|
318
347
|
FOREACH_IN = <<-PROGRAM
|
data/lib/trxl/trxl_grammar.rb
CHANGED
@@ -4861,20 +4861,25 @@ module Trxl
|
|
4861
4861
|
if r17
|
4862
4862
|
r0 = r17
|
4863
4863
|
else
|
4864
|
-
r18 =
|
4864
|
+
r18 = _nt_compact_avg_function
|
4865
4865
|
if r18
|
4866
4866
|
r0 = r18
|
4867
4867
|
else
|
4868
|
-
r19 =
|
4868
|
+
r19 = _nt_is_empty_function
|
4869
4869
|
if r19
|
4870
4870
|
r0 = r19
|
4871
4871
|
else
|
4872
|
-
r20 =
|
4872
|
+
r20 = _nt_matching_ids_function
|
4873
4873
|
if r20
|
4874
4874
|
r0 = r20
|
4875
4875
|
else
|
4876
|
-
|
4877
|
-
|
4876
|
+
r21 = _nt_values_of_type_function
|
4877
|
+
if r21
|
4878
|
+
r0 = r21
|
4879
|
+
else
|
4880
|
+
@index = i0
|
4881
|
+
r0 = nil
|
4882
|
+
end
|
4878
4883
|
end
|
4879
4884
|
end
|
4880
4885
|
end
|
@@ -4934,7 +4939,7 @@ module Trxl
|
|
4934
4939
|
help << " SUM, MULT, AVG, PRINT, PRINT_LINE\n"
|
4935
4940
|
help << " TO_INT, TO_FLOAT, TO_ARRAY, AVG_SUM\n"
|
4936
4941
|
help << " MATCHING_IDS, VALUES_OF_TYPE, COMPACT\n"
|
4937
|
-
help << " IS_EMPTY\n"
|
4942
|
+
help << " IS_EMPTY, COMPACT_AVG\n"
|
4938
4943
|
help << "-----------------------------------------\n"
|
4939
4944
|
help << "7) Standard library functions:\n"
|
4940
4945
|
help << " foreach_in, inject, map, select\n"
|
@@ -7082,36 +7087,16 @@ module Trxl
|
|
7082
7087
|
|
7083
7088
|
module AvgFunction2
|
7084
7089
|
def eval(env = Environment.new)
|
7085
|
-
|
7086
|
-
nr_of_vals = 0
|
7087
|
-
values = expressions
|
7088
|
-
strict_flag = values[0].eval(env)
|
7089
|
-
if strict_flag.is_a?(TrueClass) || strict_flag.is_a?(FalseClass)
|
7090
|
-
values.shift
|
7091
|
-
strict = strict_flag
|
7092
|
-
end
|
7093
|
-
|
7094
|
-
# if all values are nil return nil
|
7095
|
-
values = values.map { |v| v.eval(env) }
|
7096
|
-
return nil if values.compact.size == 0
|
7097
|
-
|
7098
|
-
s = values.inject(0) do |sum, next_val|
|
7099
|
-
sum + if next_val.is_a?(Array)
|
7100
|
-
next_val.flatten.inject(0) do |next_sum, val|
|
7101
|
-
nr_of_vals += 1 if val && (strict || (!strict && val != 0))
|
7102
|
-
next_sum + (val || 0)
|
7103
|
-
end
|
7104
|
-
else
|
7105
|
-
nr_of_vals += 1 if next_val && (strict || (!strict && next_val != 0))
|
7106
|
-
next_val || 0
|
7107
|
-
end
|
7108
|
-
end
|
7109
|
-
(s != 0 && nr_of_vals != 0) ? s.to_f / nr_of_vals : 0
|
7090
|
+
Trxl::Builtin.avg(values(env))
|
7110
7091
|
end
|
7111
7092
|
|
7112
7093
|
def expressions
|
7113
7094
|
[ expression ] + more_expressions.elements.map { |e| e.expression }
|
7114
7095
|
end
|
7096
|
+
|
7097
|
+
def values(env)
|
7098
|
+
expressions.map { |e| e.eval(env) }
|
7099
|
+
end
|
7115
7100
|
end
|
7116
7101
|
|
7117
7102
|
module AvgFunction3
|
@@ -7297,6 +7282,179 @@ module Trxl
|
|
7297
7282
|
r0
|
7298
7283
|
end
|
7299
7284
|
|
7285
|
+
module CompactAvgFunction0
|
7286
|
+
def space1
|
7287
|
+
elements[1]
|
7288
|
+
end
|
7289
|
+
|
7290
|
+
def space2
|
7291
|
+
elements[3]
|
7292
|
+
end
|
7293
|
+
|
7294
|
+
def expression
|
7295
|
+
elements[4]
|
7296
|
+
end
|
7297
|
+
|
7298
|
+
def space3
|
7299
|
+
elements[5]
|
7300
|
+
end
|
7301
|
+
|
7302
|
+
end
|
7303
|
+
|
7304
|
+
module CompactAvgFunction1
|
7305
|
+
def eval(env = Environment.new)
|
7306
|
+
values = values(env)
|
7307
|
+
values.any? ? Trxl::Builtin.avg(values) : nil
|
7308
|
+
end
|
7309
|
+
|
7310
|
+
def values(env)
|
7311
|
+
expression.eval(env).compact
|
7312
|
+
end
|
7313
|
+
end
|
7314
|
+
|
7315
|
+
module CompactAvgFunction2
|
7316
|
+
def space1
|
7317
|
+
elements[1]
|
7318
|
+
end
|
7319
|
+
|
7320
|
+
def space2
|
7321
|
+
elements[3]
|
7322
|
+
end
|
7323
|
+
|
7324
|
+
end
|
7325
|
+
|
7326
|
+
module CompactAvgFunction3
|
7327
|
+
def eval(env = Environment.new)
|
7328
|
+
nil
|
7329
|
+
end
|
7330
|
+
end
|
7331
|
+
|
7332
|
+
def _nt_compact_avg_function
|
7333
|
+
start_index = index
|
7334
|
+
if node_cache[:compact_avg_function].has_key?(index)
|
7335
|
+
cached = node_cache[:compact_avg_function][index]
|
7336
|
+
if cached
|
7337
|
+
cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
|
7338
|
+
@index = cached.interval.end
|
7339
|
+
end
|
7340
|
+
return cached
|
7341
|
+
end
|
7342
|
+
|
7343
|
+
i0 = index
|
7344
|
+
i1, s1 = index, []
|
7345
|
+
if has_terminal?('COMPACT_AVG', false, index)
|
7346
|
+
r2 = instantiate_node(SyntaxNode,input, index...(index + 11))
|
7347
|
+
@index += 11
|
7348
|
+
else
|
7349
|
+
terminal_parse_failure('COMPACT_AVG')
|
7350
|
+
r2 = nil
|
7351
|
+
end
|
7352
|
+
s1 << r2
|
7353
|
+
if r2
|
7354
|
+
r3 = _nt_space
|
7355
|
+
s1 << r3
|
7356
|
+
if r3
|
7357
|
+
if has_terminal?('(', false, index)
|
7358
|
+
r4 = instantiate_node(SyntaxNode,input, index...(index + 1))
|
7359
|
+
@index += 1
|
7360
|
+
else
|
7361
|
+
terminal_parse_failure('(')
|
7362
|
+
r4 = nil
|
7363
|
+
end
|
7364
|
+
s1 << r4
|
7365
|
+
if r4
|
7366
|
+
r5 = _nt_space
|
7367
|
+
s1 << r5
|
7368
|
+
if r5
|
7369
|
+
r6 = _nt_expression
|
7370
|
+
s1 << r6
|
7371
|
+
if r6
|
7372
|
+
r7 = _nt_space
|
7373
|
+
s1 << r7
|
7374
|
+
if r7
|
7375
|
+
if has_terminal?(')', false, index)
|
7376
|
+
r8 = instantiate_node(SyntaxNode,input, index...(index + 1))
|
7377
|
+
@index += 1
|
7378
|
+
else
|
7379
|
+
terminal_parse_failure(')')
|
7380
|
+
r8 = nil
|
7381
|
+
end
|
7382
|
+
s1 << r8
|
7383
|
+
end
|
7384
|
+
end
|
7385
|
+
end
|
7386
|
+
end
|
7387
|
+
end
|
7388
|
+
end
|
7389
|
+
if s1.last
|
7390
|
+
r1 = instantiate_node(SyntaxNode,input, i1...index, s1)
|
7391
|
+
r1.extend(CompactAvgFunction0)
|
7392
|
+
r1.extend(CompactAvgFunction1)
|
7393
|
+
else
|
7394
|
+
@index = i1
|
7395
|
+
r1 = nil
|
7396
|
+
end
|
7397
|
+
if r1
|
7398
|
+
r0 = r1
|
7399
|
+
else
|
7400
|
+
i9, s9 = index, []
|
7401
|
+
if has_terminal?('COMPACT_AVG', false, index)
|
7402
|
+
r10 = instantiate_node(SyntaxNode,input, index...(index + 11))
|
7403
|
+
@index += 11
|
7404
|
+
else
|
7405
|
+
terminal_parse_failure('COMPACT_AVG')
|
7406
|
+
r10 = nil
|
7407
|
+
end
|
7408
|
+
s9 << r10
|
7409
|
+
if r10
|
7410
|
+
r11 = _nt_space
|
7411
|
+
s9 << r11
|
7412
|
+
if r11
|
7413
|
+
if has_terminal?('(', false, index)
|
7414
|
+
r12 = instantiate_node(SyntaxNode,input, index...(index + 1))
|
7415
|
+
@index += 1
|
7416
|
+
else
|
7417
|
+
terminal_parse_failure('(')
|
7418
|
+
r12 = nil
|
7419
|
+
end
|
7420
|
+
s9 << r12
|
7421
|
+
if r12
|
7422
|
+
r13 = _nt_space
|
7423
|
+
s9 << r13
|
7424
|
+
if r13
|
7425
|
+
if has_terminal?(')', false, index)
|
7426
|
+
r14 = instantiate_node(SyntaxNode,input, index...(index + 1))
|
7427
|
+
@index += 1
|
7428
|
+
else
|
7429
|
+
terminal_parse_failure(')')
|
7430
|
+
r14 = nil
|
7431
|
+
end
|
7432
|
+
s9 << r14
|
7433
|
+
end
|
7434
|
+
end
|
7435
|
+
end
|
7436
|
+
end
|
7437
|
+
if s9.last
|
7438
|
+
r9 = instantiate_node(SyntaxNode,input, i9...index, s9)
|
7439
|
+
r9.extend(CompactAvgFunction2)
|
7440
|
+
r9.extend(CompactAvgFunction3)
|
7441
|
+
else
|
7442
|
+
@index = i9
|
7443
|
+
r9 = nil
|
7444
|
+
end
|
7445
|
+
if r9
|
7446
|
+
r0 = r9
|
7447
|
+
else
|
7448
|
+
@index = i0
|
7449
|
+
r0 = nil
|
7450
|
+
end
|
7451
|
+
end
|
7452
|
+
|
7453
|
+
node_cache[:compact_avg_function][start_index] = r0
|
7454
|
+
|
7455
|
+
r0
|
7456
|
+
end
|
7457
|
+
|
7300
7458
|
module AvgSumFunction0
|
7301
7459
|
def space1
|
7302
7460
|
elements[0]
|
@@ -827,6 +827,8 @@ grammar Trxl
|
|
827
827
|
/
|
828
828
|
compact_function
|
829
829
|
/
|
830
|
+
compact_avg_function
|
831
|
+
/
|
830
832
|
is_empty_function
|
831
833
|
/
|
832
834
|
matching_ids_function
|
@@ -868,7 +870,7 @@ grammar Trxl
|
|
868
870
|
help << " SUM, MULT, AVG, PRINT, PRINT_LINE\n"
|
869
871
|
help << " TO_INT, TO_FLOAT, TO_ARRAY, AVG_SUM\n"
|
870
872
|
help << " MATCHING_IDS, VALUES_OF_TYPE, COMPACT\n"
|
871
|
-
help << " IS_EMPTY\n"
|
873
|
+
help << " IS_EMPTY, COMPACT_AVG\n"
|
872
874
|
help << "-----------------------------------------\n"
|
873
875
|
help << "7) Standard library functions:\n"
|
874
876
|
help << " foreach_in, inject, map, select\n"
|
@@ -1211,36 +1213,16 @@ grammar Trxl
|
|
1211
1213
|
rule avg_function
|
1212
1214
|
'AVG' space '(' space expression more_expressions:( space ',' space expression)* space ')' {
|
1213
1215
|
def eval(env = Environment.new)
|
1214
|
-
|
1215
|
-
nr_of_vals = 0
|
1216
|
-
values = expressions
|
1217
|
-
strict_flag = values[0].eval(env)
|
1218
|
-
if strict_flag.is_a?(TrueClass) || strict_flag.is_a?(FalseClass)
|
1219
|
-
values.shift
|
1220
|
-
strict = strict_flag
|
1221
|
-
end
|
1222
|
-
|
1223
|
-
# if all values are nil return nil
|
1224
|
-
values = values.map { |v| v.eval(env) }
|
1225
|
-
return nil if values.compact.size == 0
|
1226
|
-
|
1227
|
-
s = values.inject(0) do |sum, next_val|
|
1228
|
-
sum + if next_val.is_a?(Array)
|
1229
|
-
next_val.flatten.inject(0) do |next_sum, val|
|
1230
|
-
nr_of_vals += 1 if val && (strict || (!strict && val != 0))
|
1231
|
-
next_sum + (val || 0)
|
1232
|
-
end
|
1233
|
-
else
|
1234
|
-
nr_of_vals += 1 if next_val && (strict || (!strict && next_val != 0))
|
1235
|
-
next_val || 0
|
1236
|
-
end
|
1237
|
-
end
|
1238
|
-
(s != 0 && nr_of_vals != 0) ? s.to_f / nr_of_vals : 0
|
1216
|
+
Trxl::Builtin.avg(values(env))
|
1239
1217
|
end
|
1240
1218
|
|
1241
1219
|
def expressions
|
1242
1220
|
[ expression ] + more_expressions.elements.map { |e| e.expression }
|
1243
1221
|
end
|
1222
|
+
|
1223
|
+
def values(env)
|
1224
|
+
expressions.map { |e| e.eval(env) }
|
1225
|
+
end
|
1244
1226
|
}
|
1245
1227
|
/
|
1246
1228
|
'AVG' space '(' space ')' {
|
@@ -1250,6 +1232,25 @@ grammar Trxl
|
|
1250
1232
|
}
|
1251
1233
|
end
|
1252
1234
|
|
1235
|
+
rule compact_avg_function
|
1236
|
+
'COMPACT_AVG' space '(' space expression space ')' {
|
1237
|
+
def eval(env = Environment.new)
|
1238
|
+
values = values(env)
|
1239
|
+
values.any? ? Trxl::Builtin.avg(values) : nil
|
1240
|
+
end
|
1241
|
+
|
1242
|
+
def values(env)
|
1243
|
+
expression.eval(env).compact
|
1244
|
+
end
|
1245
|
+
}
|
1246
|
+
/
|
1247
|
+
'COMPACT_AVG' space '(' space ')' {
|
1248
|
+
def eval(env = Environment.new)
|
1249
|
+
nil
|
1250
|
+
end
|
1251
|
+
}
|
1252
|
+
end
|
1253
|
+
|
1253
1254
|
rule avg_sum_function
|
1254
1255
|
'AVG_SUM' space '(' space expression more_expressions:( space ',' space expression)* space ')' {
|
1255
1256
|
def eval(env = Environment.new)
|
data/spec/trxl/builtins_spec.rb
CHANGED
@@ -189,6 +189,17 @@ describe "The language" do
|
|
189
189
|
eval(program).should == 4
|
190
190
|
end
|
191
191
|
|
192
|
+
it "should provide COMPACT_AVG in order to compact an array before calculating its AVG value" do
|
193
|
+
program = "COMPACT_AVG([1,2,3])"
|
194
|
+
eval(program).should == 2
|
195
|
+
program = "COMPACT_AVG([1, NULL])"
|
196
|
+
eval(program).should == 1
|
197
|
+
program = "COMPACT_AVG([NULL])"
|
198
|
+
eval(program).should == nil
|
199
|
+
program = "COMPACT_AVG([NULL, NULL])"
|
200
|
+
eval(program).should == nil
|
201
|
+
end
|
202
|
+
|
192
203
|
it "should be able to calculate AVG_SUM for an arbitrary number of argument expressions" do
|
193
204
|
program = "AVG_SUM([1,2,3],[4,4,4],[6,6,6])"
|
194
205
|
eval(program).should == 12
|
data/trxl.gemspec
CHANGED
@@ -5,7 +5,7 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{trxl}
|
8
|
-
s.version = "0.1.
|
8
|
+
s.version = "0.1.10"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = [%q{Martin Gamsjaeger (snusnu)}, %q{Michael Aufreiter}]
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: trxl
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 15
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 1
|
9
|
-
-
|
10
|
-
version: 0.1.
|
9
|
+
- 10
|
10
|
+
version: 0.1.10
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Martin Gamsjaeger (snusnu)
|