Guest User

Untitled

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