Kaynağa Gözat

Leaf now extends Node, added Node representation fcuntionality.

Sander Mathijs van Veen 14 yıl önce
ebeveyn
işleme
a509de439b
2 değiştirilmiş dosya ile 19 ekleme ve 9 silme
  1. 4 5
      line.py
  2. 15 4
      node.py

+ 4 - 5
line.py

@@ -1,12 +1,11 @@
-from node import Node
+from node import Leaf
 
 def generate_line(root):
     """
     Print an expression tree in a single text line. Where needed, add
     parentheses.
 
-    >>> from node import Leaf
-
+    >>> from node import Node, Leaf
     >>> l0, l1 = Leaf(1), Leaf(2)
     >>> plus = Node('+', l0, l1)
     >>> print generate_line(plus)
@@ -51,7 +50,7 @@ def generate_line(root):
         """
         Get the associativity of an operator node.
         """
-        if isinstance(node, Node) and len(node) > 1:
+        if not isinstance(node, Leaf) and len(node) > 1:
             op = node.title()
 
             for i, group in enumerate(operators):
@@ -68,7 +67,7 @@ def generate_line(root):
         """
         s = node.title()
 
-        if not isinstance(node, Node):
+        if isinstance(node, Leaf):
             return s
 
         arity = len(node)

+ 15 - 4
node.py

@@ -21,20 +21,31 @@ class Node(object):
     def __len__(self):
         return len(self.nodes)
 
+    def __eq__(self, node):
+        return isinstance(node, Node) \
+               and self.value == node.value and self.nodes == node.nodes
+
+    #def __repr__(self):
+    #    return repr(self.value)
+
+    def __str__(self):
+        return '<Node value=%s nodes=%s>' % (str(self.value), str(self.nodes))
+
     def title(self):
         return str(self.value)
 
 
-class Leaf(object):
+class Leaf(Node):
     def __init__(self, value):
         self.value = value
         self.parent = None
+        self.nodes = None
+
+    def __len__(self):
+        return len(str(self.value))
 
     def __repr__(self):
         return repr(self.value)
 
     def __str__(self):
         return str(self.value)
-
-    def title(self):
-        return str(self.value)