bfrb 0.1.3 → 0.1.4
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 +10 -0
- data/VERSION +1 -1
- data/bfrb.gemspec +2 -2
- data/lib/bfrb/interpreter.rb +15 -2
- data/lib/bfrb.rb +3 -3
- metadata +11 -11
data/README.rdoc
CHANGED
@@ -11,6 +11,7 @@ To install bfrb:
|
|
11
11
|
% gem install bfrb
|
12
12
|
|
13
13
|
Once bfrb is installed, you can use it to interpret your brainfuck code.
|
14
|
+
|
14
15
|
First, you can pass brainfuck code directly into it, as long as it is wrapped in quotes.
|
15
16
|
|
16
17
|
% bfrb ",[.,]"
|
@@ -22,9 +23,18 @@ Or, you can specify a file with the -f parameter:
|
|
22
23
|
You can also start an interactive interpreter by running bfrb without any parameters
|
23
24
|
|
24
25
|
% bfrb
|
26
|
+
|
27
|
+
Just in case you feel the need to use another language internally in a Ruby program, I guess you can:
|
28
|
+
|
29
|
+
require 'rubygems'
|
30
|
+
require 'bfrb'
|
31
|
+
|
32
|
+
bf = BfRb::Base.new
|
33
|
+
bf.run ",[.,]"
|
25
34
|
|
26
35
|
== History
|
27
36
|
|
37
|
+
* 0.1.4 - Added a little more documentation, efficiency fixes and Ctrl-X to exit a program
|
28
38
|
* 0.1.3 - Unmatched brace checks
|
29
39
|
* 0.1.2 - Added unit tests
|
30
40
|
* 0.1.1 - Added REPL.
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.1.
|
1
|
+
0.1.4
|
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.4"
|
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-09}
|
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/lib/bfrb/interpreter.rb
CHANGED
@@ -26,9 +26,11 @@ module BfRb
|
|
26
26
|
|
27
27
|
# run a given piece of code
|
28
28
|
def run(code)
|
29
|
-
@code += code
|
29
|
+
@code += code.delete "^[]<>.,+-"
|
30
30
|
if check_for_matching_braces
|
31
|
-
|
31
|
+
catch :quit do
|
32
|
+
evaluate_code
|
33
|
+
end
|
32
34
|
end
|
33
35
|
end
|
34
36
|
|
@@ -63,26 +65,36 @@ module BfRb
|
|
63
65
|
# evaluate an individual instruction
|
64
66
|
def evaluate_instruction(instruction)
|
65
67
|
case instruction
|
68
|
+
# shift right in memory
|
66
69
|
when ">"
|
67
70
|
@memory_counter += 1
|
71
|
+
# shift left in memory, unless we're at the beginning
|
68
72
|
when "<"
|
69
73
|
if @memory_counter > 1
|
70
74
|
@memory_counter -= 1
|
71
75
|
else
|
72
76
|
@memory_counter = 0
|
73
77
|
end
|
78
|
+
# increment value in memory
|
74
79
|
when "+"
|
75
80
|
@memory.set(@memory_counter, current_memory + 1)
|
81
|
+
# decrement value in memory
|
76
82
|
when "-"
|
77
83
|
unless current_memory == 0
|
78
84
|
@memory.set(@memory_counter, current_memory - 1)
|
79
85
|
end
|
86
|
+
# print value in memory
|
80
87
|
when "."
|
81
88
|
@output_stream.print current_memory.chr
|
89
|
+
# input a character into memory
|
82
90
|
when ","
|
83
91
|
@output_stream.puts
|
84
92
|
input = @input_stream.gets.getbyte(0)
|
93
|
+
if input == 24
|
94
|
+
throw :quit
|
95
|
+
end
|
85
96
|
@memory.set(@memory_counter, input)
|
97
|
+
# jump to the closing bracket if memory is 0
|
86
98
|
when "["
|
87
99
|
if current_memory != 0
|
88
100
|
@loop_stack.push @program_counter
|
@@ -97,6 +109,7 @@ module BfRb
|
|
97
109
|
end
|
98
110
|
end
|
99
111
|
end
|
112
|
+
# return to the opening bracket if memory is not zero
|
100
113
|
when "]"
|
101
114
|
matching_bracket = @loop_stack.pop
|
102
115
|
if current_memory != 0
|
data/lib/bfrb.rb
CHANGED
@@ -22,15 +22,15 @@ module BfRb
|
|
22
22
|
|
23
23
|
# interactive read-evaluate-print loop
|
24
24
|
def repl
|
25
|
-
puts "'exit' leaves the REPL"
|
25
|
+
puts "'exit' or Ctrl-X leaves the REPL"
|
26
26
|
puts "'mem' displays the value in the current cell of memory"
|
27
27
|
puts "'clear' clears everything from memory"
|
28
28
|
while true
|
29
29
|
puts ""
|
30
|
-
print "
|
30
|
+
print "bfrb> "
|
31
31
|
input = gets.chomp
|
32
32
|
case input
|
33
|
-
when "exit"
|
33
|
+
when "exit", 24.chr
|
34
34
|
puts "Exiting"
|
35
35
|
break
|
36
36
|
when "mem"
|
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.4
|
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-09 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: &8122320 !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: *8122320
|
26
26
|
- !ruby/object:Gem::Dependency
|
27
27
|
name: bundler
|
28
|
-
requirement: &
|
28
|
+
requirement: &8115540 !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: *8115540
|
37
37
|
- !ruby/object:Gem::Dependency
|
38
38
|
name: jeweler
|
39
|
-
requirement: &
|
39
|
+
requirement: &8096772 !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: *8096772
|
48
48
|
- !ruby/object:Gem::Dependency
|
49
49
|
name: rcov
|
50
|
-
requirement: &
|
50
|
+
requirement: &8095248 !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: *8095248
|
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: 950763631
|
97
97
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
98
98
|
none: false
|
99
99
|
requirements:
|