Advertisement
Guest User

Untitled

a guest
Apr 19th, 2014
50
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.24 KB | None | 0 0
  1. class Op:
  2. def __init__(self, num_in, num_out, fn):
  3. """
  4. A postfix operator
  5.  
  6. num_in: int
  7. num_out: int
  8. fn: accept num_in positional arguments,
  9. perform operation,
  10. return list containing num_out values
  11. """
  12. assert num_in >= 0, "Operator cannot have negative number of arguments"
  13. self.num_in = num_in
  14. assert num_out >= 0, "Operator cannot return negative number of results"
  15. self.num_out = num_out
  16. self.fn = fn
  17.  
  18. def __call__(self, stack):
  19. """
  20. Run operator against stack (in-place)
  21. """
  22. args = stack.pop_n(self.num_in) # pop num_in arguments
  23. res = self.fn(*args) # pass to function, get results
  24. stack.push_n(self.num_out, res) # push num_out values back
  25. ops = {
  26. '*': Op(2, 1, lambda a,b: [a*b]), # multiplication
  27. '/': Op(2, 1, lambda a,b: [a//b]), # integer division
  28. '+': Op(2, 1, lambda a,b: [a+b]), # addition
  29. '-': Op(2, 1, lambda a,b: [a-b]), # subtraction
  30. '/%': Op(2, 2, lambda a,b: [a//b, a%b]) # divmod (example of 2-output op)
  31.  
  32. def postfix_eval(tokens):
  33. """
  34. Evaluate a series of tokens as a postfix expression;
  35. return the resulting stack
  36. """
  37. if is_str(tokens):
  38. # if tokens is a string, treat it as a space-separated list of tokens
  39. tokens = tokens.split()
  40.  
  41. stack = Stack()
  42. for token in tokens:
  43. try:
  44. # Convert to int and push on stack
  45. stack.append(int(token))
  46. except ValueError:
  47. try:
  48. # Not an int - must be an operator
  49. # Get the appropriate operator and run it against the stack
  50. op = ops[token]
  51. op(stack) # runs Op.__call__(op, stack)
  52. except KeyError:
  53. # Not a valid operator either
  54. raise ValueError("unknown operator {}".format(token))
  55. return stack
  56.  
  57. def main():
  58. while True:
  59. expr = input(eval('nEnter a postfix expression (or nothing to quit): ').strip()
  60. if expr:
  61. try:
  62. print(" => {}".format(postfix_eval(expr)))
  63. except ValueError as error:
  64. print("Your expression caused an error: {}".format(error))
  65. else:
  66. break
  67.  
  68. if __name__=="__main__":
  69. main()
  70.  
  71. raw_input("Enter a postfix expression (or nothing to quit): ")
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement