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

Merge branch 'master' of kompiler.org:trs

Sander Mathijs van Veen 14 лет назад
Родитель
Сommit
90549d2648
3 измененных файлов с 27 добавлено и 17 удалено
  1. 8 12
      src/possibilities.py
  2. 19 3
      tests/test_possibilities.py
  3. 0 2
      tests/test_rules_poly.py

+ 8 - 12
src/possibilities.py

@@ -28,30 +28,26 @@ class Possibility(object):
                and self.args == other.args
                and self.args == other.args
 
 
 
 
-def filter_duplicates(items):
+def filter_duplicates(possibilities):
     """
     """
     Filter duplicated possibilities. Duplicated possibilities occur in n-ary
     Filter duplicated possibilities. Duplicated possibilities occur in n-ary
     nodes, the root-level node and a lower-level node will both recognize a
     nodes, the root-level node and a lower-level node will both recognize a
-    reqrite possibility within their sscope, whereas only the root-level one
+    rewrite possibility within their sscope, whereas only the root-level one
     matters.
     matters.
 
 
     Example: 1 + 2 + 3
     Example: 1 + 2 + 3
     The addition of 1 and 2 is recognized bij n-ary additions "1 + 2" and
     The addition of 1 and 2 is recognized bij n-ary additions "1 + 2" and
     "1 + 2 + 3". The "1 + 2" addition should be removed by this function.
     "1 + 2 + 3". The "1 + 2" addition should be removed by this function.
     """
     """
-    # TODO: Finish according to docstrings
+    features = []
     unique = []
     unique = []
 
 
-    for item in items:
-        found = False
+    for p in reversed(possibilities):
+        feature = (p.handler, p.args)
 
 
-        for compare in unique:
-            if item == compare:
-                found = True
-                break
-
-        if not found:
-            unique.append(item)
+        if feature not in features:
+            features.append(feature)
+            unique.insert(0, p)
 
 
     return unique
     return unique
 
 

+ 19 - 3
tests/test_possibilities.py

@@ -1,6 +1,7 @@
 import unittest
 import unittest
 
 
 from src.possibilities import MESSAGES, Possibility as P, filter_duplicates
 from src.possibilities import MESSAGES, Possibility as P, filter_duplicates
+from src.rules.numerics import add_numerics
 from tests.test_rules_poly import tree
 from tests.test_rules_poly import tree
 
 
 
 
@@ -36,7 +37,22 @@ class TestPossibilities(unittest.TestCase):
         assert self.p0 != self.p1
         assert self.p0 != self.p1
 
 
     def test_filter_duplicates(self):
     def test_filter_duplicates(self):
+        a, b = ab = tree('a + b')
+        p0 = P(a, dummy_handler, (1, 2))
+        p1 = P(ab, dummy_handler, (1, 2))
+        p2 = P(ab, dummy_handler, (1, 2, 3))
+        p3 = P(ab, dummy_handler_msg, (1, 2))
+
         self.assertEqual(filter_duplicates([]), [])
         self.assertEqual(filter_duplicates([]), [])
-        self.assertEqual(filter_duplicates([1, 2]), [1, 2])
-        self.assertEqual(filter_duplicates([1, 2, 2]), [1, 2])
-        self.assertEqual(filter_duplicates([1, 2, 3, 2]), [1, 2, 3])
+        self.assertEqual(filter_duplicates([p0, p1]), [p1])
+        self.assertEqual(filter_duplicates([p1, p2]), [p1, p2])
+        self.assertEqual(filter_duplicates([p1, p3]), [p1, p3])
+        self.assertEqual(filter_duplicates([p0, p1, p2, p3]), [p1, p2, p3])
+
+        # Docstrings example
+        (l1, l2), l3 = left, l3 = right = tree('1 + 2 + 3')
+        p0 = P(left, add_numerics, (1, 2, 1, 2))
+        p1 = P(right, add_numerics, (1, 2, 1, 2))
+        p2 = P(right, add_numerics, (1, 3, 1, 3))
+        p3 = P(right, add_numerics, (2, 3, 2, 3))
+        self.assertEqual(filter_duplicates([p0, p1, p2, p3]), [p1, p2, p3])

+ 0 - 2
tests/test_rules_poly.py

@@ -25,8 +25,6 @@ class TestRulesPoly(RulesTestCase):
                 [P(root, combine_polynomes, (a1, a2, 1, 2, 'a', 1))])
                 [P(root, combine_polynomes, (a1, a2, 1, 2, 'a', 1))])
 
 
     def test_identifiers_reverse(self):
     def test_identifiers_reverse(self):
-        return
-        # TODO: Move to normalisation test
         a1, a2 = root = tree('a+a*2')
         a1, a2 = root = tree('a+a*2')
         possibilities = match_combine_polynomes(root)
         possibilities = match_combine_polynomes(root)
         self.assertEqualPos(possibilities,
         self.assertEqualPos(possibilities,