2013-05-30 13 views
7

私は現在、Brainfuckインタプリタを言語で書いてNimrodとお付き合いしています。現在、実装されたループせずに、私が持っている: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") 

をそれは正常にコンパイルが、私はそれで入力を投げる時に好き:

文字に「」それは返す「N.を印刷する必要があります
> 
+++++ +++++ 
+++++ +++++ 
+++++ +++++ 
+++++ +++++ 
+++++ +++++ 
+++++ +++++ 
+++++ . 

'何か案は?

答えて

6

私がこれを正しく理解すれば、dpは1に設定され、次にram[dp]は65回増分されているようです。しかし、ram[dp]、別名ram[1]は、プログラムの2番目の文字を保持し始めます。これは、キャリッジリターン文字(ASCII 13)です。 AはASCII 65、NはASCII 78、65 + 13は78です。

dpは、メモリセルのインクリメントを開始する前にプログラム空間のどこかに設定してください。

+0

よろしくお願い致します。解決策は、キャリッジリターンでインクリメントする問題を回避するために別のRAM「テープ」を追加しています。 –

関連する問題