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 - Java

引数にBFのプログラムを与えて実行します。

java Sample '>,----------[>,----------]<[++++++++++.<]'

BF.javaという名前のファイルが作られるので、さらにjavacでコンパイルします。
上記の例は入力を逆順に出力するプログラム(入力の終了は改行(\n))です。
 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
import java.io.*;
import java.util.*;

public class Sample {
    static final String NL = System.getProperty("line.separator");
    static final String HEADER = "import java.io.*;"+NL+NL+"public class BF {"+NL+
        "    static final int SIZE = 32768;"+NL+"    static byte[] a = new byte[SIZE];"+NL+
        "    public static void main(String[] args) throws IOException {"+NL+
        "\tBufferedReader r = new BufferedReader(new InputStreamReader(System.in));"+NL+
        "\tint ptr = 0;";
    static final String FOOTER = "\tSystem.out.println();"+NL+"    }"+NL+"}";
    static HashMap<Character, String> bfCode = new HashMap<Character, String>();
    static {
        bfCode.put('>', "\tptr++;");
        bfCode.put('<', "\tptr--;");
        bfCode.put('+', "\ta[ptr]++;");
        bfCode.put('-', "\ta[ptr]--;");
        bfCode.put('.', "\tSystem.out.write(a[ptr]);");
        bfCode.put(',', "\ta[ptr] = (byte)r.read();");
        bfCode.put('[', "\twhile (a[ptr] != 0) {");
        bfCode.put(']', "\t}");
    }
    public static void main(String[] args) throws IOException {
        PrintWriter w = new PrintWriter("BF.java");
        w.println(HEADER);
        for (char c : args[0].toCharArray()) {
            String code = bfCode.get(c);
            if (code != null)
                w.println(code);
        }
        w.println(FOOTER);
        w.close();
    }
}

Index

Feed

Other

Link

Pathtraq

loading...