fork(2) download
  1. import re
  2.  
  3. def toTree(infixStr):
  4. # divide string into tokens, and reverse so I can get them in order with pop()
  5. tokens = re.split(r' *([\+\-\*\^/]) *', infixStr)
  6. tokens = [t for t in reversed(tokens) if t!='']
  7. precs = {'+':0 , '-':0, '/':1, '*':1, '^':2}
  8.  
  9. #convert infix expression tokens to a tree, processing only
  10. #operators above a given precedence
  11. def toTree2(tokens, minprec):
  12. node = tokens.pop()
  13. while len(tokens)>0:
  14. prec = precs[tokens[-1]]
  15. if prec<minprec:
  16. break
  17. op=tokens.pop()
  18.  
  19. # get the argument on the operator's right
  20. # this will go to the end, or stop at an operator
  21. # with precedence <= prec
  22. arg2 = toTree2(tokens,prec+1)
  23. node = (op, node, arg2)
  24. return node
  25.  
  26. return toTree2(tokens,0)
  27.  
  28. print toTree("5+3*4^2+1")
  29.  
Success #stdin #stdout 0.01s 23352KB
stdin
Standard input is empty
stdout
('+', ('+', '5', ('*', '3', ('^', '4', '2'))), '1')