Guest User

Untitled

a guest
Sep 17th, 2011
82
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.84 KB | None | 0 0
  1.  
  2. class label:
  3.     def __init__(self, queue, name, id):
  4.         self.name = name
  5.         self.id = id
  6.         queue += [ self, ]
  7.  
  8.     def getString(self, queue, labels):
  9.         return ""
  10.  
  11.     def getPart(self):
  12.         print("ERROR: LABEL cannot be part of a statement")
  13.         return ""
  14.  
  15. class c_call:
  16.     def __init__(self, queue, params, id):
  17.         func = params[1]
  18.         for p in params[2:]: func += p.capitalize()
  19.         self.string = params[0].lower() + "." + func
  20.  
  21.         queue += [ self, ]
  22.  
  23.     def getString(self, queue, labels):
  24.         return self.string + "()"
  25.  
  26.     def getPart(self):
  27.         return self.string
  28.  
  29. class c_drop:
  30.     def __init__(self, queue, params, id):
  31.         f_call = queue.pop()
  32.         if f_call.__class__ != c_call:
  33.             print("ERROR: DROP not after CALL")
  34.             return
  35.  
  36.         par = []
  37.         for i in range(int(params[0])):
  38.             par += [ queue.pop().getPart(), ]
  39.         par = ", ".join(par)
  40.  
  41.         self.string = f_call.string + "(" + par + ")"
  42.  
  43.         queue += [ self, ]
  44.  
  45.     def getString(self, queue, labels):
  46.         return self.string
  47.  
  48.     def getPart(self):
  49.         return self.string
  50.  
  51. class c_push:
  52.     def __init__(self, queue, params, id):
  53.         if params[0] == "variable":
  54.             self.string = "var" + params[1]
  55.         elif params[0] == "returnvalue":
  56.             # We silently assume this always happens at the right moment
  57.             return
  58.         elif str(int(params[0])) != params[0]:
  59.             print("ERROR: PUSH " + params[0] + " not supported")
  60.             return
  61.         else:
  62.             self.string = params[0]
  63.  
  64.         queue += [ self, ]
  65.  
  66.     def getString(self, queue, labels):
  67.         print("ERROR: PUSH must be part of a statement")
  68.         return ""
  69.  
  70.     def getPart(self):
  71.         return self.string
  72.  
  73. class c_jne:
  74.     def __init__(self, queue, params, id):
  75.         self.id = id
  76.         self.string = queue.pop().getPart()
  77.         self.label = params[0]
  78.         queue += [ self, ]
  79.  
  80.     def getString(self, queue, labels):
  81.         if not self.label in labels:
  82.             print("ERROR: invalid label")
  83.             return ""
  84.  
  85.         if self.id < labels[self.label].id:
  86.             ret = "if (" + self.string + "):\n"
  87.  
  88.             lq = None
  89.             q = queue.pop()
  90.             if q == None: return ret + "  pass"
  91.             while q != None:
  92.                 if q.__class__ == label:
  93.                     if q.name == self.label: break
  94.                 for l in q.getString(queue, labels).split("\n"):
  95.                     if l == "": continue
  96.                     ret += "  " + l + "\n"
  97.                 lq = q
  98.                 q = queue.pop()
  99.  
  100.             if lq.__class__ == c_jmp:
  101.                 if self.id >= labels[lq.label].id:
  102.                     # The only thing that is allowed to jump back, are whiles
  103.                     ret = ret.split("\n")
  104.                     ret[0] = ret[0].replace("if ", "while ")
  105.                     ret = "\n".join(ret[:-2])
  106.                 else:
  107.                     # The only thing that is allowed to jump forward, are else
  108.                     ret = ret.split("\n")
  109.                     ret = "\n".join(ret[:-2]) + "\n"
  110.                     ret += "else:\n"
  111.  
  112.                     q = queue.pop()
  113.                     if q == None: return ret + "  pass"
  114.                     while q != None:
  115.                         if q.__class__ == label:
  116.                             if q.name == lq.label: break
  117.                         for l in q.getString(queue, labels).split("\n"):
  118.                             if l == "": continue
  119.                             ret += "  " + l + "\n"
  120.                         q = queue.pop()
  121.                    
  122.  
  123.             return ret.strip()
  124.  
  125.         return "if not (" + self.string + "): goto " + self.label
  126.  
  127.     def getPart(self):
  128.         print("ERROR: JNE cannot be part of a statement")
  129.         return ""
  130.  
  131. class c_pop:
  132.     def __init__(self, queue, params, id):
  133.         if params[0] == "variable":
  134.             self.string = "var" + params[1] + " = " + queue.pop().getPart()
  135.         else:
  136.             print("ERROR: POP " + params[0] + " not support")
  137.             return
  138.  
  139.         queue += [ self, ]
  140.    
  141.     def getString(self, queue, labels):
  142.         return self.string
  143.  
  144.     def getPart(self):
  145.         print("ERROR: POP cannot be part of a statement")
  146.         return ""
  147.  
  148. class c_and:
  149.     def __init__(self, queue, params, id):
  150.         self.string = queue.pop().getPart() + " and " + queue.pop().getPart()
  151.         queue += [ self, ]
  152.  
  153.     def getString(self, queue, labels):
  154.         print("ERROR: AND must be part of a statement")
  155.         return ""
  156.  
  157.     def getPart(self):
  158.         return self.string
  159.  
  160. class c_jmp:
  161.     def __init__(self, queue, params, id):
  162.         self.id = id
  163.         self.label = params[0]
  164.         queue += [ self, ]
  165.    
  166.     def getString(self, queue, labels):
  167.         return "goto " + self.label
  168.  
  169.     def getPart(self):
  170.         print("ERROR: JMP cannot be part of a statement")
  171.         return ""
  172.  
  173. class c_return:
  174.     def __init__(self, queue, params, id):
  175.         self.string = "return"
  176.         queue += [ self, ]
  177.    
  178.     def getString(self, queue, labels):
  179.         return self.string
  180.  
  181.     def getPart(self):
  182.         print("ERROR: RETURN cannot be part of a statement")
  183.         return ""
  184.  
  185.  
  186. f = open("script.emc", "r")
  187.  
  188. lines = f.readlines()
  189.  
  190. labels = {}
  191. queue = []
  192. i = 0
  193. for line in lines:
  194.     i += 1
  195.     line = line.strip().lower()
  196.     if line == "": continue;
  197.  
  198.     if line.find(':') != -1:
  199.         pos = line.find(':')
  200.         labels[line[:pos]] = label(queue, line[:pos], i)
  201.         continue
  202.  
  203.     command = line.split(' ')[0]
  204.     params = line.split(' ')[1:]
  205.  
  206.     globals()["c_" + command](queue, params, i)
  207.  
  208. queue += [ None, ]
  209. queue.reverse()
  210.  
  211. q = queue.pop()
  212. while q != None:
  213.     ret = q.getString(queue, labels)
  214.     if ret != "": print(ret)
  215.     q = queue.pop()
Advertisement
Add Comment
Please, Sign In to add comment