User:JayCampbell/smatiny.rb
Jump to navigation
Jump to search
smanity.rb - An interpreter by User:JayCampbell for iHope's SMATINY esoteric programming language
#!/usr/bin/ruby
#
# smatiny.rb
#
# An interpreter by JayCampbell 2008
# for iHope's SMATINY esoteric programming language
filename = ARGV[0]
memory = Array.new
pointer = 0
# parse supplied file
File.open(filename) do |f|
while line = f.gets
# remove comments
line.gsub!(/#.*/, '')
# spaces and puntuations are optional, case-insensitive
if line =~ /(\d+)\.?\s*swap\s*(\d+)\s*with\s*(\d+)\s*\.?/i
memory[$1.to_i] = [ $2.to_i, $3.to_i ]
elsif line =~ /(\d+)\.?\s*do\s*nothing\s*\.?/i
# don't really need this except if a strange program overwrites its own input
memory[$1.to_i] = nil
elsif line =~ /(\d+)\.?\s*output\s*this\s*block's\s*position\s*\.?/i
memory[$1.to_i] = 'print'
elsif line =~ /[\d\w]/
$stderr.puts "Bad line: #{line}"
end
end
end
k=0; memory.each {|m| if m != nil then $stderr.print "#{k}=#{m.inspect} " end; k += 1}; puts
$stderr.puts "Max cell: #{memory.size - 1}" # starting at 1, not 0
$stderr.puts "Non-NOP: #{memory.select{ |m| m != nil }.size}"
# run it
while pointer += 1
instruction = memory[pointer]
if instruction == 'print'
putc pointer
elsif instruction.class == Array
x = pointer
y = instruction[0]
z = instruction[1]
memory[y], memory[z] = memory[z], memory[y]
if x == y then pointer = z
elsif x == z then pointer = y end
end
break if pointer > memory.size
# very verbose - uncomment for step-by-step dump
# print "\nP=#{pointer} "; k=0; memory.each {|m| if m != nil then print "#{k}=#{m.inspect} " end; k += 1}; puts
end