Advertisement
Guest User

ct_brainfuck

a guest
Jun 24th, 2018
177
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
D 1.82 KB | None | 0 0
  1. import std.stdio;
  2. import std.string;
  3. import std.conv : to;
  4. import std.array : replicate;
  5.  
  6. string load(string file)() {
  7.     return import(file);
  8. }
  9.  
  10. string optimize_zero(string intermediate) {
  11.     return intermediate.replace("[-]", "z");
  12. }
  13. string optimize_move(string intermediate) {
  14.     auto tmp = intermediate;
  15.     foreach(k; 1..10) {
  16.         auto right = ">".replicate(k);
  17.         auto left = "<".replicate(k);
  18.         auto instr = k.to!string;
  19.        
  20.         tmp = tmp.replace("[-" ~ right ~ "+" ~ left ~ "]", 'p' ~ instr ~ 'z');
  21.         tmp = tmp.replace("[-" ~ left ~ "+" ~ right ~ "]", 'm' ~ instr ~ 'z');
  22.     }
  23.    
  24.     return tmp;
  25. }
  26.  
  27. string compile(string code) {
  28.     auto s = code.optimize_zero;
  29.     s = s.optimize_move;
  30.  
  31.     char[] res;
  32.     long ptr_dif = 0;
  33.     long val_dif = 0;
  34.     char sign;
  35.    
  36.     foreach(c; s) {
  37.         if(c == '>') {
  38.             ptr_dif++;
  39.         } else if(c == '<') {
  40.             ptr_dif--;
  41.         } else if(ptr_dif != 0) {
  42.             res ~= "ptr += " ~ ptr_dif.to!string ~ ";\n";
  43.             ptr_dif = 0;
  44.         }
  45.        
  46.         if(c == '+') {
  47.             val_dif++;
  48.         } else if(c == '-') {
  49.             val_dif--;
  50.         } else if(val_dif != 0) {
  51.             res ~= "*ptr += " ~ val_dif.to!string ~ ";\n";
  52.             val_dif = 0;
  53.         }
  54.  
  55.         if(c > '0' && c <= '9') {
  56.             res ~= "*(ptr " ~ sign ~ " " ~ c ~ ") += *ptr;\n";
  57.         }
  58.  
  59.         switch(c) {
  60.             case '.': res ~= "putchar(*ptr);\n"; break;
  61.             case ',': res ~= "*ptr = cast(char) getchar();\n"; break;
  62.             case '[': res ~= "while(*ptr != 0) {\n"; break;
  63.             case ']': res ~= "}\n"; break;
  64.            
  65.             //Optimizations:
  66.             case 'z': res ~= "*ptr = 0;\n"; break;
  67.             case 'p': sign = '+'; break;
  68.             case 'm': sign = '-'; break;
  69.             default: break;
  70.         }
  71.     }
  72.  
  73.     return res.dup;
  74. }
  75.  
  76. void run(string compiled)() {
  77.     import core.stdc.stdio : getchar, putchar;
  78.  
  79.     char[30_000] mem = 0;
  80.     char* ptr = &mem[0];
  81.     mixin(compiled);
  82. }
  83.  
  84. void main() {
  85.     //load!"code.bf".compile.writeln;
  86.     run!(load!"code.bf".compile);
  87. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement