Advertisement
Guest User

Untitled

a guest
May 17th, 2017
117
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.23 KB | None | 0 0
  1. OPERATORS = {'+': (1, lambda x, y: x + y), '-': (1, lambda x, y: x - y),
  2.              '*': (2, lambda x, y: x * y), '/': (2, lambda x, y: x / y),
  3.              'unary_minus': (3, lambda x: -1*x),}
  4.  
  5. def parse(line):
  6.     num = ''
  7.     closing_parent = False
  8.     for symbol in line:
  9.         if symbol in OPERATORS or symbol in '(':
  10.             if num:
  11.                 yield float(num)
  12.                 yield symbol
  13.                 num=''
  14.             else:
  15.                 if symbol=='-':
  16.                     if closing_parent:
  17.                         closing_parent = False
  18.                         yield symbol
  19.                     else:
  20.                         yield 'unary_minus'
  21.                 else:
  22.                     yield symbol
  23.         elif symbol==')':
  24.             closing_parent = True
  25.             if num:
  26.                 yield(float(num))
  27.                 num=''
  28.                 yield symbol
  29.             else:
  30.                 yield symbol
  31.         else:
  32.             num+=symbol
  33.     if num:
  34.         yield float(num)
  35.  
  36. def sort(parsed):
  37.     tmp = []
  38.     for i in parsed:
  39.         if i in OPERATORS:
  40.             while tmp and tmp[-1] != '(' and OPERATORS[i][0] <= OPERATORS[tmp[-1]][0]:
  41.                 yield tmp.pop()
  42.             tmp.append(i)
  43.         elif i == ')':
  44.             while tmp:
  45.                 x = tmp.pop()
  46.                 if x == '(':
  47.                     break
  48.                 yield x
  49.         elif i == '(':
  50.             tmp.append(i)
  51.         else:
  52.             yield i
  53.     while tmp:
  54.         yield tmp.pop()
  55.  
  56. def calc(sort):
  57.     tmp = []
  58.     for i in sort:
  59.         if i in OPERATORS:
  60.             if i=='unary_minus':
  61.                 x = tmp.pop()
  62.                 tmp.append(OPERATORS[i][1](x))
  63.             else:
  64.                 y = tmp.pop()
  65.                 x = tmp.pop()
  66.                 tmp.append(OPERATORS[i][1](x, y))
  67.         else:
  68.             tmp.append(i)
  69.     return tmp[0]
  70.  
  71.  
  72. for formula in ['2+2*2','-(4+10)/2','10-(2*5)','(2+2)-(1+1)']:
  73.     print formula,'= ', calc(sort(parse(formula)))
  74.     pass
  75.  
  76. '''
  77. for formula in ['-(4+10)/2', '(2+2)-(1+1)']:
  78.    #print formula,'= ', list(parse(formula)), ', '#,list(sort(parse(formula)))
  79.    pass
  80.    print formula,'= ', list(parse(formula))
  81. '''
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement