2013-05-30 2 views
7

Ich spiele gerade mit Nimrod, indem ich einen Brainfuck Interpreter in der Sprache schreibe. Derzeit ohne Schleifen implementiert, die ich habe:Brainfuck Interpreter in Nimrod

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") 

Es erfolgreich kompiliert, aber wenn ich einen Eingang an ihm werfen mag:

> 
+++++ +++++ 
+++++ +++++ 
+++++ +++++ 
+++++ +++++ 
+++++ +++++ 
+++++ +++++ 
+++++ . 

, die den Charakter gedruckt werden soll ‚A‘ es gibt ‚N. " Irgendwelche Ideen?

Antwort

6

Wenn ich das richtig verstehe, sieht es aus wie dp wird auf 1 gesetzt, und dann wird ram[dp] 65 mal inkrementiert. Aber ram[dp], aka ram[1], beginnt mit dem Halten des zweiten Zeichens des Programms, das ein Wagenrücklaufzeichen (ASCII 13) ist. A ist ASCII 65, N ist ASCII 78 und 65 + 13 ist 78.

Setzen Sie dp irgendwo außerhalb des Programmbereichs, bevor Sie die Speicherzelle inkrementieren - oder verwenden Sie separaten RAM, um das Programm zu halten.

+0

Großartig, danke. Die Lösung fügt ein weiteres RAM- "Band" hinzu, um das Problem des Inkrementierens auf dem Wagenrücklauf zu vermeiden. –