Commit 90549d26 authored by Sander Mathijs van Veen's avatar Sander Mathijs van Veen

Merge branch 'master' of kompiler.org:trs

parents 0c9c2995 1257c37a
......@@ -28,30 +28,26 @@ class Possibility(object):
and self.args == other.args
def filter_duplicates(items):
def filter_duplicates(possibilities):
"""
Filter duplicated possibilities. Duplicated possibilities occur in n-ary
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.
Example: 1 + 2 + 3
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.
"""
# TODO: Finish according to docstrings
features = []
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
......
import unittest
from src.possibilities import MESSAGES, Possibility as P, filter_duplicates
from src.rules.numerics import add_numerics
from tests.test_rules_poly import tree
......@@ -36,7 +37,22 @@ class TestPossibilities(unittest.TestCase):
assert self.p0 != self.p1
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([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])
......@@ -25,8 +25,6 @@ class TestRulesPoly(RulesTestCase):
[P(root, combine_polynomes, (a1, a2, 1, 2, 'a', 1))])
def test_identifiers_reverse(self):
return
# TODO: Move to normalisation test
a1, a2 = root = tree('a+a*2')
possibilities = match_combine_polynomes(root)
self.assertEqualPos(possibilities,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment