Source code for sympy.parsing.mathematica

from __future__ import print_function, division

from re import match
from sympy import sympify


[docs]def mathematica(s): return sympify(parse(s))
def parse(s): s = s.strip() # Begin rules rules = ( # Arithmetic operation between a constant and a function (r"\A(\d+)([*/+-^])(\w+\[[^\]]+[^\[]*\])\Z", lambda m: m.group( 1) + translateFunction(m.group(2)) + parse(m.group(3))), # Arithmetic operation between two functions (r"\A(\w+\[[^\]]+[^\[]*\])([*/+-^])(\w+\[[^\]]+[^\[]*\])\Z", lambda m: parse(m.group(1)) + translateFunction( m.group(2)) + parse(m.group(3))), (r"\A(\w+)\[([^\]]+[^\[]*)\]\Z", # Function call lambda m: translateFunction( m.group(1)) + "(" + parse(m.group(2)) + ")"), (r"\((.+)\)\((.+)\)", # Parenthesized implied multiplication lambda m: "(" + parse(m.group(1)) + ")*(" + parse(m.group(2)) + ")"), (r"\A\((.+)\)\Z", # Parenthesized expression lambda m: "(" + parse(m.group(1)) + ")"), (r"\A(.*[\w\.])\((.+)\)\Z", # Implied multiplication - a(b) lambda m: parse(m.group(1)) + "*(" + parse(m.group(2)) + ")"), (r"\A\((.+)\)([\w\.].*)\Z", # Implied multiplication - (a)b lambda m: "(" + parse(m.group(1)) + ")*" + parse(m.group(2))), (r"\A(-? *[\d\.]+)([a-zA-Z].*)\Z", # Implied multiplication - 2a lambda m: parse(m.group(1)) + "*" + parse(m.group(2))), (r"\A([^=]+)([\^\-\*/\+=]=?)(.+)\Z", # Infix operator lambda m: parse(m.group(1)) + translateOperator(m.group(2)) + parse(m.group(3)))) # End rules for rule, action in rules: m = match(rule, s) if m: return action(m) return s def translateFunction(s): if s.startswith("Arc"): return "a" + s[3:] return s.lower() def translateOperator(s): dictionary = {'^': '**'} if s in dictionary: return dictionary[s] return s