sardonyx 0.3.0 → 0.3.5
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/bin/sdx +6 -2
- data/lib/sdx/compiler/compiler.rb +3 -0
- data/lib/sdx/compiler/parser.rb +19 -4
- data/lib/sdx/vm/vm.rb +12 -8
- metadata +1 -1
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: b6cb7504c3a8d3c20d609b052304da6f29006b61d4606b738fe0a33fc92753c8
|
|
4
|
+
data.tar.gz: 573d3b61d0031f2c1016ab4ba6d8b856f6ba8770e19b93610080735fb01efabf
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: f8d4f48ba42b07b7bc29a367cb67492c7ca7f0c481f7556a2cecb28d2085be081330ebc3040469cadee489db420f015c2bf31969a2818f3b285ec24c0d101b4f
|
|
7
|
+
data.tar.gz: d6569e3d3607dfc50628b72952195e44289ac642412804330b54f82d8b6e3ad3afb863888a8f80c57e736c73e02f9bbee25f033a76dda87845d869753c4dbf9d
|
data/bin/sdx
CHANGED
|
@@ -5,6 +5,10 @@ require "sdx/vm/vm"
|
|
|
5
5
|
require "stringio"
|
|
6
6
|
require "readline"
|
|
7
7
|
|
|
8
|
+
if (ENV.fetch("SDX_PATH", "").split ":") == []
|
|
9
|
+
puts "\x1b[0;33mLooks like you don't have anything in your SDX_PATH! You should install the stdlib at https://github.com/SardonyxLang/SardonyxStd.\x1b[0;0m"
|
|
10
|
+
end
|
|
11
|
+
|
|
8
12
|
if ARGV.size == 1
|
|
9
13
|
path = [(File.expand_path File.dirname ARGV[0]), *(ENV.fetch("SDX_PATH", "").split ":")]
|
|
10
14
|
code = File.read ARGV[0]
|
|
@@ -18,7 +22,7 @@ if ARGV.size == 1
|
|
|
18
22
|
else
|
|
19
23
|
path = [(File.expand_path Dir.pwd), *(ENV.fetch("SDX_PATH", "").split ":")]
|
|
20
24
|
vm = VM.new StringIO.new ""
|
|
21
|
-
puts "Sardonyx v0.3.
|
|
25
|
+
puts "Sardonyx v0.3.4"
|
|
22
26
|
puts "Type :help for help, or :exit to exit"
|
|
23
27
|
loop do
|
|
24
28
|
begin
|
|
@@ -47,7 +51,7 @@ else
|
|
|
47
51
|
val = vm.stack[-1]
|
|
48
52
|
vm.clear
|
|
49
53
|
if val
|
|
50
|
-
puts
|
|
54
|
+
puts stringify val
|
|
51
55
|
end
|
|
52
56
|
end
|
|
53
57
|
end
|
data/lib/sdx/compiler/parser.rb
CHANGED
|
@@ -23,6 +23,7 @@ module Parser
|
|
|
23
23
|
/\Aobject/ => :object,
|
|
24
24
|
/\Anew/ => :new,
|
|
25
25
|
/\Arequire/ => :require,
|
|
26
|
+
/\Areturn/ => :return,
|
|
26
27
|
/\A(true|false)/ => :bool,
|
|
27
28
|
/\A-?[0-9]+\.[0-9]+/ => :float,
|
|
28
29
|
/\A-?[0-9]+/ => :number,
|
|
@@ -674,11 +675,24 @@ Invalid code at #{line}:#{col}
|
|
|
674
675
|
end
|
|
675
676
|
[ (Node.new :require, tokens[0][0][1..-2], []), 2 ]
|
|
676
677
|
end
|
|
678
|
+
|
|
679
|
+
def self.parse_return(tokens)
|
|
680
|
+
unless self.expect tokens, :return
|
|
681
|
+
return nil
|
|
682
|
+
end
|
|
683
|
+
tokens = tokens[1..-1]
|
|
684
|
+
res = self.parse_expr tokens
|
|
685
|
+
unless res
|
|
686
|
+
return nil
|
|
687
|
+
end
|
|
688
|
+
[ (Node.new :return, res[0], []), res[1] ]
|
|
689
|
+
end
|
|
677
690
|
|
|
678
691
|
def self.parse_expr(tokens)
|
|
679
692
|
(self.parse_op tokens) ||
|
|
680
693
|
(self.parse_call tokens) ||
|
|
681
694
|
(self.parse_require tokens) ||
|
|
695
|
+
(self.parse_return tokens) ||
|
|
682
696
|
(self.parse_new tokens) ||
|
|
683
697
|
(self.parse_object tokens) ||
|
|
684
698
|
(self.parse_fn tokens) ||
|
|
@@ -706,14 +720,15 @@ Invalid code at #{line}:#{col}
|
|
|
706
720
|
unless code
|
|
707
721
|
error "Cannot find file #{e[0].value}.sdx anywhere in path"
|
|
708
722
|
State::state = :error
|
|
723
|
+
return nil
|
|
709
724
|
end
|
|
710
|
-
|
|
711
|
-
|
|
712
|
-
|
|
725
|
+
tokens = tokens[e[1]..-1]
|
|
726
|
+
lexed, _ = Lexer.lex code
|
|
727
|
+
tokens = [*lexed, *tokens]
|
|
713
728
|
else
|
|
714
729
|
parsed << e[0]
|
|
730
|
+
tokens = tokens[e[1]..-1]
|
|
715
731
|
end
|
|
716
|
-
tokens = tokens[e[1]..-1]
|
|
717
732
|
else
|
|
718
733
|
error %{
|
|
719
734
|
Unexpected token #{tokens[0][1]} at #{tokens[0][2]}:#{tokens[0][3]}
|
data/lib/sdx/vm/vm.rb
CHANGED
|
@@ -14,6 +14,18 @@ def codify(val)
|
|
|
14
14
|
end
|
|
15
15
|
end
|
|
16
16
|
|
|
17
|
+
def stringify(val)
|
|
18
|
+
if val.value.fields["__as_string"]
|
|
19
|
+
if val.value.fields["__as_string"].respond_to? :fields
|
|
20
|
+
(val.value.fields["__as_string"].fields["__call"].call [], val.scope).internal
|
|
21
|
+
else
|
|
22
|
+
(val.value.fields["__as_string"]).call.internal
|
|
23
|
+
end
|
|
24
|
+
else
|
|
25
|
+
val.value.to_s
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
|
|
17
29
|
class VM
|
|
18
30
|
attr_accessor :bc_io
|
|
19
31
|
|
|
@@ -28,14 +40,6 @@ class VM
|
|
|
28
40
|
return true
|
|
29
41
|
end
|
|
30
42
|
end
|
|
31
|
-
|
|
32
|
-
def stringify(val)
|
|
33
|
-
if val.value.fields["__as_string"]
|
|
34
|
-
(call val.value.fields["__as_string"], [], val.scope).internal
|
|
35
|
-
else
|
|
36
|
-
val.value.to_s
|
|
37
|
-
end
|
|
38
|
-
end
|
|
39
43
|
|
|
40
44
|
def call(val, *args)
|
|
41
45
|
if val.respond_to? :value and val.value.respond_to? :fields
|