def run(program, io)
init(program, io)
loop do
old_ip = @ip
instruction = fetch
break unless instruction
printf("executing %5d: %s\n", old_ip, instruction) if debug?
instruction.run(self)
dump_state(0) if debug?
break if @stop
end
fail "Stack contains too many values." if @values.size>1
return flatten(@values.last) if success? && source.eof?
if success?
current_pos = source.pos
source.error(
"Don't know what to do with #{source.read(100)}", current_pos).
raise(Parslet::UnconsumedInput)
end
@error.raise
rescue => ex
dump_state(-1) unless ex.kind_of?(Parslet::ParseFailed)
raise
end