ookie 0.3.0 → 0.3.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/Rakefile +2 -2
- data/examples/prime.b +223 -222
- data/lib/ookie/interpreter.rb +29 -2
- data/lib/ookie/version.rb +1 -1
- data/ookie.gemspec +4 -4
- metadata +6 -6
data/Rakefile
CHANGED
@@ -15,8 +15,8 @@ Jeweler::Tasks.new do |gem|
|
|
15
15
|
# gem is a Gem::Specification... see http://docs.rubygems.org/read/chapter/20 for more options
|
16
16
|
gem.name = "ookie"
|
17
17
|
gem.version = Ookie::Version::STRING
|
18
|
-
gem.summary = %Q{Ookie is a simple Ook! interpreter}
|
19
|
-
gem.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}
|
18
|
+
gem.summary = %Q{Ookie is a simple Ook! and Brainfuck interpreter}
|
19
|
+
gem.description = %Q{Ookie is a simple Ook! and Brainfuck interpreter you can use to either directly execute your Ook! or BF source code (via shebang) or embed it in your own Ruby programs}
|
20
20
|
gem.email = "alex@flawedcode.org"
|
21
21
|
gem.homepage = "http://github.com/unleashed/ookie"
|
22
22
|
gem.authors = ["Alejandro Martinez Ruiz"]
|
data/examples/prime.b
CHANGED
@@ -1,222 +1,223 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
>++++++++++[<++++++++++>-]
|
7
|
-
>++++++++++[<++++++++++>-]
|
8
|
-
>++++++++++[<++++++++++>-]
|
9
|
-
>++++++++++[<++++++++++>-]
|
10
|
-
|
11
|
-
|
12
|
-
>++++++++++[<++++++++++>-]
|
13
|
-
|
14
|
-
|
15
|
-
>++++++++++[<++++++++++>-]
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
----------
|
34
|
-
----------
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
[<<+>>-]
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
[>>[
|
99
|
-
>>
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
>[
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
< [>+<-]
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
>[
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
1
|
+
#!/usr/bin/env ookie
|
2
|
+
===================================================================
|
3
|
+
======================== OUTPUT STRING ============================
|
4
|
+
===================================================================
|
5
|
+
>++++++++[<++++++++>-]<++++++++++++++++.[-]
|
6
|
+
>++++++++++[<++++++++++>-]<++++++++++++++.[-]
|
7
|
+
>++++++++++[<++++++++++>-]<+++++.[-]
|
8
|
+
>++++++++++[<++++++++++>-]<+++++++++.[-]
|
9
|
+
>++++++++++[<++++++++++>-]<+.[-]
|
10
|
+
>++++++++++[<++++++++++>-]<+++++++++++++++.[-]
|
11
|
+
>+++++[<+++++>-]<+++++++.[-]
|
12
|
+
>++++++++++[<++++++++++>-]<+++++++++++++++++.[-]
|
13
|
+
>++++++++++[<++++++++++>-]<++++++++++++.[-]
|
14
|
+
>+++++[<+++++>-]<+++++++.[-]
|
15
|
+
>++++++++++[<++++++++++>-]<++++++++++++++++.[-]
|
16
|
+
>++++++++++[<++++++++++>-]<+++++++++++.[-]
|
17
|
+
>+++++++[<+++++++>-]<+++++++++.[-]
|
18
|
+
>+++++[<+++++>-]<+++++++.[-]
|
19
|
+
|
20
|
+
===================================================================
|
21
|
+
======================== INPUT NUMBER ============================
|
22
|
+
===================================================================
|
23
|
+
+ cont=1
|
24
|
+
[
|
25
|
+
- cont=0
|
26
|
+
>,
|
27
|
+
======SUB10======
|
28
|
+
----------
|
29
|
+
|
30
|
+
[ not 10
|
31
|
+
<+> cont=1
|
32
|
+
=====SUB38======
|
33
|
+
----------
|
34
|
+
----------
|
35
|
+
----------
|
36
|
+
--------
|
37
|
+
|
38
|
+
>
|
39
|
+
=====MUL10=======
|
40
|
+
[>+>+<<-]>>[<<+>>-]< dup
|
41
|
+
|
42
|
+
>>>+++++++++
|
43
|
+
[
|
44
|
+
<<<
|
45
|
+
[>+>+<<-]>>[<<+>>-]< dup
|
46
|
+
[<<+>>-]
|
47
|
+
>>-
|
48
|
+
]
|
49
|
+
<<<[-]<
|
50
|
+
======RMOVE1======
|
51
|
+
<
|
52
|
+
[>+<-]
|
53
|
+
]
|
54
|
+
<
|
55
|
+
]
|
56
|
+
>>[<<+>>-]<<
|
57
|
+
|
58
|
+
===================================================================
|
59
|
+
======================= PROCESS NUMBER ===========================
|
60
|
+
===================================================================
|
61
|
+
|
62
|
+
==== ==== ==== ====
|
63
|
+
numd numu teid teiu
|
64
|
+
==== ==== ==== ====
|
65
|
+
|
66
|
+
>+<-
|
67
|
+
[
|
68
|
+
>+
|
69
|
+
======DUP======
|
70
|
+
[>+>+<<-]>>[<<+>>-]<
|
71
|
+
|
72
|
+
>+<--
|
73
|
+
|
74
|
+
>>>>>>>>+<<<<<<<< isprime=1
|
75
|
+
|
76
|
+
[
|
77
|
+
>+
|
78
|
+
|
79
|
+
<-
|
80
|
+
|
81
|
+
=====DUP3=====
|
82
|
+
<[>>>+>+<<<<-]>>>>[<<<<+>>>>-]<<<
|
83
|
+
|
84
|
+
=====DUP2=====
|
85
|
+
>[>>+>+<<<-]>>>[<<<+>>>-]<<< <
|
86
|
+
|
87
|
+
|
88
|
+
>>>
|
89
|
+
|
90
|
+
|
91
|
+
====DIVIDES=======
|
92
|
+
[>+>+<<-]>>[<<+>>-]< DUP i=div
|
93
|
+
|
94
|
+
<<
|
95
|
+
[
|
96
|
+
>>>>>+ bool=1
|
97
|
+
<<<
|
98
|
+
[>+>+<<-]>>[<<+>>-]< DUP
|
99
|
+
[>>[-]<<-] IF i THEN bool=0
|
100
|
+
>>
|
101
|
+
[ IF i=0
|
102
|
+
<<<<
|
103
|
+
[>+>+<<-]>>[<<+>>-]< i=div
|
104
|
+
>>>
|
105
|
+
- bool=0
|
106
|
+
]
|
107
|
+
<<<
|
108
|
+
- DEC i
|
109
|
+
<<
|
110
|
+
-
|
111
|
+
]
|
112
|
+
|
113
|
+
+>>[<<[-]>>-]<<
|
114
|
+
>[-]< CLR div
|
115
|
+
=====END DIVIDES====
|
116
|
+
|
117
|
+
|
118
|
+
[>>>>>>[-]<<<<<<-] if divides then isprime=0
|
119
|
+
|
120
|
+
|
121
|
+
<<
|
122
|
+
|
123
|
+
>>[-]>[-]<<<
|
124
|
+
]
|
125
|
+
|
126
|
+
>>>>>>>>
|
127
|
+
[
|
128
|
+
-
|
129
|
+
<<<<<<<[-]<<
|
130
|
+
|
131
|
+
[>>+>+<<<-]>>>[<<<+>>>-]<<<
|
132
|
+
|
133
|
+
>>
|
134
|
+
|
135
|
+
|
136
|
+
|
137
|
+
|
138
|
+
===================================================================
|
139
|
+
======================== OUTPUT NUMBER ===========================
|
140
|
+
===================================================================
|
141
|
+
[>+<-]>
|
142
|
+
|
143
|
+
[
|
144
|
+
======DUP======
|
145
|
+
[>+>+<<-]>>[<<+>>-]<
|
146
|
+
|
147
|
+
|
148
|
+
======MOD10====
|
149
|
+
>+++++++++<
|
150
|
+
[
|
151
|
+
>>>+<< bool= 1
|
152
|
+
[>+>[-]<<-] bool= ten==0
|
153
|
+
>[<+>-] ten = tmp
|
154
|
+
>[<<++++++++++>>-] if ten=0 ten=10
|
155
|
+
<<- dec ten
|
156
|
+
<- dec num
|
157
|
+
]
|
158
|
+
+++++++++ num=9
|
159
|
+
>[<->-]< dec num by ten
|
160
|
+
|
161
|
+
=======RROT======
|
162
|
+
[>+<-]
|
163
|
+
< [>+<-]
|
164
|
+
< [>+<-]
|
165
|
+
>>>[<<<+>>>-]
|
166
|
+
<
|
167
|
+
|
168
|
+
=======DIV10========
|
169
|
+
>+++++++++<
|
170
|
+
[
|
171
|
+
>>>+<< bool= 1
|
172
|
+
[>+>[-]<<-] bool= ten==0
|
173
|
+
>[<+>-] ten = tmp
|
174
|
+
>[<<++++++++++>>>+<-] if ten=0 ten=10 inc div
|
175
|
+
<<- dec ten
|
176
|
+
<- dec num
|
177
|
+
]
|
178
|
+
>>>>[<<<<+>>>>-]<<<< copy div to num
|
179
|
+
>[-]< clear ten
|
180
|
+
|
181
|
+
=======INC1=========
|
182
|
+
<+>
|
183
|
+
]
|
184
|
+
|
185
|
+
<
|
186
|
+
[
|
187
|
+
=======MOVER=========
|
188
|
+
[>+<-]
|
189
|
+
|
190
|
+
=======ADD48========
|
191
|
+
+++++++[<+++++++>-]<->
|
192
|
+
|
193
|
+
=======PUTC=======
|
194
|
+
<.[-]>
|
195
|
+
|
196
|
+
======MOVEL2========
|
197
|
+
>[<<+>>-]<
|
198
|
+
|
199
|
+
<-
|
200
|
+
]
|
201
|
+
|
202
|
+
>++++[<++++++++>-]<.[-]
|
203
|
+
|
204
|
+
===================================================================
|
205
|
+
=========================== END FOR ===============================
|
206
|
+
===================================================================
|
207
|
+
|
208
|
+
|
209
|
+
>>>>>>>
|
210
|
+
]
|
211
|
+
<<<<<<<<
|
212
|
+
|
213
|
+
|
214
|
+
|
215
|
+
>[-]<
|
216
|
+
[-]
|
217
|
+
<<-
|
218
|
+
]
|
219
|
+
|
220
|
+
======LF========
|
221
|
+
|
222
|
+
++++++++++.[-]
|
223
|
+
|
data/lib/ookie/interpreter.rb
CHANGED
@@ -26,7 +26,7 @@ module Ookie
|
|
26
26
|
|
27
27
|
attr_reader :ooks, :mem, :pc, :loops
|
28
28
|
attr_writer :verbose
|
29
|
-
attr_accessor :code, :ifd, :ofd, :efd, :lang
|
29
|
+
attr_accessor :code, :ifd, :ofd, :efd, :lang, :optimize
|
30
30
|
|
31
31
|
def verbose(msg = nil)
|
32
32
|
@efd.puts "#{self.class}: #{msg}" if @verbose and msg
|
@@ -37,6 +37,7 @@ module Ookie
|
|
37
37
|
@verbose = false
|
38
38
|
@code, @ifd, @ofd, @efd = code, ifd, ofd, efd
|
39
39
|
@lang = :ook
|
40
|
+
@optimize = true
|
40
41
|
reset!
|
41
42
|
end
|
42
43
|
|
@@ -129,7 +130,7 @@ module Ookie
|
|
129
130
|
loop do
|
130
131
|
@pc += 1
|
131
132
|
insn = next_insn
|
132
|
-
raise UnmatchedStartLoop if insn.empty?
|
133
|
+
raise UnmatchedStartLoop if not insn or insn.empty?
|
133
134
|
if insn == 'ookq_ookx'
|
134
135
|
nesting -= 1
|
135
136
|
break if nesting == 0
|
@@ -143,6 +144,7 @@ module Ookie
|
|
143
144
|
@ooks = @code.scan(re).flatten
|
144
145
|
raise NoCode if @ooks.empty?
|
145
146
|
@ooks = yield
|
147
|
+
optimize if @optimize
|
146
148
|
end
|
147
149
|
|
148
150
|
def parse_ook
|
@@ -171,5 +173,30 @@ module Ookie
|
|
171
173
|
end
|
172
174
|
end
|
173
175
|
|
176
|
+
def optimize
|
177
|
+
verbose "original code size = #{@ooks.size}"
|
178
|
+
optimize_helper([:optimize_nils])
|
179
|
+
verbose "optimized code size = #{@ooks.size}"
|
180
|
+
end
|
181
|
+
|
182
|
+
def optimize_helper(rules)
|
183
|
+
i = 0
|
184
|
+
while @ooks[i] do
|
185
|
+
if rules.find { |r| send(r, @ooks[i], @ooks[i+1]) }
|
186
|
+
@ooks[i, 2] = []
|
187
|
+
i -= 1 unless i == 0
|
188
|
+
else
|
189
|
+
i += 1
|
190
|
+
end
|
191
|
+
end
|
192
|
+
end
|
193
|
+
|
194
|
+
def optimize_nils(i, j)
|
195
|
+
# this takes away innocuous operations, such as move right and then left
|
196
|
+
ops = [[i, j], [j, i]]
|
197
|
+
ops.include?(['ookd_ookq', 'ookq_ookd']) or
|
198
|
+
ops.include?(['ookd_ookd', 'ookx_ookx'])
|
199
|
+
end
|
200
|
+
|
174
201
|
end
|
175
202
|
end
|
data/lib/ookie/version.rb
CHANGED
data/ookie.gemspec
CHANGED
@@ -5,13 +5,13 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{ookie}
|
8
|
-
s.version = "0.3.
|
8
|
+
s.version = "0.3.1"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Alejandro Martinez Ruiz"]
|
12
|
-
s.date = %q{2010-
|
12
|
+
s.date = %q{2010-11-12}
|
13
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}
|
14
|
+
s.description = %q{Ookie is a simple Ook! and Brainfuck interpreter you can use to either directly execute your Ook! or BF source code (via shebang) or embed it in your own Ruby programs}
|
15
15
|
s.email = %q{alex@flawedcode.org}
|
16
16
|
s.executables = ["ookie"]
|
17
17
|
s.extra_rdoc_files = [
|
@@ -48,7 +48,7 @@ Gem::Specification.new do |s|
|
|
48
48
|
s.homepage = %q{http://github.com/unleashed/ookie}
|
49
49
|
s.require_paths = ["lib"]
|
50
50
|
s.rubygems_version = %q{1.3.7}
|
51
|
-
s.summary = %q{Ookie is a simple Ook! interpreter}
|
51
|
+
s.summary = %q{Ookie is a simple Ook! and Brainfuck interpreter}
|
52
52
|
s.test_files = [
|
53
53
|
"spec/ookie_spec.rb",
|
54
54
|
"spec/spec_helper.rb"
|
metadata
CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
|
|
5
5
|
segments:
|
6
6
|
- 0
|
7
7
|
- 3
|
8
|
-
-
|
9
|
-
version: 0.3.
|
8
|
+
- 1
|
9
|
+
version: 0.3.1
|
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-
|
17
|
+
date: 2010-11-12 00:00:00 +01:00
|
18
18
|
default_executable: ookie
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
@@ -165,7 +165,7 @@ dependencies:
|
|
165
165
|
type: :development
|
166
166
|
prerelease: false
|
167
167
|
version_requirements: *id010
|
168
|
-
description: 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
|
168
|
+
description: Ookie is a simple Ook! and Brainfuck interpreter you can use to either directly execute your Ook! or BF source code (via shebang) or embed it in your own Ruby programs
|
169
169
|
email: alex@flawedcode.org
|
170
170
|
executables:
|
171
171
|
- ookie
|
@@ -214,7 +214,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
214
214
|
requirements:
|
215
215
|
- - ">="
|
216
216
|
- !ruby/object:Gem::Version
|
217
|
-
hash: -
|
217
|
+
hash: -764089329
|
218
218
|
segments:
|
219
219
|
- 0
|
220
220
|
version: "0"
|
@@ -232,7 +232,7 @@ rubyforge_project:
|
|
232
232
|
rubygems_version: 1.3.7
|
233
233
|
signing_key:
|
234
234
|
specification_version: 3
|
235
|
-
summary: Ookie is a simple Ook! interpreter
|
235
|
+
summary: Ookie is a simple Ook! and Brainfuck interpreter
|
236
236
|
test_files:
|
237
237
|
- spec/ookie_spec.rb
|
238
238
|
- spec/spec_helper.rb
|