mapleseed 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 ADDED
@@ -0,0 +1,5 @@
1
+ lib/**/*.rb
2
+ bin/*
3
+ -
4
+ features/**/*.feature
5
+ LICENSE.txt
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,38 @@
1
+ = Mapleseed
2
+
3
+ Mapleseed is a simple {Whirl}[http://www.bigzaphod.org/whirl/] interpreter written in Ruby.
4
+ Yes, I know I've been on a bit of an esoteric language interpreter kick. They're fun little toys.
5
+
6
+ == Usage
7
+
8
+ To install Mapleseed:
9
+
10
+ % gem install mapleseed
11
+
12
+ Once Mapleseed is installed, you can use it to interpret your Whirl code.
13
+
14
+ You can pass code directly into it, using the -c parameter.
15
+
16
+ % mapleseed -c "011000011110000111111"
17
+
18
+ Or, you can specify a file with the -f parameter:
19
+
20
+ % mapleseed -f test.wrl
21
+
22
+ You can also start an interactive interpreter by running Mapleseed without any parameters
23
+
24
+ % mapleseed
25
+
26
+ The list of options is viewable from the command line using the -h parameter.
27
+
28
+ % mapleseed -h
29
+
30
+ == Things That Might Get Done Eventually
31
+
32
+ * REPL
33
+ * File minimizer (turn whirl code into binary files and vice versa)
34
+ * Unit testing
35
+
36
+ == History
37
+
38
+ * 0.1.0 - Initial release. Allows running code passed in or from a file.
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 = "mapleseed"
16
+ gem.homepage = "http://github.com/ctoneal/mapleseed"
17
+ gem.license = "MIT"
18
+ gem.summary = %Q{A Whirl interpreter in Ruby}
19
+ gem.description = %Q{A simple Whirl interpreter}
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 = "mapleseed #{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/bin/mapleseed ADDED
@@ -0,0 +1,39 @@
1
+ #!/usr/bin/env ruby
2
+ require 'optparse'
3
+ require File.expand_path(File.join(File.dirname(__FILE__), "..", "lib", "mapleseed.rb"))
4
+
5
+ options = { :mode => :repl }
6
+ op = OptionParser.new do |x|
7
+ x.banner = "mapleseed <options>"
8
+ x.separator "\nUsing no options will start the interactive interpreter."
9
+ x.on("-f <file_path>", String, "Open a given file") do |f|
10
+ options[:mode] = :file
11
+ options[:file] = f
12
+ end
13
+ x.on("-c <code>", String, "Perform the given code") do |c|
14
+ options[:mode] = :code
15
+ options[:code] = c
16
+ end
17
+ x.on("-h", "Show this message") do
18
+ puts op
19
+ exit
20
+ end
21
+ end
22
+ begin
23
+ op.parse!(ARGV)
24
+ rescue
25
+ puts "Could not parse command line arguments."
26
+ end
27
+
28
+ ms = Mapleseed::Base.new
29
+ case options[:mode]
30
+ when :repl
31
+ # puts "Starting interactive interpreter..."
32
+ # ms.repl
33
+ when :file
34
+ puts "Running file..."
35
+ ms.load_file(options[:file])
36
+ when :code
37
+ puts "Interpreting code..."
38
+ ms.run(options[:code])
39
+ end
data/lib/mapleseed.rb ADDED
@@ -0,0 +1,28 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), "mapleseed", "interpreter.rb"))
2
+
3
+ module Mapleseed
4
+ # loads and interprets Whirl code
5
+ class Base
6
+
7
+ # initialize the interpreter
8
+ def initialize
9
+ @interpreter = Interpreter.new
10
+ end
11
+
12
+ # run the given code
13
+ def run(code)
14
+ @interpreter.run(code)
15
+ end
16
+
17
+ # load 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
+
23
+ # interactive read-evaluate-print loop
24
+ def repl
25
+ throw "Unimplemented"
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,63 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), "memory.rb"))
2
+ require File.expand_path(File.join(File.dirname(__FILE__), "ring.rb"))
3
+
4
+ module Mapleseed
5
+ #interprets Whirl code
6
+ class Interpreter
7
+ attr_reader :memory
8
+ attr_accessor :memory_position, :program_position,
9
+ :input_stream, :output_stream
10
+
11
+ # initializes the interpreter
12
+ def initialize
13
+ @memory = Memory.new
14
+ @input_stream = $stdin
15
+ @output_stream = $stdout
16
+ initialize_environment
17
+ end
18
+
19
+ def initialize_environment
20
+ @memory.clear
21
+ @op_ring = OpRing.new(self)
22
+ @math_ring = MathRing.new(self)
23
+ @memory_position = 0
24
+ @program_position = 0
25
+ @code = ""
26
+ @execute = false
27
+ @current_ring = @op_ring
28
+ end
29
+
30
+ # run a given piece of code
31
+ def run(code)
32
+ @code += code.delete "^01"
33
+ catch :quit do
34
+ evaluate_code
35
+ end
36
+ end
37
+
38
+ # evaluate each instruction in the current code
39
+ def evaluate_code
40
+ while ((0 <= @program_position) and (@program_position < @code.length))
41
+ evaluate_instruction(@code[@program_position])
42
+ end
43
+ end
44
+
45
+ # evaluate an individual instruction
46
+ def evaluate_instruction(instruction)
47
+ if instruction == "0"
48
+ @current_ring.switch_direction
49
+ if @execute
50
+ @current_ring.execute
51
+ @current_ring == @op_ring ? @current_ring = @math_ring : @current_ring = @op_ring
52
+ @execute = false
53
+ else
54
+ @execute = true
55
+ end
56
+ elsif instruction == "1"
57
+ @current_ring.rotate
58
+ @execute = false
59
+ end
60
+ @program_position += 1
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,28 @@
1
+ module Mapleseed
2
+ # memory for Whirl 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
@@ -0,0 +1,212 @@
1
+ module Mapleseed
2
+ # base class for whirl command rings
3
+ class Ring
4
+
5
+ # initialize the ring
6
+ def initialize(interpreter)
7
+ @position = 0
8
+ @value = 0
9
+ @direction = 1
10
+ @commands = []
11
+ @interpreter = interpreter
12
+ end
13
+
14
+ # change the direction of the ring
15
+ def switch_direction
16
+ @direction *= -1
17
+ end
18
+
19
+ # rotate the ring in the given direction
20
+ def rotate
21
+ @position += @direction
22
+ if @position == @commands.length
23
+ @position = 0
24
+ elsif @position == -1
25
+ @position = @commands.length - 1
26
+ end
27
+ end
28
+
29
+ def execute
30
+ if @position < @commands.length
31
+ send @commands[@position]
32
+ end
33
+ end
34
+ end
35
+
36
+ # command ring for whirl operations
37
+ class OpRing < Ring
38
+
39
+ # initialize commands for operation ring
40
+ def initialize(interpreter)
41
+ super(interpreter)
42
+ @commands = [:noop, :exit, :one, :zero, :load, :store, :p_add, :d_add, :logic, :if, :int_io, :asc_io]
43
+ end
44
+
45
+ # do nothing
46
+ def noop
47
+ #...
48
+ end
49
+
50
+ # exit the program
51
+ def exit
52
+ throw :quit
53
+ end
54
+
55
+ # set the ring value to 1
56
+ def one
57
+ @value = 1
58
+ end
59
+
60
+ # set the ring value to 0
61
+ def zero
62
+ @value = 0
63
+ end
64
+
65
+ # set the ring value to the current memory value
66
+ def load
67
+ @value = @interpreter.memory.get(@interpreter.memory_position)
68
+ end
69
+
70
+ # set the current value in memory to the ring value
71
+ def store
72
+ @interpreter.memory.set(@interpreter.memory_position, @value)
73
+ end
74
+
75
+ # change location in the program
76
+ def p_add
77
+ @interpreter.program_position += @value - 1
78
+ if @interpreter.program_position < 0
79
+ @interpreter.program_position = 0
80
+ end
81
+ end
82
+
83
+ # change location in memory
84
+ def d_add
85
+ @interpreter.memory_position += @value
86
+ end
87
+
88
+ # logical AND
89
+ def logic
90
+ if @interpreter.memory.get(@interpreter.memory_position) != 0 and @value != 0
91
+ @value = 1
92
+ else
93
+ @value = 0
94
+ end
95
+ end
96
+
97
+ # if value in memory is not 0, add ring value to program position
98
+ def if
99
+ if @interpreter.memory.get(@interpreter.memory_position) != 0
100
+ p_add
101
+ end
102
+ end
103
+
104
+ # if ring value is 0, set memory value to integer input, otherwise
105
+ # print memory value as an integer
106
+ def int_io
107
+ if @value == 0
108
+ str = @interpreter.input_stream.gets.chomp
109
+ @interpreter.memory.set(@interpreter.memory_position, str.to_i)
110
+ else
111
+ @interpreter.output_stream.print @interpreter.memory.get(@interpreter.memory_position)
112
+ end
113
+ end
114
+
115
+ # if ring value is 0, set memory value to character input, otherwise
116
+ # print memory value as an character
117
+ def asc_io
118
+ if @value == 0
119
+ str = @interpreter.input_stream.getc
120
+ @interpreter.memory.set(@interpreter.memory_position, str)
121
+ else
122
+ @interpreter.output_stream.putc @interpreter.memory.get(@interpreter.memory_position)
123
+ end
124
+ end
125
+ end
126
+
127
+ # command ring for whirl math operations
128
+ class MathRing < Ring
129
+
130
+ # initialize commands for math ring
131
+ def initialize(interpreter)
132
+ super(interpreter)
133
+ @commands = [:noop, :load, :store, :add, :mult, :div, :zero, :lt, :gt, :equal, :not, :neg]
134
+ end
135
+
136
+ # do nothing
137
+ def noop
138
+ #...
139
+ end
140
+
141
+ # set the ring value to the current memory value
142
+ def load
143
+ @value = @interpreter.memory.get(@interpreter.memory_position)
144
+ end
145
+
146
+ # set the current value in memory to the ring value
147
+ def store
148
+ @interpreter.memory.set(@interpreter.memory_position, @value)
149
+ end
150
+
151
+ # set ring value += memory value
152
+ def add
153
+ @value += @interpreter.memory.get(@interpreter.memory_position)
154
+ end
155
+
156
+ # set ring value *= memory value
157
+ def mult
158
+ @value *= @interpreter.memory.get(@interpreter.memory_position)
159
+ end
160
+
161
+ # set ring value /= memory value
162
+ def div
163
+ @value /= @interpreter.memory.get(@interpreter.memory_position)
164
+ end
165
+
166
+ # set ring value to 0
167
+ def zero
168
+ @value = 0
169
+ end
170
+
171
+ # if ring value is less than memory value, set value to 1, otherwise 0
172
+ def lt
173
+ if @value < @interpreter.memory.get(@interpreter.memory_position)
174
+ @value = 1
175
+ else
176
+ @value = 0
177
+ end
178
+ end
179
+
180
+ # if ring value is greater than memory value, set value to 1, otherwise 0
181
+ def gt
182
+ if @value > @interpreter.memory.get(@interpreter.memory_position)
183
+ @value = 1
184
+ else
185
+ @value = 0
186
+ end
187
+ end
188
+
189
+ # if ring value is equal to memory value, set value to 1, otherwise 0
190
+ def equal
191
+ if @value == @interpreter.memory.get(@interpreter.memory_position)
192
+ @value = 1
193
+ else
194
+ @value = 0
195
+ end
196
+ end
197
+
198
+ # if ring value is not 0, set value to 1, otherwise 0
199
+ def not
200
+ if @value == 0
201
+ @value = 1
202
+ else
203
+ @value = 0
204
+ end
205
+ end
206
+
207
+ # inverse ring value
208
+ def neg
209
+ @value *= -1
210
+ end
211
+ end
212
+ end
data/mapleseed.gemspec ADDED
@@ -0,0 +1,67 @@
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{mapleseed}
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-09}
13
+ s.default_executable = %q{mapleseed}
14
+ s.description = %q{A simple Whirl interpreter}
15
+ s.email = %q{ctoneal@gmail.com}
16
+ s.executables = ["mapleseed"]
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
+ "bin/mapleseed",
28
+ "lib/mapleseed.rb",
29
+ "lib/mapleseed/interpreter.rb",
30
+ "lib/mapleseed/memory.rb",
31
+ "lib/mapleseed/ring.rb",
32
+ "mapleseed.gemspec",
33
+ "test/helper.rb",
34
+ "test/test_mapleseed.rb"
35
+ ]
36
+ s.homepage = %q{http://github.com/ctoneal/mapleseed}
37
+ s.licenses = ["MIT"]
38
+ s.require_paths = ["lib"]
39
+ s.rubygems_version = %q{1.6.2}
40
+ s.summary = %q{A Whirl interpreter in Ruby}
41
+ s.test_files = [
42
+ "test/helper.rb",
43
+ "test/test_mapleseed.rb"
44
+ ]
45
+
46
+ if s.respond_to? :specification_version then
47
+ s.specification_version = 3
48
+
49
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
50
+ s.add_development_dependency(%q<shoulda>, [">= 0"])
51
+ s.add_development_dependency(%q<bundler>, ["~> 1.0.0"])
52
+ s.add_development_dependency(%q<jeweler>, ["~> 1.5.2"])
53
+ s.add_development_dependency(%q<rcov>, [">= 0"])
54
+ else
55
+ s.add_dependency(%q<shoulda>, [">= 0"])
56
+ s.add_dependency(%q<bundler>, ["~> 1.0.0"])
57
+ s.add_dependency(%q<jeweler>, ["~> 1.5.2"])
58
+ s.add_dependency(%q<rcov>, [">= 0"])
59
+ end
60
+ else
61
+ s.add_dependency(%q<shoulda>, [">= 0"])
62
+ s.add_dependency(%q<bundler>, ["~> 1.0.0"])
63
+ s.add_dependency(%q<jeweler>, ["~> 1.5.2"])
64
+ s.add_dependency(%q<rcov>, [">= 0"])
65
+ end
66
+ end
67
+
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 'mapleseed'
16
+
17
+ class Test::Unit::TestCase
18
+ end
@@ -0,0 +1,7 @@
1
+ require 'helper'
2
+
3
+ class TestMapleseed < Test::Unit::TestCase
4
+ should "probably rename this file and start testing for real" do
5
+ flunk "hey buddy, you should probably rename this file and start testing for real"
6
+ end
7
+ end
metadata ADDED
@@ -0,0 +1,112 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: mapleseed
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-09 00:00:00.000000000 -05:00
13
+ default_executable: mapleseed
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: shoulda
17
+ requirement: &7584708 !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: *7584708
26
+ - !ruby/object:Gem::Dependency
27
+ name: bundler
28
+ requirement: &7583712 !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: *7583712
37
+ - !ruby/object:Gem::Dependency
38
+ name: jeweler
39
+ requirement: &7579488 !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: *7579488
48
+ - !ruby/object:Gem::Dependency
49
+ name: rcov
50
+ requirement: &7578780 !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: *7578780
59
+ description: A simple Whirl interpreter
60
+ email: ctoneal@gmail.com
61
+ executables:
62
+ - mapleseed
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
+ - bin/mapleseed
74
+ - lib/mapleseed.rb
75
+ - lib/mapleseed/interpreter.rb
76
+ - lib/mapleseed/memory.rb
77
+ - lib/mapleseed/ring.rb
78
+ - mapleseed.gemspec
79
+ - test/helper.rb
80
+ - test/test_mapleseed.rb
81
+ has_rdoc: true
82
+ homepage: http://github.com/ctoneal/mapleseed
83
+ licenses:
84
+ - MIT
85
+ post_install_message:
86
+ rdoc_options: []
87
+ require_paths:
88
+ - lib
89
+ required_ruby_version: !ruby/object:Gem::Requirement
90
+ none: false
91
+ requirements:
92
+ - - ! '>='
93
+ - !ruby/object:Gem::Version
94
+ version: '0'
95
+ segments:
96
+ - 0
97
+ hash: -565126381
98
+ required_rubygems_version: !ruby/object:Gem::Requirement
99
+ none: false
100
+ requirements:
101
+ - - ! '>='
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ requirements: []
105
+ rubyforge_project:
106
+ rubygems_version: 1.6.2
107
+ signing_key:
108
+ specification_version: 3
109
+ summary: A Whirl interpreter in Ruby
110
+ test_files:
111
+ - test/helper.rb
112
+ - test/test_mapleseed.rb