bootstrap_visitor.py 2.4 KB

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