尼姆罗德的Brainfuck翻译

问题描述 投票:7回答:1

我正在用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'。有任何想法吗?

interpreter language-implementation brainfuck nimrod nim
1个回答
6
投票

如果我理解正确,看起来dp设置为1,然后ram[dp]增加65次。但ram[dp],又名ram[1],开始持有程序的第二个字符,这是一个回车符(ASCII 13)。 A是ASCII 65,N是ASCII 78,65 + 13是78。

在开始递增内存单元之前,将dp设置为程序空间之外的某个位置 - 或者使用单独的RAM来保存程序。

© www.soinside.com 2019 - 2024. All rights reserved.