I'll be fine

技術ブログ

【Ruby】brainf*ckインタプリタ

rubybrainfuckの簡単なインタプリタ書きました。

https://github.com/YuuShigetani/brainf-ck

# coding: utf-8
class Brainfuck

  def initialize
    @p = []
    @pc = 0
    @pc_stack = []
    @fp_stack = []
  end

  def bf
    File.open ARGF.path do |f|
      f.each_char do |c|
        @p[@pc] ||= 0
        case c
        when '+'
          @p[@pc] += 1
        when '-'
          @p[@pc] -= 1
        when '>'
          @pc += 1
        when '<'
          @pc -= 1
        when '['
          @pc_stack.push @pc
          @fp_stack.push f.pos
        when ']'
          unless @p[@pc] == 0
            @pc = @pc_stack.pop
            f.seek @fp_stack.pop - 1, IO::SEEK_SET
          end
        when '.'
          print @p[@pc].chr
        when ','
          `stty raw -echo`
          @p[@pc] = STDIN.getc.bytes.to_a.first
          `stty -raw echo`
        when "\n"
        when "\t"
        when "\s"
        else
          f.lines.next
        end
      end
    end
  end
end

b = Brainfuck::new
b.bf