Sfoglia il codice sorgente

Moved division negation to nominator.

Taddeus Kroes 14 anni fa
parent
commit
60155fdc94
3 ha cambiato i file con 19 aggiunte e 12 eliminazioni
  1. 7 6
      src/parser.py
  2. 4 6
      src/rules/fractions.py
  3. 8 0
      tests/test_parser.py

+ 7 - 6
src/parser.py

@@ -15,7 +15,7 @@ from pybison import BisonParser, BisonSyntaxError
 from graph_drawing.graph import generate_graph
 from graph_drawing.graph import generate_graph
 
 
 from node import ExpressionNode as Node, ExpressionLeaf as Leaf, OP_MAP, \
 from node import ExpressionNode as Node, ExpressionLeaf as Leaf, OP_MAP, \
-        TOKEN_MAP, TYPE_OPERATOR, OP_COMMA, OP_NEG, OP_MUL, Scope, PI
+        TOKEN_MAP, TYPE_OPERATOR, OP_COMMA, OP_NEG, OP_MUL, OP_DIV, Scope, PI
 from rules import RULES
 from rules import RULES
 from strategy import pick_suggestion
 from strategy import pick_suggestion
 from possibilities import filter_duplicates, apply_suggestion
 from possibilities import filter_duplicates, apply_suggestion
@@ -358,14 +358,15 @@ class Parser(BisonParser):
         """
         """
 
 
         if option == 0:  # rule: NEG exp
         if option == 0:  # rule: NEG exp
+            node = values[1]
             # Add negation to the left-most child
             # Add negation to the left-most child
-            if values[1].is_leaf or values[1].op != OP_MUL:
-                values[1].negated += 1
+            if node.is_leaf or (node.op != OP_MUL and node.op != OP_DIV):
+                node.negated += 1
             else:
             else:
-                child = Scope(values[1])[0]
+                child = Scope(node)[0]
                 child.negated += 1
                 child.negated += 1
 
 
-            return values[1]
+            return node
 
 
         if option == 1:  # rule: FUNCTION exp
         if option == 1:  # rule: FUNCTION exp
             if values[1].is_op(OP_COMMA):
             if values[1].is_op(OP_COMMA):
@@ -393,7 +394,7 @@ class Parser(BisonParser):
             node = values[2]
             node = values[2]
 
 
             # Add negation to the left-most child
             # Add negation to the left-most child
-            if node.is_leaf or node.op != OP_MUL:
+            if node.is_leaf or (node.op != OP_MUL and node.op != OP_DIV):
                 node.negated += 1
                 node.negated += 1
             else:
             else:
                 node = Scope(node)[0]
                 node = Scope(node)[0]

+ 4 - 6
src/rules/fractions.py

@@ -111,6 +111,7 @@ def match_add_constant_fractions(node):
 def equalize_denominators(root, args):
 def equalize_denominators(root, args):
     """
     """
     1 / 2 + 3 / 4  ->  2 / 4 + 3 / 4
     1 / 2 + 3 / 4  ->  2 / 4 + 3 / 4
+    1 / 2 - 3 / 4  ->  2 / 4 - 3 / 4
     a / 2 + b / 4  ->  2a / 4 + b / 4
     a / 2 + b / 4  ->  2a / 4 + b / 4
     """
     """
     scope, denom = args[::3]
     scope, denom = args[::3]
@@ -121,14 +122,11 @@ def equalize_denominators(root, args):
 
 
         if mult != 1:
         if mult != 1:
             if n.is_numeric():
             if n.is_numeric():
-                n = L(n.value * mult)
+                nom = L(n.value * mult)
             else:
             else:
-                n = L(mult) * n
+                nom = L(mult) * n
 
 
-            #n = L(n.value * mult) if n.is_numeric() else L(mult) * n
-
-            scope.replace(fraction, negate(n / L(d.value * mult),
-                                           fraction.negated))
+            scope.replace(fraction, negate(nom / L(d.value * mult), n.negated))
 
 
     return scope.as_nary_node()
     return scope.as_nary_node()
 
 

+ 8 - 0
tests/test_parser.py

@@ -38,6 +38,14 @@ class TestParser(unittest.TestCase):
 
 
         self.assertNotEqual(possibilities1, possibilities2)
         self.assertNotEqual(possibilities1, possibilities2)
 
 
+    def test_moved_negation(self):
+        a, b = tree('a,b')
+
+        self.assertEqual(tree('-ab'), (-a) * b)
+        self.assertEqual(tree('-(ab)'), (-a) * b)
+        self.assertEqual(tree('-a / b'), (-a) / b)
+        self.assertEqual(tree('-(a / b)'), (-a) / b)
+
     def test_functions(self):
     def test_functions(self):
         root, x = tree('sin x, x')
         root, x = tree('sin x, x')