interpreter - 在 Nimrod 中的 Brainfuck 翻译

标签 interpreter language-implementation brainfuck nimrod nim-lang

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

最佳答案

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

套装dp在开始增加存储单元之前,到程序空间之外的某个地方——或者使用单独的 RAM 来保存程序。

关于interpreter - 在 Nimrod 中的 Brainfuck 翻译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16842810/

相关文章:

c++ - 如何重定向 LLI 输出?

java - Java 一定要编译成字节码吗?

compilation - 字节码栈与三个地址

c - EOF 保证为 -1 吗?

optimization - 如果我在 Haskell/GHC 中使用未装箱类型(如 Int#),我应该注意哪些事项?

java - 在 Java (Eclipse) 中使用 Python 脚本

c - 使用 memcpy 进行内联线程调度

python - OS X 终端中 Python 解释器中的制表符补全

computer-science - 在 Brainfuck 中实现控制结构

ascii - 脑残乘法