diff options
| author | Andrew <saintruler@gmail.com> | 2021-07-12 11:12:14 +0400 |
|---|---|---|
| committer | Andrew <saintruler@gmail.com> | 2021-07-12 11:12:14 +0400 |
| commit | a175d139e74f52a83adb647925c3842f8ab026fb (patch) | |
| tree | ff859d00b59950c76d0271537d6838afb4ff8a89 /main.py | |
| parent | abb8ad61e3605a5e17e05b2f300d2b7277bd424a (diff) | |
Divided code in modules.
Diffstat (limited to 'main.py')
| -rw-r--r-- | main.py | 70 |
1 files changed, 70 insertions, 0 deletions
@@ -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:]) |