0

当遇到 EOF 时, befunge-98~中的指令的预期行为是什么?

直观地说,它应该将 -1 放在堆栈上,但我发现在这方面有一些变化:

  • Befunge-93 JS解释器遵循“直观”的方式。(以下脚本输出:“ -1 -1 97”)
  • Michael Riley 的解释器将 EOF 视为 LF 字符(ASCII 10),并在读取额外(不存在的)字符时将其置于顶部。(输出:“ 10 10 97”)
  • Matti Niemenmaa 的解释器也将 EOF 视为 LF,但在读取额外字符时继续等待用户输入。(无输出)

这是测试:

echo "a" | funge test.fg

使用 test.fg 如下(读取三个字符并输出它们的代码):

~~~...@

实际上是否存在正确处理 EOF 的解释器(即与 LF 不同)并且仍然支持完整的 befunge-98 规范?

4

1 回答 1

2

建银国际遵循规范:

在文件结束或其他文件错误条件的情况下,& 和 ~ 都像 r 一样。

可以使用其内置的跟踪器/调试器进行验证:

$ echo "~~~...@" > test.fg
$ echo "a" > input
$ ccbi --trace test.fg

Instruction: 126 0x7e '~'
Position: (0,0) -- Delta: (1,0) -- Offset: (0,0)
Stack: 0 cell(s): [  -   -   -   -   -   -   -   -] ""
Tick: 0 -- IPs: 1 -- Index/ID: 0/0 -- Stacks: 1 -- Mode:

(Tracer) stdin < input
Successfully set stdin to file 'input'.
(Tracer) s

Instruction: 126 0x7e '~'
Position: (1,0) -- Delta: (1,0) -- Offset: (0,0)
Stack: 1 cell(s): [  -   -   -   -   -   -   -  97] "a"
Tick: 1 -- IPs: 1 -- Index/ID: 0/0 -- Stacks: 1 -- Mode:

(Tracer) s

Instruction: 126 0x7e '~'
Position: (2,0) -- Delta: (1,0) -- Offset: (0,0)
Stack: 2 cell(s): [  -   -   -   -   -   -  97  10] "a^J"
Tick: 2 -- IPs: 1 -- Index/ID: 0/0 -- Stacks: 1 -- Mode:

(Tracer) s

Instruction: 126 0x7e '~'
Position: (1,0) -- Delta: (-1,0) -- Offset: (0,0)
Stack: 2 cell(s): [  -   -   -   -   -   -  97  10] "a^J"
Tick: 3 -- IPs: 1 -- Index/ID: 0/0 -- Stacks: 1 -- Mode:

(Tracer) s

Instruction: 126 0x7e '~'
Position: (2,0) -- Delta: (1,0) -- Offset: (0,0)
Stack: 2 cell(s): [  -   -   -   -   -   -  97  10] "a^J"
Tick: 4 -- IPs: 1 -- Index/ID: 0/0 -- Stacks: 1 -- Mode:

(Tracer) s

Instruction: 126 0x7e '~'
Position: (1,0) -- Delta: (-1,0) -- Offset: (0,0)
Stack: 2 cell(s): [  -   -   -   -   -   -  97  10] "a^J"
Tick: 5 -- IPs: 1 -- Index/ID: 0/0 -- Stacks: 1 -- Mode:

(Tracer) s

Instruction: 126 0x7e '~'
Position: (2,0) -- Delta: (1,0) -- Offset: (0,0)
Stack: 2 cell(s): [  -   -   -   -   -   -  97  10] "a^J"
Tick: 6 -- IPs: 1 -- Index/ID: 0/0 -- Stacks: 1 -- Mode:

在刻度 3 上,增量已从(1,0)变为(-1,0),即第~3 列(位置 )上的指令(2,0)如预期的那样反映在 EOF 上。之后,代码在两条~指令之间循环。

可以修改您的代码以检查是否符合~-on-EOF 行为,例如:

~~#v~...a"tcelfer ton did">:#,_@
   >..a"detcelfer">:#,_@
于 2014-04-07T04:26:23.013 回答