bootstrap_visitor.py 2.6 KB

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