#!/usr/bin/ruby # usage: ./bf2s.rb .bf path = ARGV[0] path_base = path[0...-File.extname(path).length] bf = File.read(path) File.open(path_base + '.s', 'wb') do |f| f.puts < f.puts(" inc %ebx") when ?< f.puts(" dec %ebx") when ?+ f.puts(" incb (%ebx)") when ?- f.puts(" decb (%ebx)") when ?. f.puts(" movzbl (%ebx), %eax") f.puts(" movl %eax, (%esp)") f.puts(" call _putchar") when ?, f.puts(" call _getchar") f.puts(" movb %al, (%ebx)") when ?[ f.puts("L#{label}:") f.puts(" movb (%ebx), %al") f.puts(" testb %al, %al") f.puts(" je L#{label}_exit") label_stack << label label += 1 when ?] f.puts(" jmp L#{label_stack[-1]}") f.puts("L#{label_stack[-1]}_exit:") label_stack.pop() end end f.puts <