Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- from pprint import pprint
- import re
- INTEGER, ADD, SUBTRACT, MULTIPLY, DIVIDE = "INTEGER, ADD, SUBTRACT, MULTIPLY, DIVIDE".split(", ")
- ORDER_OF_OPERATIONS = [MULTIPLY, DIVIDE, ADD, SUBTRACT]
- scanner = re.Scanner([
- (r"([0-9]+)", lambda x, y: int(y)),
- (r"\+", lambda x, y: ADD),
- (r"-", lambda x, y: SUBTRACT),
- (r"\*", lambda x, y: MULTIPLY),
- (r"/", lambda x, y: DIVIDE),
- (r"\s+", lambda x, y: None),
- ], flags=re.DOTALL)
- def operation_multiply(a, b):
- return a * b
- def operation_divide(a, b):
- return a / b
- def operation_add(a, b):
- return a + b
- def operation_subtract(a, b):
- return a - b
- def interpret(results):
- assert isinstance(results[0], int) and isinstance(results[-1], int), "Trailing operators were encoutered!"
- if len(results) == 1:
- return results[0]
- for operation in reversed(ORDER_OF_OPERATIONS):
- try:
- boundary = results.index(operation)
- return globals()["operation_%s" % operation.lower()](
- interpret(results[:boundary]),
- interpret(results[boundary+1:]),
- )
- except ValueError:
- pass
- assert False, "Missing an operator"
- test = "14 + 2 * 3 - 6 / 2"
- results, remainder = scanner.scan(test)
- assert not remainder, "Some of the input couldn't be interpreted"
- print test, "=", interpret(results)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement