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来保存程序。

+0

太好了,谢谢。该解决方案是添加另一个RAM“磁带”,以避免在回车上增加的问题。 –