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.
@@ -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! code by embedding a shebang line:
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
- * embedding your Ook! code as a String in your Ruby code
9
+ << classy code >>
11
10
 
12
- Ookie.run(%q{ just as classy Ook! code })
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
@@ -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
- NoOokCode = Class.new(CodeError)
22
- OddNumberOfOoks = Class.new(CodeError)
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, :code
29
+ attr_accessor :code, :ifd, :ofd, :efd, :lang
27
30
 
28
31
  def verbose(msg = nil)
29
- STDERR.puts "#{self.class}: #{msg}" if @verbose and msg
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
- @code = code
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
- parse
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.empty?
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 parse
135
- @ooks = @code.scan(RE_OOK_CODE).flatten
136
- raise NoOokCode if @ooks.empty?
137
- raise OddNumberOfOoks if @ooks.size.odd?
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 next_insn
141
- @ooks.slice(@pc*2, 2).join('_').downcase.gsub('!', 'x').gsub('?','q').gsub('.','d')
142
- rescue NoMethodError # happens when last instruction is an end loop
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
@@ -11,8 +11,8 @@
11
11
  module Ookie
12
12
  module Version
13
13
  MAJOR = 0
14
- MINOR = 2
15
- PATCH = 1
14
+ MINOR = 3
15
+ PATCH = 0
16
16
  BUILD = nil
17
17
 
18
18
  STRING = [MAJOR, MINOR, PATCH, BUILD].compact.join('.')
@@ -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
- - 2
8
- - 1
9
- version: 0.2.1
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-19 00:00:00 +02:00
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: -53849645
217
+ hash: -1506199298662524959
217
218
  segments:
218
219
  - 0
219
220
  version: "0"