#!/usr/bin/ruby ARGF.each do |line| # preprocessor line.sub!(/#define\s+(\w+)\s+(\w+).*$/, '\1 = \2') line.sub!(/\/\*(.*)\*\//, '#\1') # functions if line.sub!(/^\s*(void|int|long|float|double)\s*(\w+)\s*\(/,'def \2(') line.gsub!(/(\w+)\[\w*\]?/,'\1') end # variables if line =~ /^(\s*)(int|long|float|double)\b/ space = $1 line.sub!(/(int|long|float|double)/,"") line.gsub!(/(\w+)\[\w*\]?/,'\1 = []') while (line =~ /(\b\w+\b\s*=\s*[\[\]\w]+)/) puts space + $1 line = $' end line = "" end # main() line.sub!(/^.*\bmain\b.*\(.*\).*$/,"begin") # types line.gsub!(/\((void|int|long|float|double)\)/,"") line.gsub!(/\b(void|int|long|float|double)\b/,"") # "for" statement line.gsub!(/for\s.*(\w+)\s*=\s*(\w+).*(\w+)\s*<=\s*(\w+).*\+\+.*?\)(.*);$/, 'for \1 in \2..\4;\5; end') line.gsub!(/for\s.*(\w+)\s*=\s*(\w+).*(\w+)\s*<\s*(\w+).*\+\+.*?\)(.*);$/, 'for \1 in \2...\4;\5; end') line.gsub!(/for\s.*(\w+)\s*=\s*(\w+).*(\w+)\s*<=\s*(\w+).*\+\+.*$/, 'for \1 in \2..\4') line.gsub!(/for\s.*(\w+)\s*=\s*(\w+).*(\w+)\s*<\s*(\w+).*\+\+.*$/, 'for \1 in \2...\4') line.gsub!(/for\s+\(\s*;\s*;\s*\)/,"while (true)") line.gsub!(/\bdo\b/, "begin") line.gsub!(/\bcontinue\b/, "next") # "if" statement line.gsub!(/(if\s.*?\))(.*)\selse\s(.*);$/,'\1;\2; else;\2; end') line.gsub!(/(if\s.*?\))(.*);$/,'\1;\2; end') # delimiter line.gsub!(/;$/,"") # parenthesis line.gsub!(/\{/,"") line.gsub!(/\}/,"end") # increment line.gsub!(/(\b\w\b)\+\+/,'\1 += 1') line.gsub!(/(\b\w\b)--/,'\1 -= 1') # scanf line.gsub!(/scanf\s*\(\s*"%d", &(\w|\w\[\w\])\s*\)/,'\1 = gets.to_i') line.gsub!(/getchar\(\)/,"$stdin.getc") # character line.gsub!(/'(\w)'/, '?\1') # Math functions line.gsub!(/\bsqrt\b/,"Math::sqrt") puts line end