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