Просмотр исходного кода

Debugged combine_factors possibilities.

Taddeus Kroes 14 лет назад
Родитель
Сommit
0f57a84a7b
3 измененных файлов с 35 добавлено и 12 удалено
  1. 23 2
      src/possibilities.py
  2. 1 1
      src/rules/__init__.py
  3. 11 9
      src/rules/poly.py

+ 23 - 2
src/possibilities.py

@@ -5,8 +5,29 @@ class Possibility(object):
         self.args = args
 
     def __str__(self):
-        return '<possibility root="%s" handler=%s args=%s>' \
-                % (self.root, self.handler, self.args)
+        return '<Possibility root="%s" handler=%s args=%s>' \
+                % (self.root, self.handler.func_name, self.args)
 
     def __repr__(self):
         return str(self)
+
+    def __eq__(self, other):
+        return self.handler == other.handler \
+               and map(hash, self.args) == map(hash, other.args)
+
+
+def filter_duplicates(items):
+    unique = []
+
+    for item in items:
+        found = False
+
+        for compare in unique:
+            if item == compare:
+                found = True
+                break
+
+        if not found:
+            unique.append(item)
+
+    return unique

+ 1 - 1
src/rules/__init__.py

@@ -1,4 +1,4 @@
-from ..node import ExpressionNode as Node, OP_ADD, OP_MUL
+from ..node import OP_ADD, OP_MUL
 from .poly import match_combine_factors, match_expand
 
 

+ 11 - 9
src/rules/poly.py

@@ -1,7 +1,9 @@
 from itertools import combinations
 
-from ..node import ExpressionLeaf as Leaf, TYPE_OPERATOR, OP_ADD, OP_MUL
+from ..node import ExpressionNode as Node, ExpressionLeaf as Leaf, \
+        TYPE_OPERATOR, OP_ADD, OP_MUL
 from ..possibilities import Possibility as P
+from .utils import nary_node
 
 
 def match_expand(node):
@@ -11,6 +13,7 @@ def match_expand(node):
     assert node.type == TYPE_OPERATOR
     assert node.op & OP_MUL
 
+    return []
     p = []
 
     # 'a' parts
@@ -44,7 +47,8 @@ def expand_single(root, args):
     left, right = args
     scope = root.get_scope_except(right)
 
-    replacement = Node('+', Node('*', left, right[0]), Node('*', left, right[1]))
+    replacement = Node('+', Node('*', left, right[0]), \
+                            Node('*', left, right[1]))
 
     for i, n in enumerate(scope):
         if n == left:
@@ -73,18 +77,16 @@ def match_combine_factors(node):
     orders = []
 
     for n in node.get_scope():
-        if n.type == TYPE_OPERATOR:
+        if not n.is_leaf():
             order = n.get_order()
 
             if order:
                 orders.append(order)
-        else:
-            if n.is_numeric():
-                numerics.append(n)
-            elif n.is_identifier():
-                orders.append((n.value, 1, 1))
+        elif n.is_numeric():
+            numerics.append(n)
+        elif n.is_identifier():
+            orders.append((n.value, 1, 1))
 
-    print 'numerics:', numerics
     if len(numerics) > 1:
         for num0, num1 in combinations(numerics, 2):
             p.append(P(node, combine_numerics, (num0, num1)))