2 个稳定版本
1.0.1 | 2024年5月31日 |
---|
#290 in 编程语言
31KB
631 行
vtashkov-bf: Brainfuck
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_world
和 rot13
是从该语言的维基百科页面中获得的: Brainfuck
关于我
由 Victor Tashkov 编写 [email protected]
以 MIT 许可证发布。
依赖关系
~1.2–1.7MB
~33K SLoC