首页 > 代码库 > BrainF**k的C解释器

BrainF**k的C解释器

啦啦啦转载自coolshell.cn,作者陈皓

BF语言介绍

Brainfuck,是一种极小化的计算机语言,它是由Urban Müller在1993年创建的。这种语言有时被称为brainf**kbrainf***,甚至被简称为BF。这种 语言,是一种按照“Turing complete(完整图灵机)”思想设计的语言,它的主要设计思路是:用最小的概念实现一种“简单”的语言,BrainF**k 语言只有八种符号,所有的操作都由这八种符号的组合来完成。

BF基于一个简单的机器模型,除了八个指令,这个机器还包括:一个以字节为单位、被初始化为零的数组、一个指向该数组的指针(初始时指向数组的第一个字节)、以及用于输入输出的两个字节流。

下面是这八种指令的描述,其中每个指令由一个字符标识:

字符含义
> 指针加一
< 指针减一
+ 指针指向的字节的值加一
- 指针指向的字节的值减一
. 输出指针指向的单元内容(ASCII码)
, 输入内容到指针指向的单元(ASCII码)
[ 如果指针指向的单元值为零,向后跳转到对应的]指令的次一指令处
] 如果指针指向的单元值不为零,向前跳转到对应的[指令的次一指令处

(按照更节省时间的简单说法,]也可以说成“向后跳转到对应的[状态”。这两解释是一样的。)

(第三种同价的说法,[意思是"向前跳转到对应的]“,]意思是”向后跳转到对应的[指令的次一指令处,如果指针指向的字节非零。”)

Brainfuck程序可以用下面的替换方法翻译成C语言(假设ptrchar*类型):

BrainfuckC
> ++ptr;
< --ptr;
+ ++*ptr;
- --*ptr;
. putchar(*ptr);
, *ptr =getchar();
[ while (*ptr) {
] }

BF解释器

 

 


 

#include <stdio.h>
#include <stdlib.h>//exit()函数的头文件 

/*hello_world_BF.txt 
out.txt 
*/
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();
}
 
int main(int argc,char *argv[])
{
    FILE *z;
 
    q=argc;
 
//    if(z=fopen(argv[1],"r")) {
    if(z=fopen("hello_world_BF.txt","r")) {
        while( (b=getc(z))>0 )
            *s++=b;
        *s=0;
        interpret(f);
    }
    
    fclose(z);
    
    return 0;
}

 

 测试样例:

cat hello_world_BF.txt
+++ +++ +++ +           initialize counter (cell #0) to 10[                       use loop to set the next four cells to 70/100/30/10    > +++ +++ +             add  7 to cell #1    > +++ +++ +++ +         add 10 to cell #2    > +++                   add  3 to cell #3    > +                     add  1 to cell #4    <<< < -                 decrement counter (cell #0)]>++ .                   print ‘H‘>+.                     print ‘e‘+++ +++ +.              print ‘l‘.                       print ‘l‘+++ .                   print ‘o‘>++ .                   print ‘ ‘<<+ +++ +++ +++ +++ ++. print ‘W‘>.                      print ‘o‘+++ .                   print ‘r‘--- --- .               print ‘l‘--- --- --.             print ‘d‘>+.                     print ‘!‘>.                      print ‘\n‘

Hello World!
$

 

 

 

BrainF**k的C解释器