import sys from consts import * from tokenizer import tokenize from parser import build_tree # RUNTIME unary_operators = { "-": lambda a: -a, "+": lambda a: a } operators = { "+": lambda a, b: a + b, "-": lambda a, b: a - b, "*": lambda a, b: a * b, "^": lambda a, b: a ** b, } runtime = { "x": 10 } def factorial(n): if n <= 1: return 1 return n * factorial(n - 1) runtime_functions = { "factorial": factorial } # END OF RUNTIME def expr_eval(node): if node.type == NUMBER: return node.value elif node.type == SYMBOL: return runtime.get(node.value) elif node.type == FUNCALL: fun_name = node.value[0] args = list(map(expr_eval, node.value[1])) return runtime_functions.get(fun_name)(*args) elif node.type == OPERATOR: if node.subtype == UNARY: return unary_operators.get(node.left.subtype)(expr_eval(node.right)) else: return operators.get(node.subtype)(expr_eval(node.left), expr_eval(node.right)) def main(*argv): if len(argv) != 0: data = argv[0] else: data = "2 + 3 * 4" # data = "(3 + 3 * 2) * -4" # data = "(2 + factorial(4, )) * 9" tokens = tokenize(data) node1 = build_tree(tokens) print(expr_eval(node1)) if __name__ == "__main__": main(*sys.argv[1:])