BrainFuck語言一個58行的解譯器

來源:互聯網
上載者:User
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/

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.