、rainfuck解譯器C語言實現
Brainfuck,是一種極小化的電腦語言,它是由Urban Müller在1993年建立的。一種簡單的、可以用最小的編譯器來實現的、符合圖靈完全思想的程式設計語言。這種語言由八種運算子構成,brainfuck的計算方式如此與眾不同,基於一個簡單的機器模型,除了指令,這個機器還包括:一個以位元組為單位、被初始化為零的數組、一個指向該數組的指標(初始時指向數組的第一個位元組)、以及用於輸入輸出的兩個位元組流。
麥好的AI樂園部落格所有內容是原創,如果轉載請註明來源http://blog.csdn.net/myhaspl/
下面是這八種狀態的描述,其中每個狀態由一個字元標識:
字元 |
含義 |
> |
指標加一 |
< |
指標減一 |
+ |
指標指向的位元組的值加一 |
- |
指標指向的位元組的值減一 |
. |
輸出指標指向的單元內容(ASCII碼) |
, |
輸入內容到指標指向的單元(ASCII碼) |
[ |
如果指標指向的單元值為零,向後跳轉到對應的]指令的次一指令處 |
] |
如果指標指向的單元值不為零,向前跳轉到對應的[指令的次一指令處 |
可在這個頁面找到這個語言的相關內容:http://www.muppetlabs.com/~breadbox/bf/,該網址提供了一個不錯的簡單高效的brainfuck解譯器原始碼,代碼中涉及數組、指標等C指標的應用。
首先,完成這個解譯器,該程式對所需要用到的變數作了如下聲明:
1、陣列變數
char a[5000], f[5000]
其中a
#include <stdio.h>
int p, r, q;
char a[5000], f[5000], b, o, *s=f;
void interpret(char *c)
{
char *d; int tmp;
r++;
while( *c ) {
//if(strchr("<>+-,.[]\n",*c))printf("%c",*c);
switch(o=1,*c++) {
case '<': p--; break;
case '>': p++; break;
case '+': a[p]++; break;
case '-': a[p]--; break;
case '.': putchar(a[p]); fflush(stdout); break;
case ',':
tmp=getchar();
if (tmp == EOF) a[p]=0;
else a[p]=tmp;
break;
case '[':
for( b=1,d=c; b && *c; c++ )
b+=*c=='[', b-=*c==']';
if(!b) {
c[-1]=0;
while( a[p] )
interpret(d);
c[-1]=']';
break;
}
case ']':
puts("UNBALANCED BRACKETS"), exit(0);
default: o=0;
}
if( p<0 || p>100)
puts("RANGE ERROR"), exit(0);
}
r--;
}
int main(int argc,char *argv[])
{
FILE *z;
q=argc;
if((z=fopen(argv[1],"r"))) {
while( (b=getc(z))>0 )
*s++=b;
*s=0;
interpret(f);
}
return 0;
}