draft implementation of arbitrary PDF
[sympy.git] / sympy / parsing / mathematica.py
blob1909408bf1d59426a8f515795aea742ff4e0e68d
1 from re import match
2 from sympy import sympify
4 def mathematica (s):
5 return sympify(parse(s))
7 def parse (s):
8 s = s.strip()
10 #Begin rules
11 rules = (
12 (r"\A(\w+)\[([^\]]+[^\[]*)\]\Z", #Function call
13 lambda m: translateFunction(m.group(1)) + "(" + parse(m.group(2)) + ")" ),
15 (r"\((.+)\)\((.+)\)", #Parenthesized implied multiplication
16 lambda m: "(" + parse(m.group(1)) + ")*(" + parse(m.group(2)) + ")" ),
18 (r"\A\((.+)\)\Z", #Parenthesized expression
19 lambda m: "(" + parse(m.group(1)) + ")" ),
21 (r"\A(.*[\w\.])\((.+)\)\Z", #Implied multiplication - a(b)
22 lambda m: parse(m.group(1)) + "*(" + parse(m.group(2)) + ")" ),
24 (r"\A\((.+)\)([\w\.].*)\Z", #Implied multiplication - (a)b
25 lambda m: "(" + parse(m.group(1)) + ")*" + parse(m.group(2)) ),
27 (r"\A([\d\.]+)([a-zA-Z].*)\Z", #Implied multiplicatin - 2a
28 lambda m: parse(m.group(1)) + "*" + parse(m.group(2)) ),
30 (r"\A([^=]+)([\^\-\*/\+=]=?)(.+)\Z", #Infix operator
31 lambda m: parse(m.group(1)) + translateOperator(m.group(2)) + parse(m.group(3)) ))
32 #End rules
34 for rule, action in rules:
35 m = match(rule, s)
36 if m:
37 return action(m)
39 return s
41 def translateFunction (s):
42 if s[0:3] == "Arc":
43 return "a" + s[3:]
44 return s.lower()
46 def translateOperator (s):
47 dictionary = {'^':'**'}
48 if s in dictionary:
49 return dictionary[s]
50 return s