challenge BFコンパイラー

「どう書く?」でまだ出ていないのが不思議なお題。それがBF処理系。 ここでは、BFで書かれたソースを、同じ言語に変換するコンパイラーを募集します。

私自身、すでにPerlとJavaScriptに関しては http://blog.livedoor.jp/dankogai/archives/50545151.html でやっているのですが、他の言語バージョンも是非見たいので。

Dan the Brainf.ucker

以下のように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("}");
}

Index

Feed

Other

Link

Pathtraq

loading...