• 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("<>;+-,.[] ",*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 %*s ",
                    *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 '
    '

    Hello World!
    $

     

  • 相关阅读:
    python爬虫练习5——新闻联播
    python爬虫练习4——腾讯视频评论提取
    python爬虫练习3——豆瓣电影
    python爬虫练习2——豆瓣读书
    python爬虫练习1——百度阅读榜
    微信小程序音频视频下载(fiddler抓包)
    4. Median of Two Sorted Arrays
    42.trapping-rain-water
    3.lengthOfLongestSubstring
    1.two sum
  • 原文地址:https://www.cnblogs.com/likeatree/p/4004347.html
Copyright © 2020-2023  润新知