Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import std.stdio;
- import std.string;
- import std.conv : to;
- import std.array : replicate;
- string load(string file)() {
- return import(file);
- }
- string optimize_zero(string intermediate) {
- return intermediate.replace("[-]", "z");
- }
- string optimize_move(string intermediate) {
- auto tmp = intermediate;
- foreach(k; 1..10) {
- auto right = ">".replicate(k);
- auto left = "<".replicate(k);
- auto instr = k.to!string;
- tmp = tmp.replace("[-" ~ right ~ "+" ~ left ~ "]", 'p' ~ instr ~ 'z');
- tmp = tmp.replace("[-" ~ left ~ "+" ~ right ~ "]", 'm' ~ instr ~ 'z');
- }
- return tmp;
- }
- string compile(string code) {
- auto s = code.optimize_zero;
- s = s.optimize_move;
- char[] res;
- long ptr_dif = 0;
- long val_dif = 0;
- char sign;
- foreach(c; s) {
- if(c == '>') {
- ptr_dif++;
- } else if(c == '<') {
- ptr_dif--;
- } else if(ptr_dif != 0) {
- res ~= "ptr += " ~ ptr_dif.to!string ~ ";\n";
- ptr_dif = 0;
- }
- if(c == '+') {
- val_dif++;
- } else if(c == '-') {
- val_dif--;
- } else if(val_dif != 0) {
- res ~= "*ptr += " ~ val_dif.to!string ~ ";\n";
- val_dif = 0;
- }
- if(c > '0' && c <= '9') {
- res ~= "*(ptr " ~ sign ~ " " ~ c ~ ") += *ptr;\n";
- }
- switch(c) {
- case '.': res ~= "putchar(*ptr);\n"; break;
- case ',': res ~= "*ptr = cast(char) getchar();\n"; break;
- case '[': res ~= "while(*ptr != 0) {\n"; break;
- case ']': res ~= "}\n"; break;
- //Optimizations:
- case 'z': res ~= "*ptr = 0;\n"; break;
- case 'p': sign = '+'; break;
- case 'm': sign = '-'; break;
- default: break;
- }
- }
- return res.dup;
- }
- void run(string compiled)() {
- import core.stdc.stdio : getchar, putchar;
- char[30_000] mem = 0;
- char* ptr = &mem[0];
- mixin(compiled);
- }
- void main() {
- //load!"code.bf".compile.writeln;
- run!(load!"code.bf".compile);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement