2013年10月15日 星期二

[閒] Brainf*ck 直譯器

第一次試寫Brainf*ck直譯器
大致上最需要注意的就是while迴圈需要用一個stack去記位置就OK了。(雖然說先做預處理也是可以啦....)

 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 #include<string.h>
 4 #include<math.h>
 5 #include<vector>
 6 #define N 10000
 7 
 8 using namespace std;
 9 int main()
10 {
11     char cmd[N];
12     scanf("%s",cmd);
13     int sl=strlen(cmd);
14 
15     int cmdptr=0;
16 
17     char mry[N];    memset(mry,0,sizeof(mry));
18     int mryptr=0;
19 
20     vector <int>outerwhile;
21     while(cmdptr<sl)
22     {
23         printf("[%c]",cmd[cmdptr]);
24         switch (cmd[cmdptr])
25         {
26             case '+':
27                 mry[mryptr]++;
28                 cmdptr++;
29                 break;
30             case '-':
31                 mry[mryptr]--;
32                 cmdptr++;
33                 break;
34             case '>':
35                 mryptr++;
36                 mryptr%=N;
37                 cmdptr++;
38                 break;
39             case '<':
40                 mryptr=(mryptr+N-1)%N;
41                 cmdptr++;
42                 break;
43             case '.':
44                 putchar(mry[mryptr]);
45                 cmdptr++;
46                 break;
47             case ',':
48                 mry[mryptr]=getchar();
49                 cmdptr++;
50                 break;
51             case '[':
52                 if(mry[mryptr])
53                 {
54                     outerwhile.push_back(cmdptr);
55                     cmdptr++;
56                 }
57                 else
58                 {
59                     int c=0;
60                     while(c>=0)//c||(cmd[cmdptr]!=']'))
61                     {
62                         cmdptr++;
63                         if(cmd[cmdptr]=='[')
64                             c++;
65                         else if(cmd[cmdptr]==']')
66                             c--;
67                     }
68                     cmdptr++;
69                 }
70                 break;
71             case ']':
72                 cmdptr=outerwhile.at(outerwhile.size()-1);
73                 outerwhile.pop_back();
74                 break;
75         }
76     }
77     return 0;
78 }

沒有留言:

張貼留言