bfrb 0.1.0 → 0.1.1
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 +17 -2
- data/VERSION +1 -1
- data/bfrb.gemspec +2 -2
- data/bin/bfrb +19 -10
- data/lib/bfrb/interpreter.rb +16 -6
- data/lib/bfrb.rb +23 -0
- metadata +11 -11
data/README.rdoc
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
= bfrb
|
2
2
|
|
3
|
-
bfrb is a simple brainfuck interpreter written in Ruby.
|
3
|
+
bfrb is a simple {brainfuck}[http://www.muppetlabs.com/~breadbox/bf] interpreter written in Ruby.
|
4
4
|
|
5
5
|
== Usage
|
6
6
|
|
@@ -8,10 +8,25 @@ To install bfrb:
|
|
8
8
|
|
9
9
|
% gem install bfrb
|
10
10
|
|
11
|
-
|
11
|
+
Once bfrb is installed, you can use it to interpret your brainfuck code.
|
12
|
+
First, you can pass brainfuck code directly into it, as long as it is wrapped in quotes.
|
12
13
|
|
13
14
|
% bfrb ",[.,]"
|
14
15
|
|
15
16
|
Or, you can specify a file with the -f parameter:
|
16
17
|
|
17
18
|
% bfrb -f test.bf
|
19
|
+
|
20
|
+
You can also start an interactive interpreter by running bfrb without any parameters
|
21
|
+
|
22
|
+
% bfrb
|
23
|
+
|
24
|
+
== Things To Do
|
25
|
+
|
26
|
+
* Compiler
|
27
|
+
* Unit Testing
|
28
|
+
|
29
|
+
== History
|
30
|
+
|
31
|
+
v 0.1.1 - Added REPL.
|
32
|
+
v 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.1
|
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.1"
|
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-06}
|
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
@@ -4,22 +4,31 @@ require File.expand_path(File.join(File.dirname(__FILE__), "..", "lib", "bfrb.rb
|
|
4
4
|
|
5
5
|
def usage
|
6
6
|
puts "Usage:"
|
7
|
+
puts "Start interactive evaluation: bfrb"
|
7
8
|
puts "Pass code in as first command line parameter (in quotes): bfrb \",[.,]\""
|
8
9
|
puts "Specify a file to read: bfrb -f test.bf"
|
10
|
+
puts "View this message: bfrb -u"
|
9
11
|
end
|
10
12
|
|
11
13
|
bfrb = BfRb::Base.new
|
12
14
|
# if the command line params specify a file, run it
|
13
15
|
# otherwise attempt to run code passed in as a param
|
14
|
-
if ARGV.length
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
16
|
+
if ARGV.length == 0
|
17
|
+
puts "Starting interactive evaluation"
|
18
|
+
bfrb.repl
|
19
|
+
else
|
20
|
+
case ARGV[0]
|
21
|
+
when "-u"
|
19
22
|
usage
|
23
|
+
when "-f"
|
24
|
+
if ARGV.length > 1
|
25
|
+
bfrb.load_file(ARGV[1])
|
26
|
+
else
|
27
|
+
puts "Invalid arguments"
|
28
|
+
usage
|
29
|
+
end
|
30
|
+
else
|
31
|
+
puts "Interpreting code"
|
32
|
+
bfrb.run(ARGV[0])
|
20
33
|
end
|
21
|
-
|
22
|
-
bfrb.run(ARGV[0])
|
23
|
-
else
|
24
|
-
usage
|
25
|
-
end
|
34
|
+
end
|
data/lib/bfrb/interpreter.rb
CHANGED
@@ -4,6 +4,8 @@ module BfRb
|
|
4
4
|
# interprets brainfuck code
|
5
5
|
class Interpreter
|
6
6
|
|
7
|
+
attr_reader :program_counter, :memory_counter
|
8
|
+
|
7
9
|
# initialize the interpreter
|
8
10
|
def initialize
|
9
11
|
@memory = Memory.new
|
@@ -19,17 +21,20 @@ module BfRb
|
|
19
21
|
@loop_stack = []
|
20
22
|
end
|
21
23
|
|
24
|
+
# run a given piece of code
|
22
25
|
def run(code)
|
23
|
-
@code
|
26
|
+
@code += code
|
24
27
|
evaluate_code
|
25
28
|
end
|
26
29
|
|
30
|
+
# evaluate each instruction in the current code
|
27
31
|
def evaluate_code
|
28
32
|
while ((0 <= @program_counter) and (@program_counter < @code.length))
|
29
33
|
evaluate_instruction
|
30
34
|
end
|
31
35
|
end
|
32
36
|
|
37
|
+
# evaluate an individual instruction
|
33
38
|
def evaluate_instruction
|
34
39
|
case @code[@program_counter]
|
35
40
|
when ">"
|
@@ -41,16 +46,16 @@ module BfRb
|
|
41
46
|
@memory_counter = 0
|
42
47
|
end
|
43
48
|
when "+"
|
44
|
-
@memory.set(@memory_counter,
|
49
|
+
@memory.set(@memory_counter, current_memory + 1)
|
45
50
|
when "-"
|
46
|
-
@memory.set(@memory_counter,
|
51
|
+
@memory.set(@memory_counter, current_memory - 1)
|
47
52
|
when "."
|
48
|
-
print
|
53
|
+
print current_memory.chr
|
49
54
|
when ","
|
50
55
|
input = $stdin.gets.getbyte(0)
|
51
56
|
@memory.set(@memory_counter, input)
|
52
57
|
when "["
|
53
|
-
if
|
58
|
+
if current_memory != 0
|
54
59
|
@loop_stack.push @program_counter
|
55
60
|
else
|
56
61
|
bracket_counter = 1
|
@@ -65,11 +70,16 @@ module BfRb
|
|
65
70
|
end
|
66
71
|
when "]"
|
67
72
|
matching_bracket = @loop_stack.pop
|
68
|
-
if
|
73
|
+
if current_memory != 0
|
69
74
|
@program_counter = matching_bracket - 1
|
70
75
|
end
|
71
76
|
end
|
72
77
|
@program_counter += 1
|
73
78
|
end
|
79
|
+
|
80
|
+
# returns the value in the current memory cell
|
81
|
+
def current_memory
|
82
|
+
return @memory.get(@memory_counter)
|
83
|
+
end
|
74
84
|
end
|
75
85
|
end
|
data/lib/bfrb.rb
CHANGED
@@ -19,5 +19,28 @@ module BfRb
|
|
19
19
|
code = File.open(file_path) { |f| f.read }
|
20
20
|
run(code)
|
21
21
|
end
|
22
|
+
|
23
|
+
# interactive read-evaluate-print loop
|
24
|
+
def repl
|
25
|
+
puts "'exit' leaves the REPL"
|
26
|
+
puts "'mem' displays the value in the current cell of memory"
|
27
|
+
puts "'clear' clears everything from memory"
|
28
|
+
while true
|
29
|
+
puts ""
|
30
|
+
print "bf> "
|
31
|
+
input = gets.chomp
|
32
|
+
case input
|
33
|
+
when "exit"
|
34
|
+
puts "Exiting"
|
35
|
+
break
|
36
|
+
when "mem"
|
37
|
+
puts "Cell: #{@interpreter.memory_counter} Value: #{@interpreter.current_memory}"
|
38
|
+
when "clear"
|
39
|
+
@interpreter.initialize_environment
|
40
|
+
else
|
41
|
+
@interpreter.run(input)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
22
45
|
end
|
23
46
|
end
|
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.1
|
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-06 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: &9389616 !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: *9389616
|
26
26
|
- !ruby/object:Gem::Dependency
|
27
27
|
name: bundler
|
28
|
-
requirement: &
|
28
|
+
requirement: &9388836 !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: *9388836
|
37
37
|
- !ruby/object:Gem::Dependency
|
38
38
|
name: jeweler
|
39
|
-
requirement: &
|
39
|
+
requirement: &9388188 !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: *9388188
|
48
48
|
- !ruby/object:Gem::Dependency
|
49
49
|
name: rcov
|
50
|
-
requirement: &
|
50
|
+
requirement: &9387504 !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: *9387504
|
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: 1070569779
|
97
97
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
98
98
|
none: false
|
99
99
|
requirements:
|