Justus Jan Nico Wolff
4bb3864d20
new file: HASHBASE/operators/add.py new file: HASHBASE/operators/divide.py new file: HASHBASE/operators/equal.py new file: HASHBASE/operators/higher.py new file: HASHBASE/operators/lower.py new file: HASHBASE/operators/multiply.py new file: HASHBASE/operators/remainder.py new file: HASHBASE/operators/subtract.py new file: HASHBASE/statements/create.py new file: HASHBASE/statements/getatt.py new file: HASHBASE/statements/if.py new file: HASHBASE/statements/newobj.py new file: HASHBASE/statements/setatt.py modified: PCPL/interpreter.py modified: hashengine.py deleted: langsys/__pycache__/__init__.cpython-311.pyc modified: langsys/lang/de_DE.LAN modified: langsys/lang/en_EN.LAN modified: main.py
106 lines
3.6 KiB
Python
106 lines
3.6 KiB
Python
class interpreter():
|
|
def __init__(self, lexer):
|
|
self.instructions = {}
|
|
self.lexer = lexer
|
|
self.vars = {}
|
|
self.types = {"<": self.INDEXING, "{": self.EXECUTE, "[": self.ATTRIBUTING, "(": self.STATEMENT, ":": self.OPERATION}
|
|
|
|
def resetvars(self):
|
|
self.vars = {}
|
|
|
|
def addinstruction(self, name, instruction):
|
|
self.instructions[name] = instruction
|
|
|
|
def INDEXING(self, target):
|
|
target = target[1:]
|
|
target = target[:-1]
|
|
target = target.split("\,")
|
|
if target[0] in self.instructions:
|
|
return self.instructions[target[0]].IND(target[1])
|
|
elif target[0] in self.vars:
|
|
return self.vars[target[0]].IND(target[1])
|
|
else:
|
|
raise TypeError("Referenced Operation doesnt exist.")
|
|
|
|
def EXECUTE(self, target):
|
|
target = target[1:]
|
|
target = target[:-1]
|
|
target = target.split(",")
|
|
for i in range(len(target)):
|
|
target[i] = target[i].replace(".", ",")
|
|
if target[0] in self.instructions:
|
|
return self.instructions[target[0]].EXEC(target[1:])
|
|
elif target[0] in self.vars:
|
|
return self.vars[target[0]].EXEC(target[1:])
|
|
else:
|
|
raise TypeError("Referenced Operation doesnt exist.")
|
|
|
|
def ATTRIBUTING(self, target):
|
|
target = target[1:]
|
|
target = target[:-1]
|
|
target = target.split(",")
|
|
for i in range(len(target)):
|
|
target[i] = target[i].replace(".", ",")
|
|
if target[0] in self.instructions:
|
|
return self.instructions[target[0]].ATR(target[1])
|
|
elif target[0] in self.vars:
|
|
return self.vars[target[0]].ATR(target[1])
|
|
else:
|
|
raise TypeError("Referenced Operation doesnt exist.")
|
|
|
|
def STATEMENT(self, target):
|
|
target = target[1:]
|
|
target = target[:-1]
|
|
target = target.split(",")
|
|
for i in range(len(target)):
|
|
target[i] = target[i].replace(".", ",")
|
|
if target[0] in self.instructions:
|
|
return self.instructions[target[0]].STAT(target[1:])
|
|
elif target[0] in self.vars:
|
|
return self.vars[target[0]].STAT(target[1:])
|
|
else:
|
|
raise TypeError("Referenced Operation doesnt exist.")
|
|
|
|
def OPERATION(self, target):
|
|
target = target[1:]
|
|
target = target[:-1]
|
|
target = target.split(",")
|
|
for i in range(len(target)):
|
|
target[i] = target[i].replace(".", ",")
|
|
if target[0] in self.instructions:
|
|
return self.instructions[target[0]].OP(target[1], target[2])
|
|
elif target[0] in self.vars:
|
|
return self.vars[target[0]].OP(target[1], target[2])
|
|
else:
|
|
raise TypeError("Referenced Operation doesnt exist.")
|
|
|
|
def EXECINS(self, target):
|
|
back = self.types[target[0]](target)
|
|
if back[0] == 1:
|
|
raise TypeError(f"Error in instruction, HALT! {target}")
|
|
return back
|
|
|
|
def PREPAST(self, target):
|
|
# return codes 0: Normal 1: Error
|
|
# print(f"Error in instruction, HALT! {target}")
|
|
ACM = ""
|
|
for i in range(len(target)):
|
|
index = i
|
|
i = target[i]
|
|
if type(i) == list:
|
|
i = self.PREPAST(i)
|
|
#i = i.replace('"', "")
|
|
if index != len(target)-1:
|
|
if i[0] in self.types:
|
|
back = self.EXECINS(i)
|
|
ACM = ACM + "," + str(back[1])
|
|
else:
|
|
ACM = ACM + i
|
|
else:
|
|
i = i[:-1]+ ACM + i[-1]
|
|
return i
|
|
|
|
|
|
|
|
|