from support.expr_types import *
from decimal import Decimal
def expr_to_string(expr, use_parens=True, use_spaces=True):
from support.canonicalize import simplify
expr = simplify(expr)
if expr is None:
return "?"
if isinstance(expr, Number) or isinstance(expr, Variable):
if (isinstance(expr, float) or isinstance(expr, Decimal)) and float(expr).is_integer():
return str(int(float((expr))))
if isinstance(expr, Decimal):
return str(float(expr))
return str(expr)
elif isinstance(expr, SumOperation):
return("(" if use_parens else "") + " + ".join([expr_to_string(x, use_parens=False, use_spaces=False) for x in expr.values]) + (")" if use_parens else "")
elif isinstance(expr, ProductOperation):
return " * ".join([expr_to_string(x) for x in expr.values])
# Commutative binary operations...
elif isinstance(expr, BinaryOperation):
use_parens = True
return ("(" if use_parens else "") + expr_to_string(expr.left) + (" " if use_spaces else "") + expr.op + (" " if use_spaces else "") + expr_to_string(expr.right) + (")" if use_parens else "")
elif isinstance(expr, Term):
return (str(expr.left) if expr.left != 1 else "") + "*" + expr_to_string(expr.right, use_spaces=False, use_parens=False)
elif isinstance(expr, Function):
return expr.name + "(" + ", ".join([expr_to_string(x, use_parens=False) for x in expr.arguments]) + ")"
else:
raise Exception(expr)
-
Adam Blank authored9802562f