# 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 = (
(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 multiplicatin - 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