Commit 60155fdc authored by Taddeus Kroes's avatar Taddeus Kroes

Moved division negation to nominator.

parent dd369030
...@@ -15,7 +15,7 @@ from pybison import BisonParser, BisonSyntaxError ...@@ -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): ...@@ -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: if node.is_leaf or (node.op != OP_MUL and node.op != OP_DIV):
values[1].negated += 1 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): ...@@ -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]
......
...@@ -111,6 +111,7 @@ def match_add_constant_fractions(node): ...@@ -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): ...@@ -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(nom / L(d.value * mult), n.negated))
scope.replace(fraction, negate(n / L(d.value * mult),
fraction.negated))
return scope.as_nary_node() return scope.as_nary_node()
......
...@@ -38,6 +38,14 @@ class TestParser(unittest.TestCase): ...@@ -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')
......
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