传说中的Brainfuck
Posted on | 二月 27, 2010 | No Comments
>++++++++[<+++++++++>-]<.>+++++[<++++++>-]<-.+++++++..+++.[-]+++++[<++++++>-]<++.[-]+++++++++[<+++++++++>-]<—-.>++++[<++++++++>-]<++.-.+>+++[<+++>-]<+.>+++++[<++++>+]<.>++++[<+++>-]<+.[-]++++[<++++++++>-]<+.
+ 指针指向的这个字节自加
- 指针指向的这个字节自减
> 指针向右移一个字节
< 指针向左移一个字节
. 输出指针指向的这个字节
, 输入这个字节,存在指针指向的这个字节
[ 如果指针指向的单元值为零,向前跳转到对应的]指令的次一指令处
] 如果指针指向的单元值不为零,向后跳转到对应的[指令的次一指令处
> ++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;
}
相关文章:
- 利用DEBUG API编写Loader Path[z]
- 微软的22道数据结构算法面试题
- C代理源码
- 在C++中嵌入JavaScript——Google V8 JavaScript Engine使用体验
- 多叉树 JSON:C#
评论|Comments
留言|Leave a Reply

![如果您自认为是一位忠实的Silverlight-Fans,那么请将此标志放到您的博客中成为一名真正的[银光使者]](http://images.cnblogs.com/cnblogs_com/alamiye010/Silverlighter1.jpg)