CQ-CSER

计算机爱好者

传说中的Brainfuck

Posted on | 二月 27, 2010 | No Comments

3bdb544eb8654d11b3de0581

>++++++++[<+++++++++>-]<.>+++++[<++++++>-]<-.+++++++..+++.[-]+++++[<++++++>-]<++.[-]+++++++++[<+++++++++>-]<—-.>++++[<++++++++>-]<++.-.+>+++[<+++>-]<+.>+++++[<++++>+]<.>++++[<+++>-]<+.[-]++++[<++++++++>-]<+.

+ 指针指向的这个字节自加
- 指针指向的这个字节自减
> 指针向右移一个字节
< 指针向左移一个字节
. 输出指针指向的这个字节
, 输入这个字节,存在指针指向的这个字节
[ 如果指针指向的单元值为零,向前跳转到对应的]指令的次一指令处
] 如果指针指向的单元值不为零,向后跳转到对应的[指令的次一指令处

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

作为初学者,打个Hello Monyer!出来YY一下,哈哈。

编译器代码如下:

#include <stdio.h>
#include <stdlib.h>
char s[30000]={0};
char code[100000];
int len = 0;
int stack[100];
int stack_len=0;
int main(int argc,char**argv)
{
    char c;
    int i=0,j,k,x=0;
    FILE* f;
    char* p=s+10000;
    if(argc==2) {
        f=fopen(argv[1],”r”);
        if(f==NULL) {
            perror(“fopen”);
                return 1;
        }
        while(fread(&code[len],1,1,f)==1) {
            len++;
        }
    } else {
        fprintf(stderr,”%s:%dn”,__FILE__,__LINE__);
        return 2;
    }
    setbuf(stdout,NULL);
    while(i<len) {
        switch(code[i]) {
            case ‘+’:
                (*p)++;
                break;
            case ‘-’:
                (*p)–;
                break;
            case ‘>’:
                p++;
                break;
            case ‘<’:
                p–;
                break;
            case ‘.’:
                putchar((int)(*p));
                //printf(“put:%hdn”,*p);
                break;
            case ‘,’:
                *p=getchar();
                break;
            case ‘[':
                if(*p) {
                    stack[stack_len++]=i;
                } else {
                    for(k=i,j=0;k<len;k++) {
                        code[k]==’['&&j++;
                        code[k]==’]'&&j–;
                        if(j==0)break;
                    }
                    if(j==0)
                        i=k;
                    else {
                        fprintf(stderr,”%s:%dn”,__FILE__,__LINE__);
                        return 3;
                    }
                }
                break;
            case ‘]’:
                i=stack[stack_len-- - 1]-1;
                break;
            default:
                break;
        }
        i++;
        //x++;
        //printf(“%d : i=%dn”,x,i);
    }
    return 0;
}

相关文章:

  1. 利用DEBUG API编写Loader Path[z]
  2. 微软的22道数据结构算法面试题
  3. C代理源码
  4. 在C++中嵌入JavaScript——Google V8 JavaScript Engine使用体验
  5. 多叉树 JSON:C#

评论|Comments

留言|Leave a Reply





  • Archives

  • SUNSHINE

  • About

    本博客采用创作共用版权协议,要求署名、非商业用途和保持一致. 转载本博客内容也遵循“署名-非商业用途-保持一致”的创作共用协议.

    订阅

    Search

    Admin