C指针原理(78)-递归(2)
来源:互联网 发布:photoshop for linux 编辑:程序博客网 时间:2024/05/16 13:49
、rainfuck解释器C语言实现
Brainfuck,是一种极小化的计算机语言,它是由Urban Müller在1993年创建的。一种简单的、可以用最小的编译器来实现的、符合图灵完全思想的编程语言。这种语言由八种运算符构成,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)
- C指针原理(77)-递归(1)
- C指针原理(79)-递归(3)
- C指针原理(80)-递归(4)
- C指针原理(2)
- C指针原理(2)-AT&T汇编
- C指针原理(95)-汇编基础(2)
- C指针原理(1)
- C指针原理(3)
- C指针原理(4)
- C指针原理(5)
- C指针原理(6)
- C指针原理(8)
- C指针原理(9)
- C指针原理(10)
- C指针原理(11)
- C指针原理(12)
- c二级指针原理
- [DP]HOJ 1760The jackpot
- Lambda表达式委托使用
- 给你的AIR程序做个启动画面
- 是你的程序员辛苦还是他们太懒?
- 软件公司的测试人员为什么更有地位
- C指针原理(78)-递归(2)
- Matlab 学习 入门篇 二 数据类型
- 引用, 强弱引用, 事件机制与垃圾回收的关系及应用法则
- 挑战:截取bing正规和20进制的加法
- 复制loader
- ASP.NET 服务器控件对应HTML标签
- mock体检
- FFT bzoj2179
- Ubuntu 环境变量的设置