Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ## imports ##
- import sys, msvcrt, os
- ## variables ##
- file = open(sys.argv[1], "r")
- loadstring = file.read()
- memory = []
- lexed_loadstring = []
- label_set = {}
- index = 0
- last_index = 0
- compare_flag = []
- compare = {"equal": 1, "greater": 2, "less": 3, "none": 0}
- enums = {"condition": compare}
- ## functions ##
- def evaluate(expression):
- if (expression == "true"): return 1
- elif (expression == "false"): return 0
- elif (expression[0] == "$"): return memory[int(expression[1:])]
- elif (expression[0] == "%"): return ord(expression[1])
- elif ("." in expression): return enums[expression.split(".")[0]][expression.split(".")[1]]
- return int(expression)
- ## lexer ##
- while (len(loadstring) > index):
- if (loadstring[index] in """<>!#&/()='"+*,{}~|@QWERTYUIOPASDFGHJKLZXCVBNM%-$?.[^]_`0123456789qwertyuiopasdfghjklzxcvbnm"""):
- temporary_string = ""
- try:
- while (loadstring[index] in """<>!#&/()='"+*,{}~|@QWERTYUIOPASDFGHJKLZXCVBNM%-$?.[^]_`0123456789qwertyuiopasdfghjklzxcvbnm"""):
- temporary_string += loadstring[index]
- index += 1
- except: ...
- lexed_loadstring.append(temporary_string)
- elif (loadstring[index] == ";"):
- try:
- while (loadstring[index] != "\n"):
- index += 1
- except: ...
- elif (loadstring[index] == ":"):
- try:
- index += 1
- while (loadstring[index] != ":"):
- index += 1
- except: ...
- index += 1
- index = 0
- loadstring = lexed_loadstring
- ## labels ##
- while (len(loadstring) > index):
- if (loadstring[index] == "initialize"):
- index += 1
- length = evaluate(loadstring[index])
- for i in range(length): memory.append(0)
- elif (loadstring[index] == "label"):
- index += 1
- name = evaluate(loadstring[index])
- label_set.update({name:index})
- index += 1
- index = 0
- ## interpreter ##
- while (len(loadstring) > index):
- if (loadstring[index] == "print"):
- index += 1
- isAscii = evaluate(loadstring[index])
- index += 1
- value = evaluate(loadstring[index]) if isAscii == 0 else chr(evaluate(loadstring[index]))
- print(value, end = "")
- elif (loadstring[index] == "getch"):
- index += 1
- isAscii = evaluate(loadstring[index])
- index += 1
- memory_index = evaluate(loadstring[index])
- value = int(msvcrt.getch()) if isAscii == 0 else ord(msvcrt.getch())
- memory[memory_index] = value
- elif (loadstring[index] == "getche"):
- index += 1
- isAscii = evaluate(loadstring[index])
- index += 1
- memory_index = evaluate(loadstring[index])
- value = int(msvcrt.getche()) if isAscii == 0 else ord(msvcrt.getche())
- memory[memory_index] = value
- elif (loadstring[index] == "push"):
- index += 1
- value = evaluate(loadstring[index])
- index += 1
- memory_index = evaluate(loadstring[index])
- memory[memory_index] = value
- elif (loadstring[index] == "add"):
- index += 1
- value0 = evaluate(loadstring[index])
- index += 1
- value1 = evaluate(loadstring[index])
- index += 1
- memory_index = evaluate(loadstring[index])
- memory[memory_index] = value0 + value1
- elif (loadstring[index] == "sub"):
- index += 1
- value0 = evaluate(loadstring[index])
- index += 1
- value1 = evaluate(loadstring[index])
- index += 1
- memory_index = evaluate(loadstring[index])
- memory[memory_index] = value0 - value1
- elif (loadstring[index] == "multiply"):
- index += 1
- value0 = evaluate(loadstring[index])
- index += 1
- value1 = evaluate(loadstring[index])
- index += 1
- memory_index = evaluate(loadstring[index])
- memory[memory_index] = value0 * value1
- elif (loadstring[index] == "divide"):
- index += 1
- value0 = evaluate(loadstring[index])
- index += 1
- value1 = evaluate(loadstring[index])
- index += 1
- memory_index = evaluate(loadstring[index])
- memory[memory_index] = value0 / value1
- elif (loadstring[index] == "mod"):
- index += 1
- value0 = evaluate(loadstring[index])
- index += 1
- value1 = evaluate(loadstring[index])
- index += 1
- memory_index = evaluate(loadstring[index])
- memory[memory_index] = value0 % value1
- elif (loadstring[index] == "compare"):
- index += 1
- value0 = evaluate(loadstring[index])
- index += 1
- value1 = evaluate(loadstring[index])
- compare_flag = [value0, value1]
- elif (loadstring[index] == "stop"):
- index += 1
- code = evaluate(loadstring[index])
- if (code != 0):
- print()
- os.system("pause")
- break
- elif (loadstring[index] == "jump"):
- index += 1
- comparison = evaluate(loadstring[index])
- index += 1
- label = label_set[evaluate(loadstring[index])]
- last_index = index
- if (comparison == 0):
- index = label
- elif (comparison == 1):
- if (compare_flag[0] == compare_flag[1]): index = label
- elif (comparison == 2):
- if (compare_flag[0] > compare_flag[1]): index = label
- else:
- if (compare_flag[0] < compare_flag[1]): index = label
- continue
- elif (loadstring[index] == "return"):
- index = last_index
- continue
- index += 1
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement