rpar = Literal(")").suppress()
addop = plus | minus
multop = mult | div
- expop = Literal("^")
+ expop = Literal("^") | Literal("**")
pi = CaselessLiteral("PI")
expr = Forward()
atom = ((Optional(oneOf("- +")) +
"-": operator.sub,
"*": operator.mul,
"/": operator.truediv,
- "^": operator.pow}
+ "^": operator.pow,
+ "**": operator.pow}
self.fn = {"sin": math.sin,
"cos": math.cos,
"tan": math.tan,
+ "sqrt": math.sqrt,
+ "log": lambda a: math.log(a, 10),
"abs": abs,
+ "ceil": math.ceil,
+ "floor": math.floor,
"trunc": lambda a: int(a),
"round": round,
"sgn": lambda a: abs(a) > epsilon and cmp(a, 0) or 0}
op = s.pop()
if op == 'unary -':
return -self.evaluateStack(s)
- if op in "+-*/^":
+ if op in ('+', '-', '*', '/', '^', '**'):
op2 = self.evaluateStack(s)
op1 = self.evaluateStack(s)
return self.opn[op](op1, op2)
return math.pi # 3.1415926535
elif op == "E":
return math.e # 2.718281828
- elif op in self.fn:
- return self.fn[op](self.evaluateStack(s))
+ elif op.lower() in self.fn:
+ return self.fn[op.lower()](self.evaluateStack(s))
elif op[0].isalpha():
return 0
else: