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 }