#brainfuck-compiler #memory #standard #cell #debugging #right #left

bin+lib brainfuck-plusplus

具有一些额外功能的 brainfuck 解释器和编译器

2 个稳定版本

1.0.1 2022年4月25日

#442 in 编程语言

MIT 许可证

21KB
309

Brainfuck++

具有一些额外功能的 brainfuck 解释器和编译器。

关于 brainfuck

brainfuck 的理念是内存操作。基本上,你得到一个由 30,000 个 1 字节内存块组成的数组。数组的实际大小取决于编译器或解释器中使用的实现,但标准的 brainfuck 状态为 30,000。在这个数组中,你可以增加内存指针,增加内存指针指向的内存值等。让我先向你介绍我们可用的 10 个运算符。

符号 描述
# 此符号用于调试当前单元的值。
! 将使用 ! 符号退出程序,退出代码为 2
> 增加内存指针,或将指针向右移动 1 块。
< 减少内存指针,或将指针向左移动 1 块。
+ 增加内存指针指向的内存块的值
- 减少内存指针指向的内存块的值
] 类似于 C 的 while(cur_block_value != 0) 循环。
[ 如果当前指向的内存块的值不为零,则跳回 [
, 类似于 C 的 getchar()。输入 1 个字符。
. 类似于 C 的 putchar()。将 1 个字符打印到控制台

一些规则

  • 编译器或解释器应忽略上述 10 个符号以外的任何任意字符。除了 10 个运算符之外的字符应视为注释。

  • 程序开始时,“数组”上的所有内存块都设置为 0。并且内存指针最初位于最左侧的内存块上。

  • 可以嵌套任意次数的循环。但所有 [ 必须有一个相应的 ]

安装

要安装它,只需将以下行添加到您的 Cargo.toml

brainfuck-plusplus = "0.1.3"

您还可以通过执行以下操作安装 CLI

$ cargo install brainfuck-plusplus
$ brainfuck -V # Check the version for brainfuck.

用法

人类需要以某种方式学习。此解释器包含两部分,一个是 CLI,另一个是您可以用来解释 brainfuck 代码的模块。

CLI

$ brainfuck [OPTIONS] [FILE]

要添加冗余信息,请将 -v 添加到 [OPTIONS],如果您想添加更多级别,请添加 -vv-vvv 以及更多...

要查看帮助菜单,请在命令行中输入以下内容。

$ brainfuck --help

模块

您需要导入这个仓库和一个名为 brainfuck 的函数,它将导入一个参数作为 String,这将是 brainfuck 的源代码,第二个参数是 i32,它是调试的级别。

use brainfuck::*;

fn main() {
    let bf_config =  BFConfig {
        ..default_bf_config()
    };

    brainfuck("+++++++>++>-.", config);
}

您还可以获取函数的返回值,得到使用的单元格数量。

let cells: [u8, 3000] = brainfuck(...);

配置

use brainfuck::*;

...

let bf_config =  BFConfig {
    debug: 0,
    ..default_bf_config() // support for default values
};

这是配置结构的定义。

pub struct BFConfig {

    // The level of verbosity (default to 0)
    pub(crate) debug: i32,
}

示例

这是一个 brainfuck 的 hello world 示例。

>++++++++[<+++++++++>-]<.>++++[<+++++++>-]<+.+++++++..+++.>>++++++[<+++++++>-]<+
+.------------.>++++++[<+++++++++>-]<+.<.+++.------.--------.>>>++++[<++++++++>-
]<+.

想法

Brainfuck 是一个非常小的语言,可以供初学者编写他们的第一个图灵完备编程语言。由于它非常简单,因此总有新的方法使其更有趣。

以下是一些想法

  • 创建一个 REPL
  • 编译成其他语言
  • 更多语言扩展
    • # 用于单元格调试 :tick
    • ! 用于程序退出 :tick
    • ^ 用于导入其他文件
    • {} 如果语句(用于检查单元格是否相同)。

许可

此项目受 MIT 许可证的保护

依赖

~3MB
~53K SLoC