Commit 15abdd61 authored by Taddeus Kroes's avatar Taddeus Kroes

Parentheses are now only added to sub-expressions when nescesary.

parent 84d65757
...@@ -82,11 +82,21 @@ def generate_line(root): ...@@ -82,11 +82,21 @@ def generate_line(root):
if is_operator(node): if is_operator(node):
if arity == 1: if arity == 1:
# Unary operator # Unary operator
sub_exp = traverse(node[0]) sub = node[0]
sub_exp = traverse(sub)
if ' ' in sub_exp:
# Negated sub-expressions with spaces in them should be # Negated sub-expressions with spaces in them should be
# enclosed in parentheses # enclosed in parentheses, unless they have a higher precedence
# than subtraction are rewritten to a factor of a subtraction:
# -(1 + 2)
# -(1 - 2)
# -4a
# -(4 * 5)
# 1 - 4 * 5
# 1 + -(4 * 5) -> 1 - 4 * 5
if ' ' in sub_exp and not (not isinstance(sub, Leaf) \
and hasattr(node, 'marked_negation')
and pred(sub) > 0):
sub_exp = '(' + sub_exp + ')' sub_exp = '(' + sub_exp + ')'
result = op + sub_exp result = op + sub_exp
...@@ -97,6 +107,13 @@ def generate_line(root): ...@@ -97,6 +107,13 @@ def generate_line(root):
sep = ' ' + op + ' ' sep = ' ' + op + ' '
e = [] e = []
# Mark added and subtracted negations for later use when adding
# parentheses
if op in ('+', '-'):
for child in node:
if child.title() == '-' and len(child) == 1:
child.marked_negation = True
for i, child in enumerate(node): for i, child in enumerate(node):
exp = traverse(child) exp = traverse(child)
......
...@@ -154,12 +154,27 @@ class TestLine(unittest.TestCase): ...@@ -154,12 +154,27 @@ class TestLine(unittest.TestCase):
self.assertFalse(is_int(neg_a)) self.assertFalse(is_int(neg_a))
self.assertFalse(is_int(plus)) self.assertFalse(is_int(plus))
def test_negated_nary(self): def test_negated_addition_subtraction(self):
neg = N('-', N('+', L(1), L(2))) neg = N('-', N('+', L(1), L(2)))
self.assertEquals(generate_line(neg), '-(1 + 2)') self.assertEquals(generate_line(neg), '-(1 + 2)')
neg = N('-', N('-', L(1), L(2)))
self.assertEquals(generate_line(neg), '-(1 - 2)')
neg = N('+', L(1), N('-', N('+', L(1), L(2))))
self.assertEquals(generate_line(neg), '1 - (1 + 2)')
neg = N('-', N('*', L(4), L('a'))) neg = N('-', N('*', L(4), L('a')))
self.assertEquals(generate_line(neg), '-4a') self.assertEquals(generate_line(neg), '-4a')
neg = N('-', N('*', L(4), L(5)))
self.assertEquals(generate_line(neg), '-(4 * 5)')
plus = N('+', L(1), N('-', N('*', L(4), L(5))))
self.assertEquals(generate_line(plus), '1 - 4 * 5')
plus = N('+', L(1), N('-', L(4)))
self.assertEquals(generate_line(plus), '1 - 4')
neg = N('-', N('-', L(1))) neg = N('-', N('-', L(1)))
self.assertEquals(generate_line(neg), '--1') self.assertEquals(generate_line(neg), '--1')
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