Advertisement
Guest User

??? Interpreter

a guest
Jan 19th, 2021
93
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.78 KB | None | 0 0
  1. ## imports ##
  2. import sys, msvcrt, os
  3.  
  4. ## variables ##
  5. file = open(sys.argv[1], "r")
  6. loadstring = file.read()
  7. memory = []
  8. lexed_loadstring = []
  9. label_set = {}
  10. index = 0
  11. last_index = 0
  12. compare_flag = []
  13. compare = {"equal": 1, "greater": 2, "less": 3, "none": 0}
  14. enums = {"condition": compare}
  15.  
  16. ## functions ##
  17. def evaluate(expression):
  18.     if (expression == "true"): return 1
  19.     elif (expression == "false"): return 0
  20.     elif (expression[0] == "$"): return memory[int(expression[1:])]
  21.     elif (expression[0] == "%"): return ord(expression[1])
  22.     elif ("." in expression): return enums[expression.split(".")[0]][expression.split(".")[1]]
  23.  
  24.     return int(expression)
  25.  
  26. ## lexer ##
  27. while (len(loadstring) > index):
  28.     if (loadstring[index] in """<>!#&/()='"+*,{}~|@QWERTYUIOPASDFGHJKLZXCVBNM%-$?.[^]_`0123456789qwertyuiopasdfghjklzxcvbnm"""):
  29.         temporary_string = ""
  30.         try:
  31.             while (loadstring[index] in """<>!#&/()='"+*,{}~|@QWERTYUIOPASDFGHJKLZXCVBNM%-$?.[^]_`0123456789qwertyuiopasdfghjklzxcvbnm"""):
  32.                 temporary_string += loadstring[index]
  33.                 index += 1
  34.         except: ...
  35.         lexed_loadstring.append(temporary_string)
  36.     elif (loadstring[index] == ";"):
  37.         try:
  38.             while (loadstring[index] != "\n"):
  39.                 index += 1
  40.         except: ...
  41.     elif (loadstring[index] == ":"):
  42.         try:
  43.             index += 1
  44.             while (loadstring[index] != ":"):
  45.                 index += 1
  46.         except: ...
  47.     index += 1
  48. index = 0
  49. loadstring = lexed_loadstring
  50.  
  51. ## labels ##
  52. while (len(loadstring) > index):
  53.     if (loadstring[index] == "initialize"):
  54.         index += 1
  55.         length = evaluate(loadstring[index])
  56.         for i in range(length): memory.append(0)
  57.     elif (loadstring[index] == "label"):
  58.         index += 1
  59.         name = evaluate(loadstring[index])
  60.         label_set.update({name:index})
  61.     index += 1
  62. index = 0
  63.  
  64. ## interpreter ##
  65. while (len(loadstring) > index):
  66.     if (loadstring[index] == "print"):
  67.         index += 1
  68.         isAscii = evaluate(loadstring[index])
  69.         index += 1
  70.         value = evaluate(loadstring[index]) if isAscii == 0 else chr(evaluate(loadstring[index]))
  71.         print(value, end = "")
  72.     elif (loadstring[index] == "getch"):
  73.         index += 1
  74.         isAscii = evaluate(loadstring[index])
  75.         index += 1
  76.         memory_index = evaluate(loadstring[index])
  77.         value = int(msvcrt.getch()) if isAscii == 0 else ord(msvcrt.getch())
  78.         memory[memory_index] = value
  79.     elif (loadstring[index] == "getche"):
  80.         index += 1
  81.         isAscii = evaluate(loadstring[index])
  82.         index += 1
  83.         memory_index = evaluate(loadstring[index])
  84.         value = int(msvcrt.getche()) if isAscii == 0 else ord(msvcrt.getche())
  85.         memory[memory_index] = value
  86.     elif (loadstring[index] == "push"):
  87.         index += 1
  88.         value = evaluate(loadstring[index])
  89.         index += 1
  90.         memory_index = evaluate(loadstring[index])
  91.         memory[memory_index] = value
  92.     elif (loadstring[index] == "add"):
  93.         index += 1
  94.         value0 = evaluate(loadstring[index])
  95.         index += 1
  96.         value1 = evaluate(loadstring[index])
  97.         index += 1
  98.         memory_index = evaluate(loadstring[index])
  99.         memory[memory_index] = value0 + value1
  100.     elif (loadstring[index] == "sub"):
  101.         index += 1
  102.         value0 = evaluate(loadstring[index])
  103.         index += 1
  104.         value1 = evaluate(loadstring[index])
  105.         index += 1
  106.         memory_index = evaluate(loadstring[index])
  107.         memory[memory_index] = value0 - value1
  108.     elif (loadstring[index] == "multiply"):
  109.         index += 1
  110.         value0 = evaluate(loadstring[index])
  111.         index += 1
  112.         value1 = evaluate(loadstring[index])
  113.         index += 1
  114.         memory_index = evaluate(loadstring[index])
  115.         memory[memory_index] = value0 * value1
  116.     elif (loadstring[index] == "divide"):
  117.         index += 1
  118.         value0 = evaluate(loadstring[index])
  119.         index += 1
  120.         value1 = evaluate(loadstring[index])
  121.         index += 1
  122.         memory_index = evaluate(loadstring[index])
  123.         memory[memory_index] = value0 / value1
  124.     elif (loadstring[index] == "mod"):
  125.         index += 1
  126.         value0 = evaluate(loadstring[index])
  127.         index += 1
  128.         value1 = evaluate(loadstring[index])
  129.         index += 1
  130.         memory_index = evaluate(loadstring[index])
  131.         memory[memory_index] = value0 % value1
  132.     elif (loadstring[index] == "compare"):
  133.         index += 1
  134.         value0 = evaluate(loadstring[index])
  135.         index += 1
  136.         value1 = evaluate(loadstring[index])
  137.         compare_flag = [value0, value1]
  138.     elif (loadstring[index] == "stop"):
  139.         index += 1
  140.         code = evaluate(loadstring[index])
  141.         if (code != 0):
  142.             print()
  143.             os.system("pause")
  144.         break
  145.     elif (loadstring[index] == "jump"):
  146.         index += 1
  147.         comparison = evaluate(loadstring[index])
  148.         index += 1
  149.         label = label_set[evaluate(loadstring[index])]
  150.         last_index = index
  151.  
  152.         if (comparison == 0):
  153.             index = label
  154.         elif (comparison == 1):
  155.             if (compare_flag[0] == compare_flag[1]): index = label
  156.         elif (comparison == 2):
  157.             if (compare_flag[0] > compare_flag[1]): index = label
  158.         else:
  159.             if (compare_flag[0] < compare_flag[1]): index = label
  160.         continue
  161.     elif (loadstring[index] == "return"):
  162.         index = last_index
  163.         continue
  164.  
  165.     index += 1
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement