我在玩弄nim (在撰写本文时仍称为 nimrod),通过用该语言编写 Brainfuck 解释器。没有实现循环,我有:
import os, unsigned
const RamSize = 200
type
TRam = array[0..RamSize, int]
var
ram : TRam
ip : int = 0
dp : int = 0
proc readCode(path: string) =
var
f : TFile = open(path)
i : int = 0
while i < RamSize and not EndOfFile(f):
ram[i] = ord(readChar(f))
inc(i)
proc main(path: string) =
readCode(path)
while ip < RamSize:
case chr(ram[ip])
of '>' : inc dp
of '<' : dec dp
of '+' : inc ram[dp]
of '-' : dec ram[dp]
of '.' : write stdout, chr(ram[dp])
else : nil
inc(ip)
echo()
if paramcount() == 1: main(paramstr(1))
else: echo("usage: bfrun PATH")
它编译成功,但是当我向它抛出一个输入时:
>
+++++ +++++
+++++ +++++
+++++ +++++
+++++ +++++
+++++ +++++
+++++ +++++
+++++ .
哪个应该打印字符 'A' 它返回 'N'。有任何想法吗?
最佳答案
如果我理解正确,它看起来像 dp
设置为 1,然后 ram[dp]
增加了 65 倍。但是ram[dp]
,又名 ram[1]
, 开始保存程序的第二个字符,即回车符 (ASCII 13)。 A 是 ASCII 65,N 是 ASCII 78,65 + 13 是 78。
套装dp
在开始增加存储单元之前,到程序空间之外的某个地方——或者使用单独的 RAM 来保存程序。
关于interpreter - 在 Nimrod 中的 Brainfuck 翻译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16842810/