2013-05-30 30 views
7

Tôi hiện đang đùa giỡn với Nimrod bằng cách viết một thông dịch viên Brainfuck bằng ngôn ngữ. Hiện nay, mà không có vòng thực hiện, tôi có:Thông dịch viên Brainfuck ở 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") 

Nó biên dịch thành công, nhưng khi tôi ném một đầu vào tại nó thích:

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

nào nên in các ký tự 'A' nó trở về 'N. ' Bất kỳ ý tưởng?

Trả lời

6

Nếu tôi hiểu chính xác, có vẻ như dp được đặt thành 1 và sau đó ram[dp] được tăng 65 lần. Nhưng ram[dp], còn gọi là ram[1], bắt đầu giữ ký tự thứ hai của chương trình, đó là ký tự trả về vận chuyển (ASCII 13). A là ASCII 65, N là ASCII 78 và 65 + 13 là 78.

Đặt dp vào một nơi nào đó bên ngoài không gian chương trình trước khi bạn bắt đầu tăng bộ nhớ - hoặc sử dụng RAM riêng để giữ chương trình.

+0

Tuyệt vời, cảm ơn. Giải pháp này là thêm một "băng" RAM khác để tránh vấn đề tăng lên trên trở về vận chuyển. –

Các vấn đề liên quan