Advertisement
Guest User

Untitled

a guest
Nov 26th, 2015
69
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.33 KB | None | 0 0
  1. from pprint import pprint
  2. import re
  3.  
  4. INTEGER, ADD, SUBTRACT, MULTIPLY, DIVIDE = "INTEGER, ADD, SUBTRACT, MULTIPLY, DIVIDE".split(", ")
  5. ORDER_OF_OPERATIONS = [MULTIPLY, DIVIDE, ADD, SUBTRACT]
  6.  
  7. scanner = re.Scanner([
  8. (r"([0-9]+)", lambda x, y: int(y)),
  9. (r"\+", lambda x, y: ADD),
  10. (r"-", lambda x, y: SUBTRACT),
  11. (r"\*", lambda x, y: MULTIPLY),
  12. (r"/", lambda x, y: DIVIDE),
  13. (r"\s+", lambda x, y: None),
  14. ], flags=re.DOTALL)
  15.  
  16. def operation_multiply(a, b):
  17. return a * b
  18.  
  19. def operation_divide(a, b):
  20. return a / b
  21.  
  22. def operation_add(a, b):
  23. return a + b
  24.  
  25. def operation_subtract(a, b):
  26. return a - b
  27.  
  28. def interpret(results):
  29. assert isinstance(results[0], int) and isinstance(results[-1], int), "Trailing operators were encoutered!"
  30. if len(results) == 1:
  31. return results[0]
  32. for operation in reversed(ORDER_OF_OPERATIONS):
  33. try:
  34. boundary = results.index(operation)
  35. return globals()["operation_%s" % operation.lower()](
  36. interpret(results[:boundary]),
  37. interpret(results[boundary+1:]),
  38. )
  39. except ValueError:
  40. pass
  41. assert False, "Missing an operator"
  42.  
  43. test = "14 + 2 * 3 - 6 / 2"
  44. results, remainder = scanner.scan(test)
  45. assert not remainder, "Some of the input couldn't be interpreted"
  46. print test, "=", interpret(results)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement