`
谁解怨妇心
  • 浏览: 27337 次
  • 性别: Icon_minigender_2
  • 来自: 广州
社区版块
存档分类
最新评论

打造BrainFuck解释器

阅读更多
  关于BrainFuck的wiki百科解释:http://zh.wikipedia.org/wiki/Brainfuck
  虽然这门语言的名字很不雅,但能实现几乎所有的功能,虽然写出来的程序要看懂就是一件十分难的事情了……不过可以看出外国人是将技术跟恶搞娱乐地结合在一起,啥时候咱们中国人也能搞点这样的东西出来呢?
  由于只有8个字符,所以解释器实现起来是十分简单,就算要写编译器的话……无非也就是将8个状态换成是opcode,再构造一个PE文件头将汇编代码写进去而已……
  解释器代码如下:
#include<stdio.h>
#include<malloc.h>
#include<string.h>

char br[]="++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.>.";

int main()
{
	char *eip = br;
	char *mem = (char*)malloc(100);
	char *ptr = mem;
	bool isright = true;
	while(*eip != 0)
	{
		if(*eip == '[')
		{
			while(*eip!=0 && *eip!=']')
				++eip;
			if(*eip == 0)
				isright = false;
		}
		else if(*eip == ']')
			isright = false;

		if(!isright)
		{
			printf("The brainfuck code has some wrong!\n");
			return 0;
		}
		++eip;
	}
	
	memset(ptr,0,100);

	eip = br;

	do
	{
		switch(*eip)
		{
		case '>':
			++ptr;
			break;
		case '<':
			--ptr;
			break;
		case '+':
			++*ptr;
			break;
		case '-':
			--*ptr;
			break;
		case '.':
			putchar(*ptr);
			break;
		case ',':
			*ptr = getchar();
			break;
		case '[':
			if(*ptr == 0)
			{
				do
				{
					++eip;
				}while(*eip!=']');
			}
			break;
		case ']':
			if(*ptr != 0)
			{
				do
				{
					--eip;
				}while(*eip!='[');
			}
			break;
		}
		if( (ptr-mem)>100)
		{
			printf("Stack overflow!\n");
			break;
		}
		++eip;
	}while(*eip!=0);
	free(mem);
	return 0;
}
				

  br字符数组中的是Hello world!的代码,编译后运行果然就出现了Hello world!的字符串了~
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics