visitor.py 689 B

12345678910111213141516171819202122232425262728293031
  1. class Visitor(object):
  2. def _visit(self, node, prepend, *args):
  3. prepend = prepend + "_"
  4. meth = None
  5. for cls in node.__class__.__mro__:
  6. meth_name = prepend + cls.__name__
  7. meth = getattr(self, meth_name, None)
  8. if meth:
  9. break
  10. if not meth:
  11. meth = self.generic_visit
  12. return meth(node, *args)
  13. def visit(self, node, *args):
  14. self._visit(node, "visit", *args)
  15. def enter(self, node, *args):
  16. self._visit(node, "enter", *args)
  17. def exit(self, node, *args):
  18. self._visit(node, "exit", *args)
  19. def generic_visit(self, node):
  20. #print 'generic_visit '+node.__class__.__name__
  21. pass
  22. class Visitable(object):
  23. def accept(self, visitor):
  24. visitor.visit(self)