class Orenono::Brain

Brain

Attributes

code_cursol[R]
config[R]
loop_stack[R]
memory_cursol[R]
src[R]
tape[R]
tokens[R]

Public Class Methods

new(config, src = '') click to toggle source
# File lib/brain.rb, line 11
def initialize(config, src = '')
  @config = config
  @src = src
  @tokens = @src.scan(/#{@config.token_patterns}/)
  @tape = Array.new(65_535) { 0 }
  @memory_cursol = 0
  @code_cursol = 0
  @loop_stack = []
end

Public Instance Methods

decrement() click to toggle source
# File lib/brain.rb, line 58
def decrement
  fail InvalidMemoryAccessError if @tape[@memory_cursol].zero?
  @tape[@memory_cursol] -= 1
end
display() click to toggle source
# File lib/brain.rb, line 96
def display
  putc @tape[@memory_cursol]
end
end_loop() click to toggle source
# File lib/brain.rb, line 82
def end_loop
  fail InvalidLoopError, 'Invalid Loop.' if @loop_stack.empty?
  @code_cursol = @loop_stack.pop
end
goto_end_loop_next() click to toggle source
# File lib/brain.rb, line 69
def goto_end_loop_next
  hit_cnt = 0
  index = 0
  @tokens[@code_cursol..-1].each_with_index do |token, i|
    hit_cnt += 1 if token == @config.end_loop
    next unless hit_cnt == @loop_stack.size
    index = i + @code_cursol
    break
  end
  @loop_stack.pop
  @code_cursol = index + 1
end
increment() click to toggle source

rubocop:enable CyclomaticComplexity, MethodLength

# File lib/brain.rb, line 54
def increment
  @tape[@memory_cursol] += 1
end
next_cursol() click to toggle source
# File lib/brain.rb, line 87
def next_cursol
  @memory_cursol += 1
end
previous_cursol() click to toggle source
# File lib/brain.rb, line 91
def previous_cursol
  fail InvalidCursolError, 'Invalid Cursol.' if @memory_cursol.zero?
  @memory_cursol -= 1
end
read() click to toggle source
# File lib/brain.rb, line 100
def read
  @tape[@memory_cursol] = STDIN.readchar.ord
end
run() click to toggle source

rubocop:disable CyclomaticComplexity, MethodLength

# File lib/brain.rb, line 22
def run
  loop do
    token = @tokens[@code_cursol]
    case token
    when @config.increment
      increment
      @code_cursol += 1
    when @config.decrement
      decrement
      @code_cursol += 1
    when @config.start_loop
      start_loop
    when @config.end_loop
      end_loop
    when @config.next_cursol
      next_cursol
      @code_cursol += 1
    when @config.previous_cursol
      previous_cursol
      @code_cursol += 1
    when @config.display
      display
      @code_cursol += 1
    when @config.read
      read
      @code_cursol += 1
    end
    break if @code_cursol >= @tokens.size
  end
end
start_loop() click to toggle source
# File lib/brain.rb, line 63
def start_loop
  @loop_stack << @code_cursol
  return goto_end_loop_next if @tape[@memory_cursol] == 0
  @code_cursol += 1
end