Peter Schneider


MCT, MCPD, MCSD.NET, MCAD.NET, MCDBA

News

Austrian .NET Community

April 2007 - Posts

Brainfuck Compiler and Interpreter in Powershell

Surley some of you know the Brainfuck programming language... there are many compilers and interpreters around, yet I haven't found some for powershell... so here we go:

Powershell Brainfuck Interpreter:

param ($i)

$t = @{ '>'='$p++;';
'<'='$p--;';
'+'='$m[$p]++';
'-'='$m[$p]--';
'.'='write-host $([char]$m[$p]) -n ';
','='$m[$p]=$host.ui.ReadLine() ';
'['='while ($m[$p] -ne 0) {';
']'='}';
}

$c = '$p=0;$m=new-object "byte[]" 32768'+"`n" ; gc $i -Enc Byte -r 1 | % {$c+=$t["$([char]$_)"]+"`n"}

invoke-expression $c

Powershell Brainfuck Compiler:

param ( [string] $infile = $(throw "Please specify input file (.b)"),
[string] $outfile = $(throw "Please specify output file (.cs)"),
[switch] $run = $false
)

$csc = (join-path ($env:windir) Microsoft.NET\Framework\v2.0.50727\csc.exe)

$transpose = @{'>' = 'p++;';
'<' = 'p--;';
'+' = 'm[p]++;';
'-' = 'm[p]--;';
'.' = 'Console.Write(m[p]);';
',' = 'm[p]=Console.ReadLine();';
'[' = "while (m[p]!=0) {"
']' = '}';
}

$header = @"
using System;
public class Program {
public static void Main() {
int p=0;
char[] m=new char[32768];
"@

if ($(test-path $outfile)) { rm $outfile | out-null }
$header | out-file $outfile -append

get-content $infile -encoding Byte -readcount 1 |
% { $transpose["$([char]$_)"] } | out-file $outfile -append

"}}" | out-file $outfile -append

& $csc `/target:exe $outfile | out-null

if ($run) {
$outfile = $outfile.Replace(".cs",".exe")
& .`/$outfile
}

You can find the both script files (compiler and interpreter) in the attachment of this post.

Have fun!

Posted: Apr 08 2007, 05:23 AM by pschneider | with 4 comment(s)
Filed under: ,
More Posts