Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- OPERATORS = {'+': (1, lambda x, y: x + y), '-': (1, lambda x, y: x - y),
- '*': (2, lambda x, y: x * y), '/': (2, lambda x, y: x / y),
- 'unary_minus': (3, lambda x: -1*x),}
- def parse(line):
- num = ''
- closing_parent = False
- for symbol in line:
- if symbol in OPERATORS or symbol in '(':
- if num:
- yield float(num)
- yield symbol
- num=''
- else:
- if symbol=='-':
- if closing_parent:
- closing_parent = False
- yield symbol
- else:
- yield 'unary_minus'
- else:
- yield symbol
- elif symbol==')':
- closing_parent = True
- if num:
- yield(float(num))
- num=''
- yield symbol
- else:
- yield symbol
- else:
- num+=symbol
- if num:
- yield float(num)
- def sort(parsed):
- tmp = []
- for i in parsed:
- if i in OPERATORS:
- while tmp and tmp[-1] != '(' and OPERATORS[i][0] <= OPERATORS[tmp[-1]][0]:
- yield tmp.pop()
- tmp.append(i)
- elif i == ')':
- while tmp:
- x = tmp.pop()
- if x == '(':
- break
- yield x
- elif i == '(':
- tmp.append(i)
- else:
- yield i
- while tmp:
- yield tmp.pop()
- def calc(sort):
- tmp = []
- for i in sort:
- if i in OPERATORS:
- if i=='unary_minus':
- x = tmp.pop()
- tmp.append(OPERATORS[i][1](x))
- else:
- y = tmp.pop()
- x = tmp.pop()
- tmp.append(OPERATORS[i][1](x, y))
- else:
- tmp.append(i)
- return tmp[0]
- for formula in ['2+2*2','-(4+10)/2','10-(2*5)','(2+2)-(1+1)']:
- print formula,'= ', calc(sort(parse(formula)))
- pass
- '''
- for formula in ['-(4+10)/2', '(2+2)-(1+1)']:
- #print formula,'= ', list(parse(formula)), ', '#,list(sort(parse(formula)))
- pass
- print formula,'= ', list(parse(formula))
- '''
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement