summaryrefslogtreecommitdiff
path: root/main.py
diff options
context:
space:
mode:
Diffstat (limited to 'main.py')
-rw-r--r--main.py70
1 files changed, 70 insertions, 0 deletions
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:])