node.py 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. # vim: set fileencoding=utf-8 :
  2. from copy import deepcopy
  3. class Node(object):
  4. def __init__(self, value, *nodes, **kwargs):
  5. super(Node, self).__init__()
  6. self.value, self.nodes = value, list(nodes)
  7. self.is_leaf = False
  8. self.no_spacing = kwargs.get('no_spacing', False)
  9. self.negated = kwargs.get('negated', 0)
  10. def __getitem__(self, n):
  11. return self.nodes[n]
  12. def __setitem__(self, n, node):
  13. self.nodes[n] = node
  14. def __iter__(self):
  15. return iter(self.nodes)
  16. def __len__(self):
  17. return len(self.nodes)
  18. def __eq__(self, node):
  19. return isinstance(node, Node) and self.value == node.value \
  20. and self.nodes == node.nodes
  21. def __neg__(self):
  22. copied = self.clone()
  23. copied.negated += 1
  24. return copied
  25. def __pos__(self):
  26. copied = self.clone()
  27. copied.negated = max(copied.negated - 1, 0)
  28. return copied
  29. def __str__(self):
  30. return '<Node value=%s nodes=%s negated=%d>' \
  31. % (str(self.value), str(self.nodes), self.negated)
  32. def __repr__(self):
  33. return self.__str__()
  34. def title(self):
  35. return str(self.value)
  36. def operator(self):
  37. return self.value
  38. def clone(self):
  39. return deepcopy(self)
  40. def arity(self):
  41. return len(self)
  42. def is_postfix(self):
  43. return self.value == '\''
  44. def is_negation(self):
  45. return self.value == '-' and len(self) == 1
  46. def custom_line(self):
  47. pass
  48. def preprocess_str_exp(self):
  49. pass
  50. def postprocess_str(self, string):
  51. return string
  52. class Leaf(Node):
  53. def __init__(self, value, **kwargs):
  54. super(Leaf, self).__init__(value, **kwargs)
  55. if type(value) in (int, float) and value < 0:
  56. self.value = abs(value)
  57. self.negated += 1
  58. self.nodes = None
  59. self.is_leaf = True
  60. def __len__(self):
  61. return len(str(self.value))
  62. def __str__(self):
  63. return '-' * self.negated + str(self.value)
  64. def __repr__(self):
  65. return '<Leaf %s>' % repr(str(self))