From a175d139e74f52a83adb647925c3842f8ab026fb Mon Sep 17 00:00:00 2001 From: Andrew Date: Mon, 12 Jul 2021 11:12:14 +0400 Subject: Divided code in modules. --- main.py | 70 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 main.py (limited to 'main.py') diff --git a/main.py b/main.py new file mode 100644 index 0000000..a86d293 --- /dev/null +++ b/main.py @@ -0,0 +1,70 @@ +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:]) -- cgit v1.2.3