/CPBF

CP's Brainfuck

Primary LanguageC++MIT LicenseMIT

BF2.2.1 2015年11月22日 +稍微规范了语言

BF2.2 2015年8月26日 +编译后的可执行文件的扩展名替换了源文件的扩展名,而不是在源文件名后加上扩展名

BF2.1.1 2015年8月10日 +优化程序

BF2.1 2015年8月9日 +修复BUG:注释会显示在单步执行框内 +优化程序

BF2.0 2015年6月20日 +增加编译功能(转换为C代码然后用TCC编译) 具体使用方法见本文件的“使用方法”(往下翻)。 感谢TCC为我提供这么小的免费编译器

BF1.6 2015年3月8日 +添加了单步执行功能 +稍微美化了界面 -1.2和1.5的帮助文档写了解释器有‘@’这个指令,实际上并没有。

BF1.5 2015年2月27日 +添加了内存监视功能

BF1.2 2015年2月26日 +修复了使用'.'指令时程序会出错的bug +修正了错误提示 +在程序中显式的关闭文件 +-支持注释,但注释中不能出现关键字(即指令)

BF1.0 2015年2月26日 +支持标准BF:'<' '>' ',' '.' '+' '-' '[' ']' +可以检查语法错误 -不支持注释

============================== 使用方法: 直接输入命令"CPBF" + 文件名 + “-dm”(可选)+ “-dss”(可选)+“-c”(可选,如果不输入文件名,则会提示输入)

“-dm”参数是开启内存监视,请参见“CPBF内存监视”。 “-dss”参数是开启单步执行,请参见“CPBF单步执行教程”。 “-c”参数是编译,如果附加了此参数,另两个参数将会被忽略,编译后的文件名为:源文件名 + “.exe”。

注:除关键字外的字符都会被当做注释处理

BF教程: BrainFuck是一门编程语言,它只有八个符号,由数组和指针构成。 符号表: <:指针减1,即指针指向数组的前一个数值(开始时指针指向数组的第一个数值,这时使指针减一的话,指针会回滚到指向数组的最后一个数值,数组的容量为32768)。

:指针加1,即指针指向数组的后一个数值(当指针指向数组的最后一个数值时,使用此指令会使指针回滚到数组的第一个数值)。 +:指针指向的值加1,指针指向数组的一个数值,这个数值加1(如果数值为127,此指令会使数值回滚到0)。 -:指针指向的值减1,指针指向数组的一个数值,这个数值减1(如果数值为0,此指令会使数值回滚到127)。 ,:从键盘输入一个字符,并将用户输入的字符转换为ASCII码保存在指针指向的数值中。 .:将指针指向的数值转换为字符(从ASCII码)并输出到屏幕上。 [:执行此指令时,如果指针指向的数值不为0,则向后跳转到对应的]指令的次一指令处。 ]:执行此指令时,如果指针指向的数值为0,则向前跳转到对应的[指令的次一指令处。

例子(所有的代码我都放到了文件夹里): Code1.b ===========代码开始=========== ,. ===========代码结束=========== 上面的就是BF语言的一个程序,在程序开始的时候,指针被初始化为指向第一个数值,我们把这个位置叫作0,那么下一个数值的位置就是1,再下一个的位置是2,以此类推,一直打到此解释器所允许的32767(如果你学过数组,这很好理解,大神勿喷)。 这个程序由两个字符组成,我们首先看第一个',',它代表了获取用户输入的一个字符,并把它转换为ASCII码存储到当前指针指向的位置里(在初始化之后,我们并没有对指针指向的位置作任何改动,所以它的位置是0)。这样,当用户按下键盘上的一个键时,这个键的ASCII码值就被保存到位置0。然后按顺序执行下一个指令:'.'。它读取指针指向的位置的值并输出,由于我们之前已经输入了一个值,而且我们没有对指针指向的值做任何改动,所以它把用户刚才输入的值输出到屏幕上。

Code2.b ===========代码开始=========== ,>,>,>,>,<<<<.>.>.>.>. ===========代码结束=========== 有点恶心,是吗?现在先讲吧。首先我们读取用户输入,并将指针移到下一个位置,这样接连五次(最后一次没有移动指针),现在,数组的0、1、2、3、4位置里已经存储了你之前输入的内容。现在,程序把指针左移4个位置,并按顺序输出。'<'将指针左移一个位置,'>'将指针右移一个位置。

Code3.b ===========代码开始=========== +-+-+-+-+-+-+-+-+-+++++. ===========代码结束=========== 我是故意的。这段代码最后的输出一个梅花图像(这个梅花只能在控制台下显示)。这一段代码将指针指向的位置的值做很多次的加减操作,然后输出。'+'将指针指向的位置的值加1,'-'将指针指向的位置的值减1。

Code4.b ===========代码开始=========== ++++++++++[>++++++++++<-]>. ===========代码结束=========== 运行这段代码,它输出'd'这个字符。首先,我们将位置0的数值置为10(10个加号),然后,下一个指令是'['它在指针指向的值为0的时候会跳转到与其对应的']'指令的下一个指令,但现在指针指向的位置的值已经被我们置为10,所以解释器忽略这个指令,继续执行,然后指针移到位置1,并将它加上10,然后移回位置0,并将其值减去1,下一个指令是']',它在指针指向的位置的值不为零的时候跳转到与此指令相对的'['指令的下一指令处,这时指针指向位置0,它的值被我们减去1,还剩9,就这样重复10次,直到位置0的值为0,解释器就会忽略']'指令,然后将指针右移一个位置,并输出。刚才我们已经将位置1加了10个10,也就是100,把它看作ASCII码,输出的值就是'd'。

by 果壳 即 氢氦锂uuo