Advertisement
Guest User

Untitled

a guest
Mar 22nd, 2018
97
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.60 KB | None | 0 0
  1. import operator
  2.  
  3. class ParseError(Exception):
  4.     pass
  5.  
  6. op = {'+': (0,  operator.add),
  7.            '-': (0,  operator.sub),
  8.            '*': (1,  operator.mul),
  9.            '/': (1,  operator.truediv),
  10.            '^': (2,  operator.pow)}
  11.  
  12. def parcheck(s):
  13.     c = 0
  14.     for t in s:
  15.         c += (t=="(") -(t==")")
  16.         if c<0:
  17.             return False
  18.     return c == 0
  19.  
  20. def parse(s):
  21.     if not s:
  22.         return 0
  23.     if s[0] == "(" and s[-1]==")":
  24.         if parcheck(s[1:-1]):
  25.             return parse(s[1:-1])
  26.     if s[0] in "*/^"  or s[-1] in op:
  27.             raise ParseError("Syntax error")
  28.     if any(t in op for t in s):
  29.         m = mi = -1
  30.         c = 0
  31.         for i, t in enumerate(s):
  32.             if t in "()":
  33.                 c += (t=="(") - (t==")")
  34.             elif t in op:  
  35.                 if i and t in "+-" and s[i-1] in op:
  36.                     continue
  37.                 if op[t][0] + c*3 <= m or m<0:
  38.                     m,  mi = op[t][0] + c*3,  i
  39.         lv,  rv = parse(s[:mi]),  parse(s[mi+1:])
  40.         return op[s[mi]][1](lv,  rv)
  41.     if s[0] == "(":
  42.         return parse(s[1:])
  43.     if s[-1] == ")":
  44.         return parse(s[:-1])
  45.     try:
  46.         return int(s)
  47.     except:
  48.         raise ParseError("Syntax error")
  49.  
  50. def calc(s):
  51.     try:
  52.         if parcheck(s):
  53.             if  any(t.isdigit() for t in s) and s.find("()")<0:
  54.                 print(parse(s))
  55.             else:
  56.                 raise ParseError("Syntax error")
  57.         else:
  58.             raise ParseError("Parentheses mismatch")
  59.     except ParseError as e:
  60.         print(e)
  61.         return
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement