Created
April 14, 2018 17:46
-
-
Save stillwwater/d603f6a0059e1ab5b50703762a58b7f2 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import sys | |
import itertools | |
class Smol: | |
def __init__(self, tapesize=1): | |
self.env = { | |
'+': lambda: self.incdec(1, 0), | |
'-': lambda: self.incdec(-1, 0), | |
'>': lambda: self.incdec(0, 1), | |
'<': lambda: self.incdec(0, -1), | |
'.': lambda: print(self.tape[self.pointer], end=' '), | |
';': lambda: print(chr(self.tape[self.pointer]), end=''), | |
',': lambda: self.incdec(int(input('\n%d? ' % self.pointer)) - self.tape[self.pointer], 0), | |
'[': lambda: self.loop(True), | |
']': lambda: self.loop(False) | |
} | |
self.tape = [0 for x in range(tapesize)] | |
self.jmp_stack = [] # remembers positions on tape | |
self.pointer = 0 | |
self.pc = 0 | |
def run(self, program): | |
while self.pc < len(program): | |
self.env[program[self.pc]]() | |
self.pc += 1 | |
def incdec(self, tape_inc, pointer_inc): | |
self.pointer += pointer_inc | |
if self.pointer >= len(self.tape): self.tape.append(0) | |
self.tape[self.pointer] += tape_inc | |
if self.tape[self.pointer] < 0: self.tape[self.pointer] = 0 | |
def loop(self, open): | |
if open: self.jmp_stack.append(self.pc) # save tape position | |
elif self.tape[self.pointer] == 0: self.jmp_stack.pop() # forget saved position | |
else: self.pc = self.jmp_stack[-1] # jmp to saved position at the top | |
def __str__(self): | |
return str(self.tape) | |
smol = Smol() | |
print('\n--smol interpreter--\n\nvalid instructions: {}\n'.format([k for k in smol.env])) | |
smol.run([c for c in list(itertools.chain.from_iterable(open(sys.argv[1], 'rU'))) if c in smol.env]) | |
print(smol) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment