BrainFuck語言的一個官方解譯器:
BrainFuck 語言,是一種按照“Turing complete”思想設計的語言,它的主要設計思路是:用最小的概念實現一種“簡單”的語言,BrainFuck 語言只有八種符號,所有的操作都由這八種符號的組合來完成。
BrainFuck 基於一個簡單的機器模型,除了八個指令,這個機器還包括:一個以位元組為單位、被初始化為零的數組、一個指向該數組的指標(初始時指向數組的第一個位元組)、以及用於輸入輸出的兩個位元組流。
因為 BrainFuck 只有八種指令,並且沒有關鍵字,也不允許自訂標識符,
因此它的編譯器實現起來非常簡單,初學 C 語言不久的人都可以自己編出來,儘管在座的各位每人都可以自己編一個,不過為了引起大家的興趣,我這裡還是給出大家一個官方發布的版本:
#include <stdio.h>;
int p, r, q;
char a[5000], f[5000], b, o, *s=f;
void interpret(char *c)
{
char *d;
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 ',': a[p]=getchar();fflush(stdout); 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);
case '#':
if(q>2)
printf("%2d %2d %2d %2d %2d %2d %2d %2d %2d %2d/n%*s/n",
*a,a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9],3*p+2,"^");
break;
default: o=0;
}
if( p<0 || p>100)
puts("RANGE ERROR"), exit(0);
}
r--;
// chkabort();
}
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);
}
}
下面給出一個BrainFuck的列印Hello world的程式:
++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.>.
將上述BrainFuck編譯為可執行檔,比如test,然後將上面的BrainFuck的Hello world 程式存在一個檔案中,比如hello.b
然後運行 ./test hello.b 就可以輸出Hello world.
BrainFuck文法:
字元 含義
>; 指標加一
< 指標減一
+ 指標指向的位元組的值加一
- 指標指向的位元組的值減一
. 輸出指標指向的單元內容(ASCII碼)
, 輸入內容到指標指向的單元(ASCII碼)
[ 如果指標指向的單元值為零,向前跳轉到對應的]指令的次一指令處
] 如果指標指向的單元值不為零,向後跳轉到對應的[指令的次一指令處
By http://fayaa.com/code/view/9975/