2013-05-30 15 views
7

Obecnie bawi się z Nimrod pisząc tłumacz Brainfuck w języku. Obecnie realizowany bez pętli, mam:Tłumacz Brainfuck w 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") 

To kompiluje poprawnie, ale kiedy rzucić wejście w nim podoba:

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

Który powinien wydrukować znak „A” zwraca „N. " Jakieś pomysły?

Odpowiedz

6

Jeśli rozumiem to poprawnie, wygląda na to, że dp jest ustawione na 1, a następnie ram[dp] jest zwiększane 65 razy. Ale ram[dp], inaczej ram[1], rozpoczyna się od posiadania drugiego znaku programu, który jest znakiem powrotu karetki (ASCII 13). A to ASCII 65, N to ASCII 78, a 65 + 13 to 78.

Ustaw dp na miejsce poza obszarem programu, zanim zaczniesz zwiększać pojemność komórki pamięci - lub użyj oddzielnej pamięci RAM do przechowywania programu.

+0

Świetnie, dzięki. Rozwiązaniem jest dodanie kolejnej "taśmy" RAM, aby uniknąć problemu zwiększania wartości powrotu karetki. –

Powiązane problemy