源程序 - brainf*ck 语言的解释器
建议用 32 位编译器编译,如用 tc 之类,请选 Large 或 Huge 模式。#include <stdio.h>
#ifndef cellsize
#define cellsize 30000
#endif
const char *s_name =
" bfi"
#if cellsize != 30000
"%d"
#endif
" - brainf*ck language interpreter 1.0.1 build - "__DATE__"\n"
#if cellsize != 30000
" **** Special version with %d cells in size ****\n"
#endif
" ----- copyright © 2005 by 8pm@baidu.cbar\n";
const char *s_license =
" This program is free software; you can redistribute it and/or modify\n"
" it under the terms of the GNU General Public License as published by\n"
" the Free Software Foundation; either version 2 of the License, or\n"
" (at your option) any later version.\n"
"\n"
" This program is distributed in the hope that it will be useful,\n"
" but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n"
" GNU General Public License for more details.\n"
"\n"
" You should have received a copy of the GNU General Public License\n"
" along with this program; if not, write to the\n"
" Free Software Foundation, Inc.,\n"
" 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\n"
"\n"
" usage: $ %s [source code]\n"
"\n";
const char *s_err_open =
"[] error: unable to open file %s\n";
const char *s_err_ovfl =
"[] error: unable to run, program too large.\n";
const char *s_err_unmt =
"[] error: unmatch [ and ] in source file.\n";
char a[cellsize], o[cellsize];
int n=0,ip=0,dp=0;
int main(int argc, char **argv)
{
FILE *fp = NULL;
if (1 == argc) {
#if cellsize != 30000
fprintf(stderr, s_name, cellsize/1000, cellsize);
#else
fprintf(stderr, s_name);
#endif
fprintf(stderr, s_license, argv[0]);
return 0; }
if (NULL == (fp=fopen(argv[1],"r"))) {
fprintf(stderr, s_err_open, argv[1]);
return -1;
}
while(!feof(fp))
switch(n=fgetc(fp)) {
case '[':ip+=2;case ']':--ip;case '>':
case '<':case '+':case '-':case '.':case ',':
o[dp++]=n;
if (dp==cellsize) {
fclose(fp);
fprintf(stderr, s_err_ovfl);
return -2;
}
}
fclose(fp);
if (ip) {
fprintf(stderr, s_err_unmt);
return -3;
}
n=ip=dp=0;
do {
n=1;
switch (o[ip]) {
case '>':++dp==cellsize?dp=0:0;break;
case '<':--dp==-1?dp+=cellsize:0;break;
case '+':a[dp]++;break;
case '-':a[dp]--;break;
case '.':putchar(a[dp]);fflush(stdout);break;
case ',':a[dp]=getchar();break;
case '[':
if(!a[dp])
while(n)
switch(o[++ip]){
case '[':n++;break;
case ']':n--;break;
}
break;
case ']':
if(a[dp])
while(n)
switch(o[--ip]){
case ']':n++;break;
case '[':n--;break;
}
break;
}
} while(o[++ip]);
return 0;
}编译后可用以下程序试运行,如能正确输出,则编译成功。
这个不用说了,学没一种语言几乎都是先写这个:
Hello.b
注意:因为在 bf 语言里,凡是不是八个指令符之外的字符都算作注释,譬如以下的代码两行 * 之间的东东,也包括这两行 * 和中文都可以直接放在源文件里。
**********************************
一个在屏幕上打印"Hello World!"的程序:
++++++++++[>+++++++>++++++++++>+++>+<<<<-]
>++.>+.+++++++..+++.>++.<<+++++++++++++++.
>.+++.------.--------.>+.>.
**********************************可以再试运行这个:
#!/usr/local/bin/bfi
上面这一行是告诉命令解释程序用哪一个程序来解释运行这个源代码
只在 unix/linux 系统下有效 :)
用 brainfuck 语言写的一个简单示范程序; 在屏幕上输出 "8pm"
第一个单元用做循环计数器; 设为 10
++++++++++ [ 循环 10 次
>+++++ 第二单元的值加 5
>+++++++++++ 第三单元的值加 11
>+++++++++++ 第四单元的值加 11
>+ 第五单元的值加 1
<<<<-]
现在前五个单元应该是这样的
单元 | 第一 第二 第三 第四 第五
内容 | 0 50 110 110 10
>++++++ 加 6 到第二单元 = 56; 字符 '8' 的 ascii 编码值
>++ 加 2 到第三单元 = 112; 字符 'p' 的 ascii 编码值
>- 第四单元值减 1 = 109; 字符 'm' 的 ascii 编码值
第五单元值是 10; 字符 '换行符' '\n' 的 ascii 值
<<< 指针移回字符串的开始; 第二单元
>.>.>.>. 输出字符串
*** 程序结束 ***
进入C语言程序设计视频教程专区
Word教程网 | Excel教程网 | Dreamweaver教程网 | Fireworks教程网 | PPT教程网 | FLASH教程网 | PS教程网 |
HTML教程网 | DIV CSS教程网 | FLASH AS教程网 | ACCESS教程网 | SQL SERVER教程网 | C语言教程网 | JAVASCRIPT教程网 |
ASP教程网 | ASP.NET教程网 | CorelDraw教程网 |