bfrb 0.1.0
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/.document +5 -0
- data/Gemfile +13 -0
- data/Gemfile.lock +20 -0
- data/README.rdoc +17 -0
- data/Rakefile +53 -0
- data/VERSION +1 -0
- data/bfrb.gemspec +66 -0
- data/bin/bfrb +25 -0
- data/lib/bfrb/interpreter.rb +75 -0
- data/lib/bfrb/memory.rb +28 -0
- data/lib/bfrb.rb +23 -0
- data/test/helper.rb +18 -0
- data/test/test_bfrb.rb +7 -0
- metadata +111 -0
data/.document
ADDED
data/Gemfile
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
source "http://rubygems.org"
|
2
|
+
# Add dependencies required to use your gem here.
|
3
|
+
# Example:
|
4
|
+
# gem "activesupport", ">= 2.3.5"
|
5
|
+
|
6
|
+
# Add dependencies to develop your gem here.
|
7
|
+
# Include everything needed to run rake, tests, features, etc.
|
8
|
+
group :development do
|
9
|
+
gem "shoulda", ">= 0"
|
10
|
+
gem "bundler", "~> 1.0.0"
|
11
|
+
gem "jeweler", "~> 1.5.2"
|
12
|
+
gem "rcov", ">= 0"
|
13
|
+
end
|
data/Gemfile.lock
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
GEM
|
2
|
+
remote: http://rubygems.org/
|
3
|
+
specs:
|
4
|
+
git (1.2.5)
|
5
|
+
jeweler (1.5.2)
|
6
|
+
bundler (~> 1.0.0)
|
7
|
+
git (>= 1.2.5)
|
8
|
+
rake
|
9
|
+
rake (0.8.7)
|
10
|
+
rcov (0.9.9)
|
11
|
+
shoulda (2.11.3)
|
12
|
+
|
13
|
+
PLATFORMS
|
14
|
+
x86-mingw32
|
15
|
+
|
16
|
+
DEPENDENCIES
|
17
|
+
bundler (~> 1.0.0)
|
18
|
+
jeweler (~> 1.5.2)
|
19
|
+
rcov
|
20
|
+
shoulda
|
data/README.rdoc
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
= bfrb
|
2
|
+
|
3
|
+
bfrb is a simple brainfuck interpreter written in Ruby.
|
4
|
+
|
5
|
+
== Usage
|
6
|
+
|
7
|
+
To install bfrb:
|
8
|
+
|
9
|
+
% gem install bfrb
|
10
|
+
|
11
|
+
After installation, you can use bfrb in two ways. First, you can pass brainfuck code directly into it, as long as it is wrapped in quotes.
|
12
|
+
|
13
|
+
% bfrb ",[.,]"
|
14
|
+
|
15
|
+
Or, you can specify a file with the -f parameter:
|
16
|
+
|
17
|
+
% bfrb -f test.bf
|
data/Rakefile
ADDED
@@ -0,0 +1,53 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'bundler'
|
3
|
+
begin
|
4
|
+
Bundler.setup(:default, :development)
|
5
|
+
rescue Bundler::BundlerError => e
|
6
|
+
$stderr.puts e.message
|
7
|
+
$stderr.puts "Run `bundle install` to install missing gems"
|
8
|
+
exit e.status_code
|
9
|
+
end
|
10
|
+
require 'rake'
|
11
|
+
|
12
|
+
require 'jeweler'
|
13
|
+
Jeweler::Tasks.new do |gem|
|
14
|
+
# gem is a Gem::Specification... see http://docs.rubygems.org/read/chapter/20 for more options
|
15
|
+
gem.name = "bfrb"
|
16
|
+
gem.homepage = "http://github.com/ctoneal/bfrb"
|
17
|
+
gem.license = "MIT"
|
18
|
+
gem.summary = %Q{A simple brainfuck interpreter in Ruby}
|
19
|
+
gem.description = %Q{bfrb is a brainfuck interpreter written in Ruby.}
|
20
|
+
gem.email = "ctoneal@gmail.com"
|
21
|
+
gem.authors = ["Chris ONeal"]
|
22
|
+
# Include your dependencies below. Runtime dependencies are required when using your gem,
|
23
|
+
# and development dependencies are only needed for development (ie running rake tasks, tests, etc)
|
24
|
+
# gem.add_runtime_dependency 'jabber4r', '> 0.1'
|
25
|
+
# gem.add_development_dependency 'rspec', '> 1.2.3'
|
26
|
+
end
|
27
|
+
Jeweler::RubygemsDotOrgTasks.new
|
28
|
+
|
29
|
+
require 'rake/testtask'
|
30
|
+
Rake::TestTask.new(:test) do |test|
|
31
|
+
test.libs << 'lib' << 'test'
|
32
|
+
test.pattern = 'test/**/test_*.rb'
|
33
|
+
test.verbose = true
|
34
|
+
end
|
35
|
+
|
36
|
+
require 'rcov/rcovtask'
|
37
|
+
Rcov::RcovTask.new do |test|
|
38
|
+
test.libs << 'test'
|
39
|
+
test.pattern = 'test/**/test_*.rb'
|
40
|
+
test.verbose = true
|
41
|
+
end
|
42
|
+
|
43
|
+
task :default => :test
|
44
|
+
|
45
|
+
require 'rake/rdoctask'
|
46
|
+
Rake::RDocTask.new do |rdoc|
|
47
|
+
version = File.exist?('VERSION') ? File.read('VERSION') : ""
|
48
|
+
|
49
|
+
rdoc.rdoc_dir = 'rdoc'
|
50
|
+
rdoc.title = "bfrb #{version}"
|
51
|
+
rdoc.rdoc_files.include('README*')
|
52
|
+
rdoc.rdoc_files.include('lib/**/*.rb')
|
53
|
+
end
|
data/VERSION
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
0.1.0
|
data/bfrb.gemspec
ADDED
@@ -0,0 +1,66 @@
|
|
1
|
+
# Generated by jeweler
|
2
|
+
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
+
# Instead, edit Jeweler::Tasks in rakefile, and run 'rake gemspec'
|
4
|
+
# -*- encoding: utf-8 -*-
|
5
|
+
|
6
|
+
Gem::Specification.new do |s|
|
7
|
+
s.name = %q{bfrb}
|
8
|
+
s.version = "0.1.0"
|
9
|
+
|
10
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
|
+
s.authors = ["Chris ONeal"]
|
12
|
+
s.date = %q{2011-06-03}
|
13
|
+
s.default_executable = %q{bfrb}
|
14
|
+
s.description = %q{bfrb is a brainfuck interpreter written in Ruby.}
|
15
|
+
s.email = %q{ctoneal@gmail.com}
|
16
|
+
s.executables = ["bfrb"]
|
17
|
+
s.extra_rdoc_files = [
|
18
|
+
"README.rdoc"
|
19
|
+
]
|
20
|
+
s.files = [
|
21
|
+
".document",
|
22
|
+
"Gemfile",
|
23
|
+
"Gemfile.lock",
|
24
|
+
"README.rdoc",
|
25
|
+
"Rakefile",
|
26
|
+
"VERSION",
|
27
|
+
"bfrb.gemspec",
|
28
|
+
"bin/bfrb",
|
29
|
+
"lib/bfrb.rb",
|
30
|
+
"lib/bfrb/interpreter.rb",
|
31
|
+
"lib/bfrb/memory.rb",
|
32
|
+
"test/helper.rb",
|
33
|
+
"test/test_bfrb.rb"
|
34
|
+
]
|
35
|
+
s.homepage = %q{http://github.com/ctoneal/bfrb}
|
36
|
+
s.licenses = ["MIT"]
|
37
|
+
s.require_paths = ["lib"]
|
38
|
+
s.rubygems_version = %q{1.6.2}
|
39
|
+
s.summary = %q{A simple brainfuck interpreter in Ruby}
|
40
|
+
s.test_files = [
|
41
|
+
"test/helper.rb",
|
42
|
+
"test/test_bfrb.rb"
|
43
|
+
]
|
44
|
+
|
45
|
+
if s.respond_to? :specification_version then
|
46
|
+
s.specification_version = 3
|
47
|
+
|
48
|
+
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
49
|
+
s.add_development_dependency(%q<shoulda>, [">= 0"])
|
50
|
+
s.add_development_dependency(%q<bundler>, ["~> 1.0.0"])
|
51
|
+
s.add_development_dependency(%q<jeweler>, ["~> 1.5.2"])
|
52
|
+
s.add_development_dependency(%q<rcov>, [">= 0"])
|
53
|
+
else
|
54
|
+
s.add_dependency(%q<shoulda>, [">= 0"])
|
55
|
+
s.add_dependency(%q<bundler>, ["~> 1.0.0"])
|
56
|
+
s.add_dependency(%q<jeweler>, ["~> 1.5.2"])
|
57
|
+
s.add_dependency(%q<rcov>, [">= 0"])
|
58
|
+
end
|
59
|
+
else
|
60
|
+
s.add_dependency(%q<shoulda>, [">= 0"])
|
61
|
+
s.add_dependency(%q<bundler>, ["~> 1.0.0"])
|
62
|
+
s.add_dependency(%q<jeweler>, ["~> 1.5.2"])
|
63
|
+
s.add_dependency(%q<rcov>, [">= 0"])
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
data/bin/bfrb
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require File.expand_path(File.join(File.dirname(__FILE__), "..", "lib", "bfrb.rb"))
|
4
|
+
|
5
|
+
def usage
|
6
|
+
puts "Usage:"
|
7
|
+
puts "Pass code in as first command line parameter (in quotes): bfrb \",[.,]\""
|
8
|
+
puts "Specify a file to read: bfrb -f test.bf"
|
9
|
+
end
|
10
|
+
|
11
|
+
bfrb = BfRb::Base.new
|
12
|
+
# if the command line params specify a file, run it
|
13
|
+
# otherwise attempt to run code passed in as a param
|
14
|
+
if ARGV.length > 1
|
15
|
+
if ARGV[0] == "-f"
|
16
|
+
bfrb.load_file(ARGV[1])
|
17
|
+
else
|
18
|
+
puts "Invalid arguments"
|
19
|
+
usage
|
20
|
+
end
|
21
|
+
elsif ARGV.length > 0
|
22
|
+
bfrb.run(ARGV[0])
|
23
|
+
else
|
24
|
+
usage
|
25
|
+
end
|
@@ -0,0 +1,75 @@
|
|
1
|
+
require File.expand_path(File.join(File.dirname(__FILE__), "memory.rb"))
|
2
|
+
|
3
|
+
module BfRb
|
4
|
+
# interprets brainfuck code
|
5
|
+
class Interpreter
|
6
|
+
|
7
|
+
# initialize the interpreter
|
8
|
+
def initialize
|
9
|
+
@memory = Memory.new
|
10
|
+
initialize_environment
|
11
|
+
end
|
12
|
+
|
13
|
+
# cleans the memory and initializes member variables
|
14
|
+
def initialize_environment
|
15
|
+
@memory.clear
|
16
|
+
@program_counter = 0
|
17
|
+
@memory_counter = 0
|
18
|
+
@code = ""
|
19
|
+
@loop_stack = []
|
20
|
+
end
|
21
|
+
|
22
|
+
def run(code)
|
23
|
+
@code = code
|
24
|
+
evaluate_code
|
25
|
+
end
|
26
|
+
|
27
|
+
def evaluate_code
|
28
|
+
while ((0 <= @program_counter) and (@program_counter < @code.length))
|
29
|
+
evaluate_instruction
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def evaluate_instruction
|
34
|
+
case @code[@program_counter]
|
35
|
+
when ">"
|
36
|
+
@memory_counter += 1
|
37
|
+
when "<"
|
38
|
+
if @memory_counter > 1
|
39
|
+
@memory_counter -= 1
|
40
|
+
else
|
41
|
+
@memory_counter = 0
|
42
|
+
end
|
43
|
+
when "+"
|
44
|
+
@memory.set(@memory_counter, @memory.get(@memory_counter) + 1)
|
45
|
+
when "-"
|
46
|
+
@memory.set(@memory_counter, @memory.get(@memory_counter) - 1)
|
47
|
+
when "."
|
48
|
+
print @memory.get(@memory_counter).chr
|
49
|
+
when ","
|
50
|
+
input = $stdin.gets.getbyte(0)
|
51
|
+
@memory.set(@memory_counter, input)
|
52
|
+
when "["
|
53
|
+
if @memory.get(@memory_counter) != 0
|
54
|
+
@loop_stack.push @program_counter
|
55
|
+
else
|
56
|
+
bracket_counter = 1
|
57
|
+
while ((bracket_counter != 0) and (@program_counter < @code.length - 1))
|
58
|
+
@program_counter += 1
|
59
|
+
if @code[@program_counter] == "["
|
60
|
+
bracket_counter += 1
|
61
|
+
elsif @code[@program_counter] == "]"
|
62
|
+
bracket_counter -= 1
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
when "]"
|
67
|
+
matching_bracket = @loop_stack.pop
|
68
|
+
if @memory.get(@memory_counter) != 0
|
69
|
+
@program_counter = matching_bracket - 1
|
70
|
+
end
|
71
|
+
end
|
72
|
+
@program_counter += 1
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
data/lib/bfrb/memory.rb
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
module BfRb
|
2
|
+
# memory for brainfuck interpreter
|
3
|
+
class Memory
|
4
|
+
|
5
|
+
# initialize the memory
|
6
|
+
def initialize
|
7
|
+
clear
|
8
|
+
end
|
9
|
+
|
10
|
+
# get the value at the given address
|
11
|
+
def get(address)
|
12
|
+
unless @mem.has_key?(address)
|
13
|
+
set(address, 0)
|
14
|
+
end
|
15
|
+
return @mem[address]
|
16
|
+
end
|
17
|
+
|
18
|
+
# set the given address to a certain value
|
19
|
+
def set(address, value)
|
20
|
+
@mem[address] = value
|
21
|
+
end
|
22
|
+
|
23
|
+
# clear the memory
|
24
|
+
def clear
|
25
|
+
@mem = {}
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
data/lib/bfrb.rb
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
require File.expand_path(File.join(File.dirname(__FILE__), "bfrb", "interpreter.rb"))
|
2
|
+
|
3
|
+
module BfRb
|
4
|
+
# loads and interprets brainfuck code
|
5
|
+
class Base
|
6
|
+
|
7
|
+
# initialize the interpreter
|
8
|
+
def initialize
|
9
|
+
@interpreter = Interpreter.new
|
10
|
+
end
|
11
|
+
|
12
|
+
# run the given brainfuck code
|
13
|
+
def run(code)
|
14
|
+
@interpreter.run(code)
|
15
|
+
end
|
16
|
+
|
17
|
+
# load brainfuck code from a file and run it
|
18
|
+
def load_file(file_path)
|
19
|
+
code = File.open(file_path) { |f| f.read }
|
20
|
+
run(code)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
data/test/helper.rb
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'bundler'
|
3
|
+
begin
|
4
|
+
Bundler.setup(:default, :development)
|
5
|
+
rescue Bundler::BundlerError => e
|
6
|
+
$stderr.puts e.message
|
7
|
+
$stderr.puts "Run `bundle install` to install missing gems"
|
8
|
+
exit e.status_code
|
9
|
+
end
|
10
|
+
require 'test/unit'
|
11
|
+
require 'shoulda'
|
12
|
+
|
13
|
+
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
14
|
+
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
15
|
+
require 'bfrb'
|
16
|
+
|
17
|
+
class Test::Unit::TestCase
|
18
|
+
end
|
data/test/test_bfrb.rb
ADDED
metadata
ADDED
@@ -0,0 +1,111 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: bfrb
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Chris ONeal
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2011-06-03 00:00:00.000000000 -05:00
|
13
|
+
default_executable: bfrb
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: shoulda
|
17
|
+
requirement: &8092368 !ruby/object:Gem::Requirement
|
18
|
+
none: false
|
19
|
+
requirements:
|
20
|
+
- - ! '>='
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: '0'
|
23
|
+
type: :development
|
24
|
+
prerelease: false
|
25
|
+
version_requirements: *8092368
|
26
|
+
- !ruby/object:Gem::Dependency
|
27
|
+
name: bundler
|
28
|
+
requirement: &8091288 !ruby/object:Gem::Requirement
|
29
|
+
none: false
|
30
|
+
requirements:
|
31
|
+
- - ~>
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 1.0.0
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: *8091288
|
37
|
+
- !ruby/object:Gem::Dependency
|
38
|
+
name: jeweler
|
39
|
+
requirement: &8089740 !ruby/object:Gem::Requirement
|
40
|
+
none: false
|
41
|
+
requirements:
|
42
|
+
- - ~>
|
43
|
+
- !ruby/object:Gem::Version
|
44
|
+
version: 1.5.2
|
45
|
+
type: :development
|
46
|
+
prerelease: false
|
47
|
+
version_requirements: *8089740
|
48
|
+
- !ruby/object:Gem::Dependency
|
49
|
+
name: rcov
|
50
|
+
requirement: &8073336 !ruby/object:Gem::Requirement
|
51
|
+
none: false
|
52
|
+
requirements:
|
53
|
+
- - ! '>='
|
54
|
+
- !ruby/object:Gem::Version
|
55
|
+
version: '0'
|
56
|
+
type: :development
|
57
|
+
prerelease: false
|
58
|
+
version_requirements: *8073336
|
59
|
+
description: bfrb is a brainfuck interpreter written in Ruby.
|
60
|
+
email: ctoneal@gmail.com
|
61
|
+
executables:
|
62
|
+
- bfrb
|
63
|
+
extensions: []
|
64
|
+
extra_rdoc_files:
|
65
|
+
- README.rdoc
|
66
|
+
files:
|
67
|
+
- .document
|
68
|
+
- Gemfile
|
69
|
+
- Gemfile.lock
|
70
|
+
- README.rdoc
|
71
|
+
- Rakefile
|
72
|
+
- VERSION
|
73
|
+
- bfrb.gemspec
|
74
|
+
- bin/bfrb
|
75
|
+
- lib/bfrb.rb
|
76
|
+
- lib/bfrb/interpreter.rb
|
77
|
+
- lib/bfrb/memory.rb
|
78
|
+
- test/helper.rb
|
79
|
+
- test/test_bfrb.rb
|
80
|
+
has_rdoc: true
|
81
|
+
homepage: http://github.com/ctoneal/bfrb
|
82
|
+
licenses:
|
83
|
+
- MIT
|
84
|
+
post_install_message:
|
85
|
+
rdoc_options: []
|
86
|
+
require_paths:
|
87
|
+
- lib
|
88
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
89
|
+
none: false
|
90
|
+
requirements:
|
91
|
+
- - ! '>='
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
version: '0'
|
94
|
+
segments:
|
95
|
+
- 0
|
96
|
+
hash: -476785
|
97
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
98
|
+
none: false
|
99
|
+
requirements:
|
100
|
+
- - ! '>='
|
101
|
+
- !ruby/object:Gem::Version
|
102
|
+
version: '0'
|
103
|
+
requirements: []
|
104
|
+
rubyforge_project:
|
105
|
+
rubygems_version: 1.6.2
|
106
|
+
signing_key:
|
107
|
+
specification_version: 3
|
108
|
+
summary: A simple brainfuck interpreter in Ruby
|
109
|
+
test_files:
|
110
|
+
- test/helper.rb
|
111
|
+
- test/test_bfrb.rb
|