class Orenono::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