Переглянути джерело

Reduced negation precedence to MINUS.

Taddeus Kroes 14 роки тому
батько
коміт
ea4270ebd4
2 змінених файлів з 10 додано та 4 видалено
  1. 5 1
      line.py
  2. 5 3
      tests/test_line.py

+ 5 - 1
line.py

@@ -142,7 +142,11 @@ def generate_line(root):
 
             if child.negated:
                 # (-a) ^ b
-                if op == '^' and not i:
+                # -a ^ -b
+                # (-a) * b
+                # a * -b
+                # (-a) / b
+                if (node_pred > NEG_PRED and not i):
                     exp = '(' + exp + ')'
             elif child_pred < node_pred:
                 exp = '(' + exp + ')'

+ 5 - 3
tests/test_line.py

@@ -138,8 +138,10 @@ class TestLine(unittest.TestCase):
         mul = N('*', N('*', a, l2), b)
         self.assertEquals(generate_line(mul), 'a * 2b')
 
-        plus = N('*', N('*', -a, b), c)
-        self.assertEquals(generate_line(plus), '-abc')
+        mul = -N('*', N('*', a, b), c)
+        self.assertEquals(generate_line(mul), '-abc')
+        mul = N('*', N('*', -a, b), c)
+        self.assertEquals(generate_line(mul), '(-a)bc')
 
         mul = N('*', a, N('-', b, c))
         self.assertEquals(generate_line(mul), 'a(b - c)')
@@ -173,7 +175,7 @@ class TestLine(unittest.TestCase):
         self.assertEquals(generate_line(plus), '1 - 2')
 
         l1, a, b, c = L(1), L('a'), L('b'), L('c')
-        plus = N('+', l1, N('*', N('*', -a, b), c))
+        plus = N('+', l1, -N('*', N('*', a, b), c))
         self.assertEquals(generate_line(plus), '1 - abc')
 
     def test_helper_functions(self):