Nimrod的Brainfuck口译员
问题描述:
我目前正在用Nimrod编写一个Brainfuck解释器。目前,没有循环来实现,我有: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来保存程序。
太好了,谢谢。该解决方案是添加另一个RAM“磁带”,以避免在回车上增加的问题。 –