我正在玩弄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‘。有什么想法吗?
发布于 2013-05-31 02:10:30
如果我理解正确的话,看起来dp被设置为1,然后ram[dp]被递增65倍。但是ram[dp],也就是ram[1],一开始使用的是程序的第二个字符,即回车符(ASCII13)。A是ASCII 65,N是ASCII 78,65 + 13是78。
在开始递增存储单元之前,将dp设置为程序空间之外的某个位置--或者使用单独的内存来保存程序。
https://stackoverflow.com/questions/16842810
复制相似问题