Nimrod中的Brainfuck解释器

8

我正在玩弄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',你有什么想法吗?

1个回答

6
如果我理解正确,看起来dp被设置为1,然后将ram[dp]增加了65次。但是,ram[dp],也就是ram[1],一开始保存的是程序的第二个字符,即回车符(ASCII 13)。A为ASCII 65,N为ASCII 78,65 + 13等于78。
在开始递增内存单元之前,将dp设置为程序空间之外的某个位置,或者使用单独的RAM来保存程序。

非常好,谢谢。解决方法是添加另一个 RAM “带”来避免在回车时递增的问题。 - Taylor Skidmore

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接