bfrb 0.1.2 → 0.1.3
Sign up to get free protection for your applications and to get access to all the features.
- 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:
|