论坛交流
首页办公自动化| 网页制作| 平面设计| 动画制作| 数据库开发| 程序设计| 全部视频教程
应用视频: Windows | Word2007 | Excel2007 | PowerPoint2007 | Dreamweaver 8 | Fireworks 8 | Flash 8 | Photoshop cs | CorelDraw 12
编程视频: C语言视频教程 | HTML | Div+Css布局 | Javascript | Access数据库 | Asp | Sql Server数据库Asp.net  | Flash AS
当前位置 > 文字教程 > C语言程序设计教程
Tag:新手,函数,指针,数据类型,对象,Turbo,入门,运算符,数组,结构,二级,,tc,游戏,试题,问答,编译,视频教程

源程序 - brainf*ck 语言的解释器

文章类别:C语言程序设计 | 发表日期:2010-12-17 9:33:38

源程序 - 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语言程序设计视频教程专区

视频教程列表
文章教程搜索
 
C语言程序设计推荐教程
C语言程序设计热门教程
看全部视频教程
购买方式/价格
购买视频教程: 咨询客服
tel:15972130058