コンパイラ実装会(3)に参加してきた。
基本的にハッカソンのように個々人がもくもくと実装する会です。
運がよければ、すごい人の自作VMとか自作JITとか自作言語の発表が聞けちゃいます。
今回は、brainfuckのコード から Cのコード を生成して出力する node.jsのコードを作成しました。
brainfuckは、命令が8つしかないので、処理は簡単です。
以下は、コードと実行方法です。
brainfuck-ctrans.js
var fs = require('fs'); var out = ""; var code = fs.readFileSync('./data','utf-8'); out += '#include \n'; out += 'void main() {\n'; out += 'char m[30000];\n'; out += 'char* ptr = m;\n'; var arr = code.split(''); while(arr.length != 0){ var c = arr.shift(); switch (c) { case '>' : out += '++ptr;\n'; break; case '<' : out += '--ptr;\n'; break; case '+' : out += '++(*ptr);\n'; break; case '-' : out += '--(*ptr);\n'; break; case '.' : out += 'putchar(*ptr);\n'; break; case ',' : out += '*ptr = getchar();\n'; break; case '[' : out += 'while(*ptr) {\n'; break; case ']' : out += '}\n'; break; default: } } out += '}\n'; fs.writeFileSync('./out.c',out,'utf-8');
data (brainfuckのHelloコード)
>+++++++++[<++++++++>-]<.>+++++++[<++++>-]<+.+++++++..+++.[-]>++++++++[<++ ++>-]<.>+++++++++++[<+++++>-]<.>++++++++[<+++>-]<.+++.------.--------.[-]> ++++++++[<++++>-]<+.[-]++++++++++.
実行方法
Hello World!
と、表示されます。(たぶん)