C指针原理(78)-递归(2)

rainfuck解释器C语言实现

Brainfuck,是一种极小化的计算机语言,它是由Urban Müller1993创建的。一种简单的、可以用最小的编译器来实现的、符合图灵完全思想的编程语言。这种语言由八种运算符构成,brainfuck的计算方式如此与众不同,基于一个简单的机器模型,除了指令,这个机器还包括:一个以字节为单位、被初始化为零的数组、一个指向该数组的指针(初始时指向数组的第一个字节)、以及用于输入输出的两个字节流。

麦好的AI乐园博客所有内容是原创,如果转载请注明来源

http://blog.csdn.net/myhaspl/


下面是这八种状态的描述,其中每个状态由一个字符标识:

字符

含义

>

指针加一

<

指针减一

+

指针指向的字节的值加一

-

指针指向的字节的值减一

.

输出指针指向的单元内容(ASCII码)

,

输入内容到指针指向的单元(ASCII码)

[

如果指针指向的单元值为零,向后跳转到对应的]指令的次一指令处

]

如果指针指向的单元值不为零,向前跳转到对应的[指令的次一指令处

可在这个页面找到这个语言的相关内容:http://www.muppetlabs.com/~breadbox/bf/,该网址提供了一个不错的简单高效的brainfuck解释器源代码,代码中涉及数组、指针等C指针的应用。

首先,完成这个解释器,该程序对所需要用到的变量作了如下声明:

1、数组变量

char a[5000], f[5000]

其中a

 

#include <stdio.h>

 

int  p, r, q;

char a[5000], f[5000], b, o, *s=f;

 

void interpret(char *c)

{

char *d; int tmp;

 

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 ',': 

    tmp=getchar();

    if (tmp == EOF) a[p]=0; 

    else a[p]=tmp;

    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);

 

default: o=0;

}

if( p<0 || p>100)

puts("RANGE ERROR"), exit(0);

}

r--;

}

 

int 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);

}

return 0;

}

你可能感兴趣的:(C指针原理(78)-递归(2))