BFコンパイラー
以下のようにonelinerで可能です。
ただしLanguage::BF 0.03が必要です。
CodeRepos経由
で、
- svn co svn.coderepos.org/share/lang/perl/Language-BF
- cd Language-BF/trunk
- perl Makefile.PL
- make install
するか、CPANにVersion 0.03が現れるのをお待ち下さい。
Dan the Brainf.cker
1 2 3 4 | perl -MLanguage::BF \
-e 'print Language::BF->new_from_file(shift)->as_perl' t/hello.bf \
| perl
Hello World!
|
Posted feedbacks - D
素直に変換。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 | import std.stdio;
import std.file;
import std.string;
void main(string[] args){
string bfCode = cast(string)read(args[1]);
string[] buf;
uint ptrIndex;
uint maxPtrIndex;
uint indentLevel = 1;
void addLine(string line){
buf ~= repeat("\t", indentLevel) ~ line;
}
foreach(c; bfCode){
switch(c){
case '>':
addLine("ptr++;");
if(++ptrIndex > maxPtrIndex){
maxPtrIndex++;
}
break;
case '<':
addLine("ptr--;");
ptrIndex--;
break;
case '+':
addLine("mem[ptr]++;");
break;
case '-':
addLine("mem[ptr]--;");
break;
case '.':
addLine("putchar(cast(char)mem[ptr]);");
break;
case ',':
addLine("mem[ptr] = cast(ubyte)getchar();");
break;
case '[':
addLine("while(mem[ptr]){");
indentLevel++;
break;
case ']':
indentLevel--;
addLine("}");
break;
default:
}
}
writefln("import std.c.stdio;");
writefln("void main(){");
writefln("\tubyte mem[", maxPtrIndex + 1, "];");
writefln("\tuint ptr;");
writefln(buf.join("\n"));
writefln("}");
}
|





dankogai
#3886()
Rating0/2=0.00
「どう書く?」でまだ出ていないのが不思議なお題。それがBF処理系。 ここでは、BFで書かれたソースを、同じ言語に変換するコンパイラーを募集します。
私自身、すでにPerlとJavaScriptに関しては http://blog.livedoor.jp/dankogai/archives/50545151.html でやっているのですが、他の言語バージョンも是非見たいので。
Dan the Brainf.ucker
see: Brainfuck - Wikipedia
1 reply [ reply ]