2020-04-29 13:42:12 +02:00

97 lines
2.8 KiB
Python

import copy
from typing import Union
import threading
import time
import sys
import numpy as np
import interpreter.imageWrapper as imageWrapper
import interpreter.lexer as lexer
import interpreter.lexerTokens as lexerTokens
import interpreter.movement as movement
import interpreter.programState as programState
import interpreter.runner as runner
def interpret(image: np.ndarray):
graph = lexer.graphImage(im)
position = (0, 0)
pointers = (0, 0)
PS = programState.programState(graph, position, pointers)
runProgram(image, PS)
def runProgram(image: np.ndarray, PS: programState) -> programState:
newState = PS
currentCodel = imageWrapper.getCodel(image, newState.position)
frozencodel = frozenset(currentCodel)
newToken = newState.graph[hash(frozencodel)][hash(newState.pointers)][0]
if isinstance(newToken, lexerTokens.terminateToken):
print("")
print("TERMINATE!")
return newState
newState = takeStep(image, newState)
return runProgram(image, newState)
def takeStep(image: np.ndarray, PS: programState.programState) -> Union[programState.programState, bool]:
newState = copy.deepcopy(PS)
currentCodel = imageWrapper.getCodel(image, newState.position)
frozencodel = frozenset(currentCodel)
newToken = newState.graph[hash(frozencodel)][hash(newState.pointers)][0]
edgePosition = newState.graph[hash(frozencodel)][hash(newState.pointers)][1]
result = runner.executeToken(newToken, newState.pointers, newState.dataStack)
if result is None:
print("TERMINATE")
return False
if isinstance(newToken, lexerTokens.toWhiteToken) or isinstance(newToken, lexerTokens.toColorToken):
newState.position = movement.getNextPosition(edgePosition, newState.pointers[0])
newState.pointers = result[0]
newState.dataStack = result[1]
return newState
class run:
def __init__(self, image: np.ndarray):
self.image = image
def __call__(self):
self.run_program(self.image, programState.programState(lexer.graphImage(self.image), (0,0), (0,0)) )
def run_program(self,image: np.ndarray, PS: programState) -> programState:
currentCodel = imageWrapper.getCodel(image, PS.position)
frozencodel = frozenset(currentCodel)
newToken = PS.graph[hash(frozencodel)][hash(PS.pointers)][0]
if isinstance(newToken, lexerTokens.terminateToken):
print("")
print("TERMINATE!")
return PS
return self.run_program(image, takeStep(image, PS))
if __name__ == "__main__":
im = imageWrapper.getImage("../brainfuck_interpreter_black.png")
interpret(im)
start_time = time.time()
sys.setrecursionlimit(0x100000)
threading.stack_size(256000000) #set stack to 256mb
t = threading.Thread(target=run(im))
t.start()
t.join()