View Single Post
Old Jul 19th, 2006, 6:31 PM   #28
Arevos
Programming Guru
 
Arevos's Avatar
 
Join Date: Aug 2005
Location: England
Posts: 1,499
Rep Power: 5 Arevos is on a distinguished road
In case anyone's interested, and because this probably doesn't warrent its own thread, here's a Python implementation of Brainf*ck:
import sys

class Commands(type):
    def __new__(cls, name, bases, members):
        members['commands'] = dict(
            (m.__doc__, m) for m in members.values() if m.__doc__
        )    
        return type.__new__(cls, name, bases, members)

class Interpreter:
    __metaclass__ = Commands

    def __init__(self, file):
        self.code    = [c for c in file.read() if c in self.commands.keys()]
        self.memory  = {}
        self.pointer = 0
        self.instr   = 0

    def run(self):
        while self.instr < len(self.code):
            self.commands[self.code[self.instr]](self)
            self.instr += 1
    
    def inc(self):
        ">"
        self.pointer += 1

    def dec(self):
        "<"
        self.pointer -= 1

    def inc_value(self):
        "+"
        try:
            self.memory[self.pointer] += 1
        except:
            self.memory[self.pointer] = 1

    def dec_value(self):
        "-"
        try:
            self.memory[self.pointer] -= 1
        except:
            self.memory[self.pointer] = -1
    
    def output(self):
        "."
        sys.stdout.write(chr(self.memory[self.pointer]))

    def input(self):
        ","
        self.memory[self.pointer] = ord(sys.stdin.read(1))

    def start_loop(self):
        "["
        if self.memory[self.pointer] == 0:
            self.instr = self.code.index("]", self.instr) + 1

    def end_loop(self):
        "]"
        if self.memory[self.pointer] != 0:
            for i in xrange(self.instr, 0, -1):
                if self.code[i] == "[":
                    self.instr = i
                    break

if __name__ == '__main__':
    Interpreter(sys.stdin).run()
Arevos is offline   Reply With Quote