class Rbrainfuck::Interpreter
Public Class Methods
allowed_chars()
click to toggle source
# File lib/rbrainfuck/interpreter.rb, line 16 def self.allowed_chars self.private_instance_methods(false).map { |name| name[1..-1].to_i.chr } end
new(size)
click to toggle source
- todo
-
Allow to pass an array of options
-
- todo
-
Allow to specify in and out streams
-
# File lib/rbrainfuck/interpreter.rb, line 8 def initialize(size) @cells = [] @stack = [] @pointer = 0 size.times { @cells << 0 } end
Public Instance Methods
load(source)
click to toggle source
# File lib/rbrainfuck/interpreter.rb, line 20 def load(source) @source = source.split(//) end
run()
click to toggle source
# File lib/rbrainfuck/interpreter.rb, line 24 def run @position = 0 while @position < @source.count begin interpret_char(@source[@position]) if Interpreter.allowed_chars.include?(@source[@position]) @position += 1 rescue Exception => e # [todo] - Use a logger puts "#{@position}:#{@source[@position]} (#{@pointer}:#{@cells[@pointer]}) (#{@nesting_level}) => #{e.message}" exit end end end
Private Instance Methods
_43()
click to toggle source
+
# File lib/rbrainfuck/interpreter.rb, line 73 def _43 @cells[@pointer] += 1 end
_44()
click to toggle source
,
# File lib/rbrainfuck/interpreter.rb, line 88 def _44 @cells[@pointer] = STDIN.getch.ord end
_45()
click to toggle source
-
# File lib/rbrainfuck/interpreter.rb, line 78 def _45 @cells[@pointer] -= 1 end
_46()
click to toggle source
.
# File lib/rbrainfuck/interpreter.rb, line 83 def _46 print @cells[@pointer].chr end
_60()
click to toggle source
<
# File lib/rbrainfuck/interpreter.rb, line 68 def _60 @pointer -= 1 end
_62()
click to toggle source
>
# File lib/rbrainfuck/interpreter.rb, line 63 def _62 @pointer += 1 end
_91()
click to toggle source
[
# File lib/rbrainfuck/interpreter.rb, line 93 def _91 if @cells[@pointer] == 0 @position = find_matching_bracket else @stack.push(@position) end end
_93()
click to toggle source
]
# File lib/rbrainfuck/interpreter.rb, line 102 def _93 if @cells[@pointer] == 0 @stack.pop else @position = @stack.last end end
find_matching_bracket()
click to toggle source
# File lib/rbrainfuck/interpreter.rb, line 46 def find_matching_bracket i = @position + 1 c = 0 while i < @source.count char = @source[i] c += 1 if char == '[' c -= 1 if char == ']' return i if c == -1 i += 1 end end
interpret_char(char)
click to toggle source
# File lib/rbrainfuck/interpreter.rb, line 42 def interpret_char(char) self.send("_#{char.ord}") end