#!/usr/bin/perl # bfc.pl - Don Yang (uguu.org) # # Simple BF to C compiler. # # 09/03/04 use strict; my ($maxtape, $code, $i, %t); local (*INFILE); local (*OUTFILE); $maxtape = 0x10000; %t = ( 91 => "\nwhile(*x){\n", 93 => "\n}\n", 60 => "--x;", 62 => "++x;", 45 => "--*x;", 43 => "++*x;", 44 => "\n*x=getchar();", 46 => "putchar(*x);\n" ); # Open arguments for input/output files, otherwise use stdin/stdout open INFILE, (($#ARGV > -1) ? "< $ARGV[0]" : "<&STDIN") or die $!; open OUTFILE, (($#ARGV > 0) ? "> $ARGV[1]" : ">&STDOUT") or die $!; # Extract BF operators from string $code = ''; while() { s/[^\[\]\-+<>,.]//g; $code .= $_; } close INFILE; # Check for balanced [] brackets $i = 0; foreach (unpack "C*", $code) { $i++ if( $_ == 91 ); $i-- if( $_ == 93 ); last if $i < 0; } die "[] unbalanced\n" unless $i == 0; # Write output $maxtape += 0; print OUTFILE <<"EOT"; #include #include static int Tape[$maxtape]; int main(void) { int *x=&Tape[0]; memset(x,0,$maxtape*sizeof(int)); EOT print OUTFILE $t{$_} foreach (unpack "C*", $code); print OUTFILE "\nreturn 0;\n}\n"; close OUTFILE;