eleetscript 0.0.8a → 0.0.9a
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 +4 -4
- data/lib/engine/eleet_to_ruby_wrapper.rb +9 -1
- data/lib/engine/engine.rb +111 -32
- data/lib/engine/ruby_to_eleet_wrapper.rb +9 -1
- data/lib/engine/values.rb +6 -2
- data/lib/lang/grammar.y +10 -4
- data/lib/lang/interpreter.rb +32 -14
- data/lib/lang/lexer.rb +9 -1
- data/lib/lang/nodes.rb +6 -0
- data/lib/lang/parser.output +10851 -10574
- data/lib/lang/parser.rb +1242 -1153
- data/lib/lang/runtime/base_classes.rb +43 -0
- data/lib/lang/runtime/eleetscript/object.es +4 -0
- data/lib/lang/runtime/eleetscript/regex.es +11 -0
- data/lib/lang/runtime/eleetscript/string.es +22 -0
- data/lib/lang/runtime/memory.rb +148 -2
- metadata +3 -2
@@ -28,4 +28,47 @@ module EleetScript
|
|
28
28
|
@hash_value.clear
|
29
29
|
end
|
30
30
|
end
|
31
|
+
|
32
|
+
class ESRegex < Regexp
|
33
|
+
attr_writer :global
|
34
|
+
|
35
|
+
class << self
|
36
|
+
def from_regex(regex)
|
37
|
+
ESRegex.new(regex.source, regex.flags)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def initialize(pattern, flags = nil)
|
42
|
+
flag_num = 0
|
43
|
+
if flags.is_a?(String)
|
44
|
+
flags = flags ? flags.chars : []
|
45
|
+
@global = true if flags.include?("g")
|
46
|
+
flag_num |= Regexp::IGNORECASE if flags.include?("i")
|
47
|
+
flag_num |= Regexp::MULTILINE if flags.include?("m")
|
48
|
+
else
|
49
|
+
flag_num = flags
|
50
|
+
end
|
51
|
+
super(pattern, flag_num)
|
52
|
+
end
|
53
|
+
|
54
|
+
def global?
|
55
|
+
@global || false
|
56
|
+
end
|
57
|
+
|
58
|
+
def ignorecase?
|
59
|
+
options & Regexp::IGNORECASE == Regexp::IGNORECASE
|
60
|
+
end
|
61
|
+
|
62
|
+
def multiline?
|
63
|
+
options & Regexp::MULTILINE == Regexp::MULTILINE
|
64
|
+
end
|
65
|
+
|
66
|
+
def flags
|
67
|
+
flags = ""
|
68
|
+
flags += "m" if options & Regexp::MULTILINE == Regexp::MULTILINE
|
69
|
+
flags += "i" if options & Regexp::IGNORECASE == Regexp::IGNORECASE
|
70
|
+
flags += "g" if global?
|
71
|
+
flags
|
72
|
+
end
|
73
|
+
end
|
31
74
|
end
|
@@ -28,6 +28,28 @@ class String
|
|
28
28
|
self
|
29
29
|
end
|
30
30
|
|
31
|
+
replace_all do |pattern, replacement|
|
32
|
+
if pattern.kind_of?(Regex)
|
33
|
+
pattern.global = yes
|
34
|
+
replace(pattern, replacement)
|
35
|
+
else
|
36
|
+
pattern = r"%pattern"g
|
37
|
+
replace(pattern, replacement)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
=~ do |rx|
|
42
|
+
if rx.kind_of?(Regex)
|
43
|
+
match?(rx)
|
44
|
+
else
|
45
|
+
false
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
match? do |rx|
|
50
|
+
match(rx).length > 0
|
51
|
+
end
|
52
|
+
|
31
53
|
inspect do
|
32
54
|
"\"" + self + "\""
|
33
55
|
end
|
data/lib/lang/runtime/memory.rb
CHANGED
@@ -16,6 +16,7 @@ module EleetScript
|
|
16
16
|
"Enumerable" => nil,
|
17
17
|
"List" => "Enumerable",
|
18
18
|
"String" => "Enumerable",
|
19
|
+
"Regex" => nil,
|
19
20
|
"IO" => nil,
|
20
21
|
"Lambda" => nil,
|
21
22
|
"TrueClass" => nil,
|
@@ -54,6 +55,7 @@ module EleetScript
|
|
54
55
|
load_object_methods
|
55
56
|
load_io_methods
|
56
57
|
load_string_methods
|
58
|
+
load_regex_methods
|
57
59
|
load_number_methods
|
58
60
|
load_boolean_methods
|
59
61
|
load_nil_methods
|
@@ -78,8 +80,7 @@ module EleetScript
|
|
78
80
|
end
|
79
81
|
|
80
82
|
object.def :kind_of? do |receiver, arguments|
|
81
|
-
t = @root_namespace["true"]
|
82
|
-
f = @root_namespace["false"]
|
83
|
+
t, f = @root_namespace["true"], @root_namespace["false"]
|
83
84
|
if arguments.length == 0 || !arguments.first.class?
|
84
85
|
f
|
85
86
|
else
|
@@ -96,6 +97,10 @@ module EleetScript
|
|
96
97
|
end
|
97
98
|
end
|
98
99
|
|
100
|
+
object.def :class do |receiver, arguments|
|
101
|
+
receiver.runtime_class
|
102
|
+
end
|
103
|
+
|
99
104
|
object.def :class_name do |receiver, arguments|
|
100
105
|
@root_namespace["String"].new_with_value(receiver.runtime_class.name)
|
101
106
|
end
|
@@ -225,6 +230,76 @@ module EleetScript
|
|
225
230
|
@root_namespace.es_nil
|
226
231
|
end
|
227
232
|
end
|
233
|
+
|
234
|
+
string.def :replace do |receiver, arguments|
|
235
|
+
if arguments.length < 2
|
236
|
+
string.new_with_value(receiver.ruby_value)
|
237
|
+
else
|
238
|
+
pattern, replacement = arguments
|
239
|
+
if !pattern.is_a?("Regex")
|
240
|
+
pattern = @root_namespace["Regex"].call(:new, [pattern.call(:to_string)])
|
241
|
+
end
|
242
|
+
if replacement.is_a?("Lambda")
|
243
|
+
new_str = if pattern.ruby_value.global?
|
244
|
+
receiver.ruby_value.gsub(pattern.ruby_value) do |*args|
|
245
|
+
args = args.map { |arg| string.new_with_value(arg) }
|
246
|
+
replacement.call(:call, args).call(:to_string).ruby_value
|
247
|
+
end
|
248
|
+
else
|
249
|
+
receiver.ruby_value.sub(pattern.ruby_value) do |*args|
|
250
|
+
args = args.map { |arg| string.new_with_value(arg) }
|
251
|
+
replacement.call(:call, args).call(:to_string).ruby_value
|
252
|
+
end
|
253
|
+
end
|
254
|
+
else
|
255
|
+
new_str = if pattern.ruby_value.global?
|
256
|
+
receiver.ruby_value.gsub(pattern.ruby_value, replacement.call(:to_string).ruby_value)
|
257
|
+
else
|
258
|
+
receiver.ruby_value.sub(pattern.ruby_value, replacement.call(:to_string).ruby_value)
|
259
|
+
end
|
260
|
+
string.new_with_value(new_str)
|
261
|
+
end
|
262
|
+
end
|
263
|
+
end
|
264
|
+
|
265
|
+
string.def :match do |receiver, arguments|
|
266
|
+
str_cls, list_cls = @root_namespace["String"], @root_namespace["List"]
|
267
|
+
rx = arguments.first
|
268
|
+
if rx.is_a?("Regex")
|
269
|
+
if rx.ruby_value.global?
|
270
|
+
matches = receiver.ruby_value.scan(rx.ruby_value)
|
271
|
+
list_args = matches.map do |match|
|
272
|
+
args = match.map do |a|
|
273
|
+
str_cls.new_with_value(a)
|
274
|
+
end
|
275
|
+
list_cls.call(:new, args)
|
276
|
+
end
|
277
|
+
list_cls.call(:new, args)
|
278
|
+
else
|
279
|
+
matches = receiver.ruby_value.match(rx.ruby_value)
|
280
|
+
if matches.nil?
|
281
|
+
list_cls.call(:new)
|
282
|
+
else
|
283
|
+
args = [str_cls.new_with_value(matches[0])]
|
284
|
+
if matches.names.length > 0
|
285
|
+
args += matches.names.map do |name|
|
286
|
+
n, v = str_cls.new_with_value(name), str_cls.new_with_value(matches[name])
|
287
|
+
@root_namespace["Pair"].call(:new, [n, v])
|
288
|
+
end
|
289
|
+
else
|
290
|
+
group_matches = matches.to_a
|
291
|
+
group_matches.shift # Remove full match
|
292
|
+
args += group_matches.map do |res|
|
293
|
+
str_cls.new_with_value(res)
|
294
|
+
end
|
295
|
+
end
|
296
|
+
list_cls.call(:new, args)
|
297
|
+
end
|
298
|
+
end
|
299
|
+
else
|
300
|
+
@root_namespace["List"].call(:new)
|
301
|
+
end
|
302
|
+
end
|
228
303
|
end
|
229
304
|
|
230
305
|
def load_number_methods
|
@@ -372,6 +447,63 @@ module EleetScript
|
|
372
447
|
end
|
373
448
|
end
|
374
449
|
|
450
|
+
def load_regex_methods
|
451
|
+
regex = @root_namespace["Regex"]
|
452
|
+
|
453
|
+
regex.class_def :new do |receiver, arguments|
|
454
|
+
pattern, flags = arguments
|
455
|
+
pattern = (pattern ? pattern.ruby_value : "")
|
456
|
+
flags = (flags ? flags.ruby_value : nil)
|
457
|
+
regex.new_with_value(ESRegex.new(pattern, flags))
|
458
|
+
end
|
459
|
+
|
460
|
+
regex.def :pattern do |receiver, arguments|
|
461
|
+
@root_namespace["String"].new_with_value(receiver.ruby_value.source)
|
462
|
+
end
|
463
|
+
|
464
|
+
regex.def :flags do |receiver, arguments|
|
465
|
+
@root_namespace["String"].new_with_value(receiver.ruby_value.flags)
|
466
|
+
end
|
467
|
+
|
468
|
+
regex.def :global= do |receiver, arguments|
|
469
|
+
t, f = @root_namespace["true"], @root_namespace["false"]
|
470
|
+
receiver.ruby_value.global = arguments.first == t ? true : false
|
471
|
+
receiver
|
472
|
+
end
|
473
|
+
|
474
|
+
regex.def :multiline? do |receiver, arguments|
|
475
|
+
t, f = @root_namespace["true"], @root_namespace["false"]
|
476
|
+
receiver.ruby_value.multiline? ? t : f
|
477
|
+
end
|
478
|
+
|
479
|
+
regex.def :multiline= do |receiver, arguments|
|
480
|
+
t, f = @root_namespace["true"], @root_namespace["false"]
|
481
|
+
rx = receiver.ruby_value
|
482
|
+
if arguments.first == t
|
483
|
+
receiver.ruby_value = ESRegex.new(rx.source, rx.flags + "m")
|
484
|
+
else
|
485
|
+
receiver.ruby_value = ESRegex.new(rx.source, rx.flags.gsub("m", ""))
|
486
|
+
end
|
487
|
+
receiver
|
488
|
+
end
|
489
|
+
|
490
|
+
regex.def :ignorecase? do |receiver, arguments|
|
491
|
+
t, f = @root_namespace["true"], @root_namespace["false"]
|
492
|
+
receiver.ruby_value.ignorecase? ? t : f
|
493
|
+
end
|
494
|
+
|
495
|
+
regex.def :ignorecase= do |receiver, arguments|
|
496
|
+
t, f = @root_namespace["true"], @root_namespace["false"]
|
497
|
+
rx = receiver.ruby_value
|
498
|
+
if arguments.first == t
|
499
|
+
receiver.ruby_value = ESRegex.new(rx.source, rx.flags + "i")
|
500
|
+
else
|
501
|
+
receiver.ruby_value = ESRegex.new(rx.source, rx.flags.gsub("i", ""))
|
502
|
+
end
|
503
|
+
receiver
|
504
|
+
end
|
505
|
+
end
|
506
|
+
|
375
507
|
def load_boolean_methods
|
376
508
|
true_cls = @root_namespace["TrueClass"]
|
377
509
|
false_cls = @root_namespace["FalseClass"]
|
@@ -545,9 +677,23 @@ module EleetScript
|
|
545
677
|
|
546
678
|
def load_lambda_methods
|
547
679
|
lambda = @root_namespace["Lambda"]
|
680
|
+
|
548
681
|
lambda.def :call do |receiver, arguments, context|
|
549
682
|
receiver.ruby_value.call(nil, arguments, context)
|
550
683
|
end
|
684
|
+
|
685
|
+
lambda.def :apply do |receiver, arguments, context|
|
686
|
+
args = arguments.first
|
687
|
+
args = if args.is_a?("List")
|
688
|
+
arg_list = args.ruby_value.array_value.dup
|
689
|
+
arg_list + args.ruby_value.hash_value.map do |k, v|
|
690
|
+
@root_namespace["Pair"].call(:new, [k, v])
|
691
|
+
end
|
692
|
+
else
|
693
|
+
[]
|
694
|
+
end
|
695
|
+
receiver.ruby_value.call(nil, args, context)
|
696
|
+
end
|
551
697
|
end
|
552
698
|
end
|
553
699
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: eleetscript
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.9a
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Brandon Buck
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-02-15 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: EleetScript scripting engine for use in Ruby applications
|
14
14
|
email: lordizuriel@gmail.com
|
@@ -46,6 +46,7 @@ files:
|
|
46
46
|
- lib/lang/runtime/eleetscript/object.es
|
47
47
|
- lib/lang/runtime/eleetscript/pair.es
|
48
48
|
- lib/lang/runtime/eleetscript/que.es
|
49
|
+
- lib/lang/runtime/eleetscript/regex.es
|
49
50
|
- lib/lang/runtime/eleetscript/stack.es
|
50
51
|
- lib/lang/runtime/eleetscript/string.es
|
51
52
|
- lib/lang/runtime/eleetscript/trueclass.es
|