bfrb 0.1.2 → 0.1.3
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/README.rdoc +4 -5
- data/VERSION +1 -1
- data/bfrb.gemspec +2 -2
- data/bin/bfrb +2 -1
- data/lib/bfrb/interpreter.rb +25 -1
- data/test/test_interpreter.rb +21 -1
- metadata +11 -11
data/README.rdoc
CHANGED
@@ -1,6 +1,8 @@
|
|
1
1
|
= bfrb
|
2
2
|
|
3
|
-
bfrb is a simple {brainfuck}[http://www.muppetlabs.com/~breadbox/bf] interpreter written in Ruby.
|
3
|
+
bfrb is a simple {brainfuck}[http://www.muppetlabs.com/~breadbox/bf] interpreter written in Ruby.
|
4
|
+
It's not the most robust code, but it does the job, and has handled all the example code I've managed to
|
5
|
+
throw at it.
|
4
6
|
|
5
7
|
== Usage
|
6
8
|
|
@@ -20,13 +22,10 @@ Or, you can specify a file with the -f parameter:
|
|
20
22
|
You can also start an interactive interpreter by running bfrb without any parameters
|
21
23
|
|
22
24
|
% bfrb
|
23
|
-
|
24
|
-
== Things To Do
|
25
|
-
|
26
|
-
* Compiler
|
27
25
|
|
28
26
|
== History
|
29
27
|
|
28
|
+
* 0.1.3 - Unmatched brace checks
|
30
29
|
* 0.1.2 - Added unit tests
|
31
30
|
* 0.1.1 - Added REPL.
|
32
31
|
* 0.1.0 - Initial release. Allows running code passed in or from a file.
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.1.
|
1
|
+
0.1.3
|
data/bfrb.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{bfrb}
|
8
|
-
s.version = "0.1.
|
8
|
+
s.version = "0.1.3"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Chris ONeal"]
|
12
|
-
s.date = %q{2011-06-
|
12
|
+
s.date = %q{2011-06-07}
|
13
13
|
s.default_executable = %q{bfrb}
|
14
14
|
s.description = %q{bfrb is a brainfuck interpreter written in Ruby.}
|
15
15
|
s.email = %q{ctoneal@gmail.com}
|
data/bin/bfrb
CHANGED
@@ -5,7 +5,7 @@ require File.expand_path(File.join(File.dirname(__FILE__), "..", "lib", "bfrb.rb
|
|
5
5
|
def usage
|
6
6
|
puts "Usage:"
|
7
7
|
puts "Start interactive evaluation: bfrb"
|
8
|
-
puts "Pass code in as
|
8
|
+
puts "Pass code in as a command line parameter (in quotes): bfrb \",[.,]\""
|
9
9
|
puts "Specify a file to read: bfrb -f test.bf"
|
10
10
|
puts "View this message: bfrb -u"
|
11
11
|
end
|
@@ -22,6 +22,7 @@ else
|
|
22
22
|
usage
|
23
23
|
when "-f"
|
24
24
|
if ARGV.length > 1
|
25
|
+
puts "Attempting to run file #{ARGV[1]}"
|
25
26
|
bfrb.load_file(ARGV[1])
|
26
27
|
else
|
27
28
|
puts "Invalid arguments"
|
data/lib/bfrb/interpreter.rb
CHANGED
@@ -27,7 +27,30 @@ module BfRb
|
|
27
27
|
# run a given piece of code
|
28
28
|
def run(code)
|
29
29
|
@code += code
|
30
|
-
|
30
|
+
if check_for_matching_braces
|
31
|
+
evaluate_code
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
# checks the code to be run to make sure all braces match
|
36
|
+
def check_for_matching_braces
|
37
|
+
brace_counter = 0
|
38
|
+
@code.each_char do |char|
|
39
|
+
if char == "["
|
40
|
+
brace_counter += 1
|
41
|
+
elsif char == "]"
|
42
|
+
brace_counter -= 1
|
43
|
+
if brace_counter < 0
|
44
|
+
@output_stream.puts "Unmatched ]"
|
45
|
+
return false
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
if brace_counter > 0
|
50
|
+
@output_stream.puts "Unmatched ["
|
51
|
+
return false
|
52
|
+
end
|
53
|
+
return true
|
31
54
|
end
|
32
55
|
|
33
56
|
# evaluate each instruction in the current code
|
@@ -57,6 +80,7 @@ module BfRb
|
|
57
80
|
when "."
|
58
81
|
@output_stream.print current_memory.chr
|
59
82
|
when ","
|
83
|
+
@output_stream.puts
|
60
84
|
input = @input_stream.gets.getbyte(0)
|
61
85
|
@memory.set(@memory_counter, input)
|
62
86
|
when "["
|
data/test/test_interpreter.rb
CHANGED
@@ -69,6 +69,26 @@ module BfRb
|
|
69
69
|
@interpreter.evaluate_instruction("]")
|
70
70
|
assert_not_equal(initial_value, @interpreter.program_counter)
|
71
71
|
end
|
72
|
+
|
73
|
+
should "inform the user if an unmatched [ exists" do
|
74
|
+
output, input = IO.pipe
|
75
|
+
@interpreter.output_stream = input
|
76
|
+
@interpreter.run("[")
|
77
|
+
input.close
|
78
|
+
value = output.gets.chomp
|
79
|
+
output.close
|
80
|
+
assert_equal("Unmatched [", value)
|
81
|
+
end
|
82
|
+
|
83
|
+
should "inform the user if an unmatched ] exists" do
|
84
|
+
output, input = IO.pipe
|
85
|
+
@interpreter.output_stream = input
|
86
|
+
@interpreter.run("]")
|
87
|
+
input.close
|
88
|
+
value = output.gets.chomp
|
89
|
+
output.close
|
90
|
+
assert_equal("Unmatched ]", value)
|
91
|
+
end
|
72
92
|
end
|
73
93
|
|
74
94
|
context "." do
|
@@ -80,7 +100,7 @@ module BfRb
|
|
80
100
|
input.close
|
81
101
|
value = output.getbyte
|
82
102
|
output.close
|
83
|
-
assert_equal(
|
103
|
+
assert_equal(@interpreter.current_memory, value)
|
84
104
|
end
|
85
105
|
end
|
86
106
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: bfrb
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.3
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,12 +9,12 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2011-06-
|
12
|
+
date: 2011-06-07 00:00:00.000000000 -05:00
|
13
13
|
default_executable: bfrb
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: shoulda
|
17
|
-
requirement: &
|
17
|
+
requirement: &8122260 !ruby/object:Gem::Requirement
|
18
18
|
none: false
|
19
19
|
requirements:
|
20
20
|
- - ! '>='
|
@@ -22,10 +22,10 @@ dependencies:
|
|
22
22
|
version: '0'
|
23
23
|
type: :development
|
24
24
|
prerelease: false
|
25
|
-
version_requirements: *
|
25
|
+
version_requirements: *8122260
|
26
26
|
- !ruby/object:Gem::Dependency
|
27
27
|
name: bundler
|
28
|
-
requirement: &
|
28
|
+
requirement: &8115360 !ruby/object:Gem::Requirement
|
29
29
|
none: false
|
30
30
|
requirements:
|
31
31
|
- - ~>
|
@@ -33,10 +33,10 @@ dependencies:
|
|
33
33
|
version: 1.0.0
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
|
-
version_requirements: *
|
36
|
+
version_requirements: *8115360
|
37
37
|
- !ruby/object:Gem::Dependency
|
38
38
|
name: jeweler
|
39
|
-
requirement: &
|
39
|
+
requirement: &8096676 !ruby/object:Gem::Requirement
|
40
40
|
none: false
|
41
41
|
requirements:
|
42
42
|
- - ~>
|
@@ -44,10 +44,10 @@ dependencies:
|
|
44
44
|
version: 1.5.2
|
45
45
|
type: :development
|
46
46
|
prerelease: false
|
47
|
-
version_requirements: *
|
47
|
+
version_requirements: *8096676
|
48
48
|
- !ruby/object:Gem::Dependency
|
49
49
|
name: rcov
|
50
|
-
requirement: &
|
50
|
+
requirement: &8095140 !ruby/object:Gem::Requirement
|
51
51
|
none: false
|
52
52
|
requirements:
|
53
53
|
- - ! '>='
|
@@ -55,7 +55,7 @@ dependencies:
|
|
55
55
|
version: '0'
|
56
56
|
type: :development
|
57
57
|
prerelease: false
|
58
|
-
version_requirements: *
|
58
|
+
version_requirements: *8095140
|
59
59
|
description: bfrb is a brainfuck interpreter written in Ruby.
|
60
60
|
email: ctoneal@gmail.com
|
61
61
|
executables:
|
@@ -93,7 +93,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
93
93
|
version: '0'
|
94
94
|
segments:
|
95
95
|
- 0
|
96
|
-
hash:
|
96
|
+
hash: -645724511
|
97
97
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
98
98
|
none: false
|
99
99
|
requirements:
|