File: braininterp.py

package info (click to toggle)
pypy 7.0.0%2Bdfsg-3
  • links: PTS, VCS
  • area: main
  • in suites: buster
  • size: 107,216 kB
  • sloc: python: 1,201,787; ansic: 62,419; asm: 5,169; cpp: 3,017; sh: 2,534; makefile: 545; xml: 243; lisp: 45; awk: 4
file content (52 lines) | stat: -rw-r--r-- 1,772 bytes parent folder | download | duplicates (9)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52

class BrainInterpreter(object):
    def __init__(self):
        self.table = [0] * 30000
        self.pointer = 0

    def interp_char(self, code, code_pointer, input, output):
        char_code = code[code_pointer]
        if char_code == '>':
            self.pointer += 1
        elif char_code == '<':
            self.pointer -= 1
        elif char_code == '+':
            self.table[self.pointer] += 1
        elif char_code == '-':
            self.table[self.pointer] -= 1
        elif char_code == '.':
            output.write(chr(self.table[self.pointer]))
        elif char_code == ',':
            self.table[self.pointer] = ord(input.read(1))
        elif char_code == '[':
            # find corresponding ]
            if self.table[self.pointer] == 0:
                need = 1
                p = code_pointer + 1
                while need > 0:
                    if code[p] == ']':
                        need -= 1
                    elif code[p] == '[':
                        need += 1
                    p += 1
                return p
        elif char_code == ']':
            if self.table[self.pointer] != 0:
                need = 1
                p = code_pointer - 1
                while need > 0:
                    if code[p] == ']':
                        need += 1
                    elif code[p] == '[':
                        need -= 1
                    p -= 1
                return p + 2
        return code_pointer + 1

    def interpret(self, code, input_string, output_io):
        code_pointer = 0
        while code_pointer < len(code):
            code_pointer = self.interp_char(code, code_pointer,
                input_string, output_io)
            #print code_pointer, self.table[:5]
        return output_io