2 个稳定版本

1.0.1 2024年5月31日

#290 in 编程语言

MIT 许可证

31KB
631

vtashkov-bf: Brainfuck

License: MIT Build Status codecov

vtashkov-bf 是一个 Brainfuck 解释器。它包含一个库 crate vtashkov_bf,导出大部分功能,以及一个可执行文件 vtashkov-bf,提供命令行界面来执行 Brainfuck 程序。

Brainfuck 语言

以下内容来自该语言的维基百科页面: Brainfuck

Brainfuck 是由 Urban Müller 于 1993 年创建的一种隐秘编程语言。该语言以其极端的简约性而著称,仅由八个简单命令、一个数据指针和一个指令指针组成。

该语言由八个命令组成。一个 Brainfuck 程序是一系列这些命令,可能穿插着其他字符(这些字符将被忽略)。命令按顺序执行,但有例外:指令指针从第一个命令开始,指向每个命令并执行,然后通常向前移动到下一个命令。当指令指针移动到最后一个命令之后时,程序终止。

Brainfuck 语言使用一个简单的机器模型,包括程序和指令指针,以及一个至少有 30,000 个字节单元的一维数组,初始值都为 0;一个可移动的数据指针(初始指向数组的左侧字节);以及用于输入和输出的两个字节流(通常连接到键盘和显示器,并使用 ASCII 字符编码)。

八种语言命令每个都由一个字符组成

字符 含义
> 将数据指针增加一个(指向右侧的下一个单元)
< 将数据指针减少一个(指向左侧的下一个单元)。
+ 将数据指针处的字节增加一个。
- 将数据指针处的字节减少一个。
. 输出数据指针处的字节。
, 接受一个字节输入,将其值存储在数据指针处的字节中。
[ 如果数据指针处的字节为零,则不是将指令指针向前移动到下一个命令,而是将其跳转到匹配的 ] 命令之后的命令。
] 如果数据指针处的字节不为零,则不是将指令指针向前移动到下一个命令,而是将其跳回到匹配的 [ 命令之后。

[ 和 ] 的匹配方式通常与括号相同:每个 [ 与一个 ] 匹配,反之亦然,[ 首先出现,且两个之间不能有未匹配的 [ 或 ]。 此规则已被删除,请参见下文。

实现细节

  • 如果程序试图将指针移动到第一个数组单元以下,或者超出最后一个数组单元,则指针将回绕。
  • 单个单元的值范围从 0 到 255(即无符号整数字节)。
  • 如果程序试图将某个单元的值减小到其文档中的最小值以下,或将某个单元的值增加到其文档中的最大值以上,那么在执行此操作后的单元中的值将回绕。
  • 如果程序试图在输入流中没有更多数据时输入值,则当前单元中的值保持不变。
  • 如果程序包含一个或多个未配对的 [ 方括号,则解释器将假定相应的 ] 关闭括号在末尾(即,它将表现得好像它们被添加了一样)。如果程序中有一个没有对应 [ 开放括号的 ] 关闭括号,则解释器将忽略该点之后的所有指令。

目标是尽量减少 vtashkov-bf 产生的错误,并尽可能地宽容。

命令行用法

rainfuck interpreter

Usage: vtashkov-bf [OPTIONS] <INPUT_FILE>

Arguments:
  <INPUT_FILE>  Path to the file to be interpreted

Options:
  -m, --memory-size <MEMORY_SIZE>  Number of the cells in the memory, defaults to 30 000 [default: 30000]
  -h, --help                       Print help
  -V, --version                    Print version

库用法

这将输出“Hello World!\n”到输出向量中

use std::io::Cursor;
use std::str;

use vtashkov_bf::Interpreter;

let source_code = "++++++++[>++++[>++>+++>+++>+<<<<-]>+>+>->>+[<]<-]>>.>---.+++++++..+++.>>.<-.<.+++.------.--------.>>+.>++.";
let mut input = Cursor::new(vec![]);
let mut output = vec![];
let mut interpreter = Interpreter::new(&mut input, &mut output, 30000);
interpreter.execute(&source_code);
assert_eq!("Hello World!\n", str::from_utf8(output.as_slice()).unwrap());

示例

Brainfuck 语言示例程序可以在 /examples 目录中找到。

hello_worldrot13 是从该语言的维基百科页面中获得的: Brainfuck

关于我

由 Victor Tashkov 编写 [email protected]

以 MIT 许可证发布。

依赖关系

~1.2–1.7MB
~33K SLoC