ookie 0.2.1 → 0.3.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/README.rdoc +11 -5
- data/bin/ookie +2 -1
- data/lib/ookie/interpreter.rb +49 -20
- data/lib/ookie/version.rb +2 -2
- data/ookie.gemspec +97 -0
- metadata +6 -5
data/README.rdoc
CHANGED
@@ -1,15 +1,21 @@
|
|
1
1
|
= ookie
|
2
2
|
|
3
|
-
ookie is an Ook! language interpreter written in Ruby, aimed at:
|
3
|
+
ookie is an Ook! and Brainfuck language interpreter written in Ruby, aimed at:
|
4
4
|
|
5
|
-
* executing your classy Ook
|
5
|
+
* executing your classy Ook!/BF code by embedding a shebang line:
|
6
6
|
|
7
7
|
#!/usr/bin/env ookie
|
8
|
-
<< classy Ook! code >>
|
9
8
|
|
10
|
-
|
9
|
+
<< classy code >>
|
11
10
|
|
12
|
-
|
11
|
+
* executing your Ook!/BF code using the command line tool:
|
12
|
+
|
13
|
+
$ ookie mycode.ook # => Ook! code
|
14
|
+
$ ookie mycode.b # => Brainfuck code
|
15
|
+
|
16
|
+
* embedding your Ook!/BF code as a String in your Ruby code
|
17
|
+
|
18
|
+
Ookie.run(%q{ just as classy Brainfuck code }, :bfk)
|
13
19
|
|
14
20
|
You can test it behind a simple web interface at http://ook.heroku.com
|
15
21
|
|
data/bin/ookie
CHANGED
@@ -14,7 +14,7 @@ $LOAD_PATH.unshift File.expand_path('../../lib', __FILE__)
|
|
14
14
|
require 'ookie'
|
15
15
|
|
16
16
|
def usage
|
17
|
-
STDERR.puts "Ookie Ook! interpreter #{Ookie::Version::STRING}\n\nUsage: #{File.basename $0} [-v] <file
|
17
|
+
STDERR.puts "Ookie Ook! & Brainfuck interpreter #{Ookie::Version::STRING}\n\nUsage: #{File.basename $0} [-v] <file>\n\n\t-v\t:= turn on verbose output\n\tfile\t:= any file, yet BF will only be used for .b files"
|
18
18
|
exit 1
|
19
19
|
end
|
20
20
|
|
@@ -35,6 +35,7 @@ end
|
|
35
35
|
|
36
36
|
begin
|
37
37
|
ookie = Ookie::Interpreter.new(code)
|
38
|
+
ookie.lang = arg.end_with?('.b') ? :bfk : :ook
|
38
39
|
ookie.verbose = verbose
|
39
40
|
ookie.run
|
40
41
|
rescue => ex
|
data/lib/ookie/interpreter.rb
CHANGED
@@ -11,29 +11,32 @@
|
|
11
11
|
module Ookie
|
12
12
|
class Interpreter
|
13
13
|
RE_OOK_CODE = /\s*(Ook[!?\.])\s*/
|
14
|
+
RE_BFK_CODE = /\s*([<>\+-\.,\[\]])\s*/
|
14
15
|
|
15
16
|
CodeInfo = Class.new(StandardError)
|
16
17
|
EndOfInstructions = Class.new(CodeInfo)
|
17
18
|
|
18
19
|
CodeError = Class.new(StandardError)
|
20
|
+
NoCode = Class.new(CodeError)
|
19
21
|
UnmatchedStartLoop = Class.new(CodeError)
|
20
22
|
UnmatchedEndLoop = Class.new(CodeError)
|
21
|
-
|
22
|
-
|
23
|
+
|
24
|
+
OokCodeError = Class.new(StandardError)
|
25
|
+
OddNumberOfOoks = Class.new(OokCodeError)
|
23
26
|
|
24
27
|
attr_reader :ooks, :mem, :pc, :loops
|
25
28
|
attr_writer :verbose
|
26
|
-
attr_accessor :ifd, :ofd, :
|
29
|
+
attr_accessor :code, :ifd, :ofd, :efd, :lang
|
27
30
|
|
28
31
|
def verbose(msg = nil)
|
29
|
-
|
32
|
+
@efd.puts "#{self.class}: #{msg}" if @verbose and msg
|
30
33
|
@verbose
|
31
34
|
end
|
32
35
|
|
33
|
-
def initialize(code = '', ifd = STDIN, ofd = STDOUT)
|
36
|
+
def initialize(code = '', ifd = STDIN, ofd = STDOUT, efd = STDERR)
|
34
37
|
@verbose = false
|
35
|
-
@ifd, @ofd = ifd, ofd
|
36
|
-
@
|
38
|
+
@code, @ifd, @ofd, @efd = code, ifd, ofd, efd
|
39
|
+
@lang = :ook
|
37
40
|
reset!
|
38
41
|
end
|
39
42
|
|
@@ -43,13 +46,14 @@ module Ookie
|
|
43
46
|
@mem = MemoryArray.new
|
44
47
|
end
|
45
48
|
|
46
|
-
def self.run(code)
|
47
|
-
new.run(code)
|
49
|
+
def self.run(code, lang = :ook)
|
50
|
+
new.run(code, lang)
|
48
51
|
end
|
49
52
|
|
50
|
-
def run(code = nil)
|
53
|
+
def run(code = nil, lang = nil)
|
51
54
|
@code = code if code
|
52
|
-
|
55
|
+
@lang = lang if lang
|
56
|
+
send("parse_#@lang")
|
53
57
|
loop { stepi }
|
54
58
|
rescue EndOfInstructions
|
55
59
|
verbose 'program finished correctly'
|
@@ -57,7 +61,7 @@ module Ookie
|
|
57
61
|
|
58
62
|
def stepi
|
59
63
|
insn = next_insn
|
60
|
-
if insn.
|
64
|
+
if insn.nil?
|
61
65
|
raise UnmatchedStartLoop unless @loops.empty?
|
62
66
|
raise EndOfInstructions
|
63
67
|
end
|
@@ -116,6 +120,10 @@ module Ookie
|
|
116
120
|
|
117
121
|
private
|
118
122
|
|
123
|
+
def next_insn
|
124
|
+
@ooks[@pc]
|
125
|
+
end
|
126
|
+
|
119
127
|
def skip_loop
|
120
128
|
nesting = 1
|
121
129
|
loop do
|
@@ -131,16 +139,37 @@ module Ookie
|
|
131
139
|
end
|
132
140
|
end
|
133
141
|
|
134
|
-
def
|
135
|
-
@ooks = @code.scan(
|
136
|
-
raise
|
137
|
-
|
142
|
+
def parse_helper(re)
|
143
|
+
@ooks = @code.scan(re).flatten
|
144
|
+
raise NoCode if @ooks.empty?
|
145
|
+
@ooks = yield
|
138
146
|
end
|
139
147
|
|
140
|
-
def
|
141
|
-
|
142
|
-
|
143
|
-
|
148
|
+
def parse_ook
|
149
|
+
parse_helper(RE_OOK_CODE) do
|
150
|
+
raise OddNumberOfOoks if @ooks.size.odd?
|
151
|
+
@ooks.each_slice(2).entries.collect! do |o|
|
152
|
+
o.join('_').downcase.gsub('!', 'x').gsub('?', 'q').gsub('.', 'd')
|
153
|
+
end
|
154
|
+
end
|
155
|
+
end
|
156
|
+
|
157
|
+
def parse_bfk
|
158
|
+
parse_helper(RE_BFK_CODE) do
|
159
|
+
@ooks.collect! do |b|
|
160
|
+
case b
|
161
|
+
when '>' then 'ookd_ookq'
|
162
|
+
when '<' then 'ookq_ookd'
|
163
|
+
when '+' then 'ookd_ookd'
|
164
|
+
when '-' then 'ookx_ookx'
|
165
|
+
when '.' then 'ookx_ookd'
|
166
|
+
when ',' then 'ookd_ookx'
|
167
|
+
when '[' then 'ookx_ookq'
|
168
|
+
else 'ookq_ookx'
|
169
|
+
end
|
170
|
+
end
|
171
|
+
end
|
144
172
|
end
|
173
|
+
|
145
174
|
end
|
146
175
|
end
|
data/lib/ookie/version.rb
CHANGED
data/ookie.gemspec
ADDED
@@ -0,0 +1,97 @@
|
|
1
|
+
# Generated by jeweler
|
2
|
+
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
+
# Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
|
4
|
+
# -*- encoding: utf-8 -*-
|
5
|
+
|
6
|
+
Gem::Specification.new do |s|
|
7
|
+
s.name = %q{ookie}
|
8
|
+
s.version = "0.3.0"
|
9
|
+
|
10
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
|
+
s.authors = ["Alejandro Martinez Ruiz"]
|
12
|
+
s.date = %q{2010-10-23}
|
13
|
+
s.default_executable = %q{ookie}
|
14
|
+
s.description = %q{Ookie is a simple Ook! interpreter you can use to either directly execute your Ook! source code (via shebang) or embed it in your own Ruby programs}
|
15
|
+
s.email = %q{alex@flawedcode.org}
|
16
|
+
s.executables = ["ookie"]
|
17
|
+
s.extra_rdoc_files = [
|
18
|
+
"LICENSE.txt",
|
19
|
+
"README.rdoc"
|
20
|
+
]
|
21
|
+
s.files = [
|
22
|
+
".document",
|
23
|
+
".rspec",
|
24
|
+
"Gemfile",
|
25
|
+
"LICENSE.txt",
|
26
|
+
"README.rdoc",
|
27
|
+
"Rakefile",
|
28
|
+
"bin/ookie",
|
29
|
+
"examples/another.ook",
|
30
|
+
"examples/asciidown.ook",
|
31
|
+
"examples/bf2ook.ook",
|
32
|
+
"examples/cat.ook",
|
33
|
+
"examples/fibonacci.ook",
|
34
|
+
"examples/hello.ook",
|
35
|
+
"examples/holamundo.ook",
|
36
|
+
"examples/ook.ook",
|
37
|
+
"examples/prime.b",
|
38
|
+
"examples/prime.ook",
|
39
|
+
"examples/rev.ook",
|
40
|
+
"lib/ookie.rb",
|
41
|
+
"lib/ookie/interpreter.rb",
|
42
|
+
"lib/ookie/memoryarray.rb",
|
43
|
+
"lib/ookie/version.rb",
|
44
|
+
"ookie.gemspec",
|
45
|
+
"spec/ookie_spec.rb",
|
46
|
+
"spec/spec_helper.rb"
|
47
|
+
]
|
48
|
+
s.homepage = %q{http://github.com/unleashed/ookie}
|
49
|
+
s.require_paths = ["lib"]
|
50
|
+
s.rubygems_version = %q{1.3.7}
|
51
|
+
s.summary = %q{Ookie is a simple Ook! interpreter}
|
52
|
+
s.test_files = [
|
53
|
+
"spec/ookie_spec.rb",
|
54
|
+
"spec/spec_helper.rb"
|
55
|
+
]
|
56
|
+
|
57
|
+
if s.respond_to? :specification_version then
|
58
|
+
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
59
|
+
s.specification_version = 3
|
60
|
+
|
61
|
+
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
62
|
+
s.add_development_dependency(%q<rspec>, ["~> 2.0.0"])
|
63
|
+
s.add_development_dependency(%q<yard>, ["~> 0.6.0"])
|
64
|
+
s.add_development_dependency(%q<bundler>, ["~> 1.0.0"])
|
65
|
+
s.add_development_dependency(%q<jeweler>, ["~> 1.5.0.pre5"])
|
66
|
+
s.add_development_dependency(%q<rcov>, [">= 0"])
|
67
|
+
s.add_development_dependency(%q<rspec>, ["~> 2.0.0"])
|
68
|
+
s.add_development_dependency(%q<yard>, ["~> 0.6.0"])
|
69
|
+
s.add_development_dependency(%q<bundler>, ["~> 1.0.0"])
|
70
|
+
s.add_development_dependency(%q<jeweler>, ["~> 1.5.0.pre5"])
|
71
|
+
s.add_development_dependency(%q<rcov>, [">= 0"])
|
72
|
+
else
|
73
|
+
s.add_dependency(%q<rspec>, ["~> 2.0.0"])
|
74
|
+
s.add_dependency(%q<yard>, ["~> 0.6.0"])
|
75
|
+
s.add_dependency(%q<bundler>, ["~> 1.0.0"])
|
76
|
+
s.add_dependency(%q<jeweler>, ["~> 1.5.0.pre5"])
|
77
|
+
s.add_dependency(%q<rcov>, [">= 0"])
|
78
|
+
s.add_dependency(%q<rspec>, ["~> 2.0.0"])
|
79
|
+
s.add_dependency(%q<yard>, ["~> 0.6.0"])
|
80
|
+
s.add_dependency(%q<bundler>, ["~> 1.0.0"])
|
81
|
+
s.add_dependency(%q<jeweler>, ["~> 1.5.0.pre5"])
|
82
|
+
s.add_dependency(%q<rcov>, [">= 0"])
|
83
|
+
end
|
84
|
+
else
|
85
|
+
s.add_dependency(%q<rspec>, ["~> 2.0.0"])
|
86
|
+
s.add_dependency(%q<yard>, ["~> 0.6.0"])
|
87
|
+
s.add_dependency(%q<bundler>, ["~> 1.0.0"])
|
88
|
+
s.add_dependency(%q<jeweler>, ["~> 1.5.0.pre5"])
|
89
|
+
s.add_dependency(%q<rcov>, [">= 0"])
|
90
|
+
s.add_dependency(%q<rspec>, ["~> 2.0.0"])
|
91
|
+
s.add_dependency(%q<yard>, ["~> 0.6.0"])
|
92
|
+
s.add_dependency(%q<bundler>, ["~> 1.0.0"])
|
93
|
+
s.add_dependency(%q<jeweler>, ["~> 1.5.0.pre5"])
|
94
|
+
s.add_dependency(%q<rcov>, [">= 0"])
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
metadata
CHANGED
@@ -4,9 +4,9 @@ version: !ruby/object:Gem::Version
|
|
4
4
|
prerelease: false
|
5
5
|
segments:
|
6
6
|
- 0
|
7
|
-
-
|
8
|
-
-
|
9
|
-
version: 0.
|
7
|
+
- 3
|
8
|
+
- 0
|
9
|
+
version: 0.3.0
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Alejandro Martinez Ruiz
|
@@ -14,7 +14,7 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2010-10-
|
17
|
+
date: 2010-10-23 00:00:00 +02:00
|
18
18
|
default_executable: ookie
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
@@ -197,6 +197,7 @@ files:
|
|
197
197
|
- lib/ookie/interpreter.rb
|
198
198
|
- lib/ookie/memoryarray.rb
|
199
199
|
- lib/ookie/version.rb
|
200
|
+
- ookie.gemspec
|
200
201
|
- spec/ookie_spec.rb
|
201
202
|
- spec/spec_helper.rb
|
202
203
|
has_rdoc: true
|
@@ -213,7 +214,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
213
214
|
requirements:
|
214
215
|
- - ">="
|
215
216
|
- !ruby/object:Gem::Version
|
216
|
-
hash: -
|
217
|
+
hash: -1506199298662524959
|
217
218
|
segments:
|
218
219
|
- 0
|
219
220
|
version: "0"
|