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
from graph_drawing.graph import generate_graph
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 strategy import pick_suggestion
from possibilities import filter_duplicates, apply_suggestion
......@@ -358,14 +358,15 @@ class Parser(BisonParser):
"""
if option == 0: # rule: NEG exp
node = values[1]
# 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:
child = Scope(values[1])[0]
child = Scope(node)[0]
child.negated += 1
return values[1]
return node
if option == 1: # rule: FUNCTION exp
if values[1].is_op(OP_COMMA):
......@@ -393,7 +394,7 @@ class Parser(BisonParser):
node = values[2]
# 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
else:
node = Scope(node)[0]
......
......@@ -111,6 +111,7 @@ def match_add_constant_fractions(node):
def equalize_denominators(root, args):
"""
1 / 2 + 3 / 4 -> 2 / 4 + 3 / 4
1 / 2 - 3 / 4 -> 2 / 4 - 3 / 4
a / 2 + b / 4 -> 2a / 4 + b / 4
"""
scope, denom = args[::3]
......@@ -121,14 +122,11 @@ def equalize_denominators(root, args):
if mult != 1:
if n.is_numeric():
n = L(n.value * mult)
nom = L(n.value * mult)
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()
......
......@@ -38,6 +38,14 @@ class TestParser(unittest.TestCase):
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):
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