nil 1.0.8 → 1.0.9
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/CHANGELOG.md +3 -0
- data/TODO.md +4 -0
- data/lib/nil/interpreter.rb +23 -7
- data/lib/nil/macro.rb +2 -0
- data/lib/nil/version.rb +1 -1
- data/test/nil_test.rb +27 -16
- metadata +3 -3
data/CHANGELOG.md
CHANGED
data/TODO.md
CHANGED
data/lib/nil/interpreter.rb
CHANGED
@@ -29,17 +29,33 @@ module Nil
|
|
29
29
|
when '<'
|
30
30
|
"sp -= #{count}\n"
|
31
31
|
when '['
|
32
|
-
|
32
|
+
s = ""
|
33
|
+
count.times do
|
34
|
+
s << "while stack[sp] != 0\n"
|
35
|
+
end
|
36
|
+
s
|
33
37
|
when ']'
|
34
|
-
"
|
38
|
+
s = ""
|
39
|
+
count.times do
|
40
|
+
s << "end\n"
|
41
|
+
end
|
42
|
+
s
|
35
43
|
when '.'
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
44
|
+
s = ""
|
45
|
+
count.times do
|
46
|
+
if @@mode == 'num'
|
47
|
+
s << "puts stack[sp]\n"
|
48
|
+
else
|
49
|
+
s << "print stack[sp].chr\n"
|
50
|
+
end
|
40
51
|
end
|
52
|
+
s
|
41
53
|
when ','
|
42
|
-
|
54
|
+
s = ""
|
55
|
+
count.times do
|
56
|
+
s << "stack[sp] = gets[0]\n"
|
57
|
+
end
|
58
|
+
s
|
43
59
|
end
|
44
60
|
end
|
45
61
|
|
data/lib/nil/macro.rb
CHANGED
data/lib/nil/version.rb
CHANGED
data/test/nil_test.rb
CHANGED
@@ -11,20 +11,28 @@ RB
|
|
11
11
|
context "Interpreter" do
|
12
12
|
setup { Nil::Interpreter.new }
|
13
13
|
|
14
|
-
|
14
|
+
context "General code generation" do
|
15
|
+
asserts("invalid characters in code cause failure") { topic.compile "a++", 'num' }.raises SyntaxError
|
15
16
|
|
16
|
-
|
17
|
+
asserts("creates boilerplate code") { topic.compiled_ruby == BOILERPLATE }
|
18
|
+
end
|
17
19
|
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
asserts("handles <") { topic.compile('<', 'num') == (BOILERPLATE + "sp -= 1\n") }
|
23
|
-
asserts("handles +") { topic.compile('+', 'num') == (BOILERPLATE + "stack[sp] += 1\n") }
|
24
|
-
asserts("handles -") { topic.compile('-', 'num') == (BOILERPLATE + "stack[sp] -= 1\n") }
|
25
|
-
asserts("handles [") { topic.compile('[', 'num') == (BOILERPLATE + "while stack[sp] != 0\n" ) }
|
26
|
-
asserts("handles ]") { topic.compile(']', 'num') == (BOILERPLATE + "end\n" ) }
|
20
|
+
context "Modes" do
|
21
|
+
asserts("handles . in numerical mode") { topic.compile('.', 'num') == (BOILERPLATE + "puts stack[sp]\n") }
|
22
|
+
asserts("handles . in ascii mode") { topic.compile('.', 'ascii') == (BOILERPLATE + "print stack[sp].chr\n") }
|
23
|
+
end
|
27
24
|
|
25
|
+
context "General operator handling" do
|
26
|
+
asserts("handles ,") { topic.compile(',', 'num') == (BOILERPLATE + "stack[sp] = gets[0]\n") }
|
27
|
+
asserts("handles >") { topic.compile('>', 'num') == (BOILERPLATE + "sp += 1\n") }
|
28
|
+
asserts("handles <") { topic.compile('<', 'num') == (BOILERPLATE + "sp -= 1\n") }
|
29
|
+
asserts("handles +") { topic.compile('+', 'num') == (BOILERPLATE + "stack[sp] += 1\n") }
|
30
|
+
asserts("handles -") { topic.compile('-', 'num') == (BOILERPLATE + "stack[sp] -= 1\n") }
|
31
|
+
asserts("handles [") { topic.compile('[', 'num') == (BOILERPLATE + "while stack[sp] != 0\n" ) }
|
32
|
+
asserts("handles ]") { topic.compile(']', 'num') == (BOILERPLATE + "end\n" ) }
|
33
|
+
end
|
34
|
+
|
35
|
+
context "Advanced operator handling" do
|
28
36
|
asserts("handles multiple operators smartly") do
|
29
37
|
code = topic.compile "++++---->>>><<<<", 'num'
|
30
38
|
code == BOILERPLATE + <<CODE
|
@@ -46,12 +54,15 @@ stack[sp] += 3
|
|
46
54
|
puts stack[sp]
|
47
55
|
CODE
|
48
56
|
end
|
57
|
+
end
|
49
58
|
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
59
|
+
context "Bug testing" do
|
60
|
+
denies("error raised when brackets are inside subroutines") do
|
61
|
+
code = ":sub{+++[-]}sub:"
|
62
|
+
code = (Nil::MacroParser.new).parse code
|
63
|
+
topic.compile(code)
|
64
|
+
end.raises SyntaxError
|
65
|
+
end
|
55
66
|
|
56
67
|
end
|
57
68
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: nil
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.9
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-06-
|
12
|
+
date: 2012-06-05 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: trollop
|
@@ -72,7 +72,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
72
72
|
version: '0'
|
73
73
|
requirements: []
|
74
74
|
rubyforge_project:
|
75
|
-
rubygems_version: 1.8.
|
75
|
+
rubygems_version: 1.8.24
|
76
76
|
signing_key:
|
77
77
|
specification_version: 3
|
78
78
|
summary: A macro language/interpreter for brain****
|