1 //たたき台 2 module interpreter; 3 4 import std.conv; 5 import core.stdc.stdio; 6 7 8 class Interpreter 9 { 10 private: 11 size_t ptr; 12 size_t codeptr; 13 ubyte[] memory; 14 string code; 15 public: 16 this(string _code, size_t buffsize) 17 { 18 memory = new ubyte[buffsize]; 19 code = _code; 20 ptr = 0; 21 codeptr = 0; 22 } 23 void run() 24 { 25 while(codeptr < code.length) 26 { 27 switch(code[codeptr]) 28 { 29 case '+': 30 memory[ptr]++; 31 break; 32 case '-': 33 memory[ptr]--; 34 break; 35 case '>': 36 ptr++; 37 break; 38 case '<': 39 ptr--; 40 break; 41 case '.': 42 putchar(memory[ptr]); 43 break; 44 case ',': 45 int tmp = getchar(); 46 if(tmp == EOF) return; 47 memory[ptr] = tmp.to!ubyte; 48 break; 49 case '[': 50 if(memory[ptr] == 0) 51 { 52 int loopnest = 1; 53 do 54 { 55 codeptr++; 56 if(code[codeptr] == '[') loopnest++; 57 if(code[codeptr] == ']') loopnest--; 58 }while(0 < loopnest); 59 } 60 break; 61 case ']': 62 if(memory[ptr] != 0) 63 { 64 int loopnest = 1; 65 do 66 { 67 codeptr--; 68 if(code[codeptr] == '[') loopnest--; 69 if(code[codeptr] == ']') loopnest++; 70 }while(0 < loopnest); 71 } 72 break; 73 default: 74 } 75 codeptr++; 76 } 77 } 78 }