ookie 0.2.1 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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"