bootstrap_visitor.py 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. import string
  2. from primitives_visitor import PrimitivesVisitor
  3. class BootstrapVisitor(PrimitivesVisitor):
  4. def __init__(self, args):
  5. PrimitivesVisitor.__init__(self, args)
  6. def dump(self):
  7. call = self.value("call")
  8. access = self.value("access")
  9. resolve = self.value("resolve")
  10. main = self.value('"__main"')
  11. self.dict(resolve, "var", main)
  12. self.dict(access, "var", resolve)
  13. self.dict(call, "func", access)
  14. self.dict(self.last_instruction, "next", call)
  15. output = []
  16. for t, data in self.output:
  17. if t == "N":
  18. output.append("Node auto_%s()\n" % data)
  19. elif t == "V":
  20. name, value = data
  21. name = name if self.first != name else "initial_IP"
  22. output.append("Node auto_%s(%s)\n" % (name, value))
  23. elif t == "D":
  24. source, value, target = data
  25. source = source if self.first != source else "auto_initial_IP"
  26. target = target if self.first != target else "auto_initial_IP"
  27. source = "auto_%s" % source if isinstance(source, int) else source
  28. target = "auto_%s" % target if isinstance(target, int) else target
  29. # output.append("D %s,%s,%s\n" % (source, value, target))
  30. linkname = "%s_%s_%s" % (source, abs(hash(value)), target)
  31. output.append("Edge _%s_0(%s, %s)\n" % (linkname, source, target))
  32. output.append("Node _%s_2(%s)\n" % (linkname, value))
  33. output.append("Edge _%s_1(_%s_0, _%s_2)\n" % (linkname, linkname, linkname))
  34. elif t == "E":
  35. name, source, target = data
  36. source = source if self.first != source else "auto_initial_IP"
  37. target = target if self.first != target else "auto_initial_IP"
  38. name = "auto_%s" % name if isinstance(name, int) else name
  39. source = "auto_%s" % source if isinstance(source, int) else source
  40. target = "auto_%s" % target if isinstance(target, int) else target
  41. output.append("Edge _%s(_%s, _%s)\n" % (name, source, target))
  42. return ''.join(output)