summaryrefslogtreecommitdiff
path: root/main.py
diff options
context:
space:
mode:
Diffstat (limited to 'main.py')
-rw-r--r--main.py38
1 files changed, 25 insertions, 13 deletions
diff --git a/main.py b/main.py
index a86d293..0ba9d47 100644
--- a/main.py
+++ b/main.py
@@ -2,7 +2,7 @@ import sys
from consts import *
from tokenizer import tokenize
-from parser import build_tree
+from parser import parse, parse_expr
# RUNTIME
@@ -37,33 +37,45 @@ runtime_functions = {
# END OF RUNTIME
-def expr_eval(node):
- if node.type == NUMBER:
+def _eval(node):
+ if node.type == NodeType.NUMBER:
return node.value
- elif node.type == SYMBOL:
+
+ elif node.type == NodeType.SYMBOL:
return runtime.get(node.value)
- elif node.type == FUNCALL:
+
+ elif node.type == NodeType.FUNCALL:
fun_name = node.value[0]
- args = list(map(expr_eval, node.value[1]))
+ args = list(map(_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))
+
+ elif node.type == NodeType.OPERATOR:
+ if node.subtype == NodeType.UNARY:
+ return unary_operators.get(node.left.subtype)(_eval(node.right))
else:
- return operators.get(node.subtype)(expr_eval(node.left), expr_eval(node.right))
+ return operators.get(node.subtype)(_eval(node.left), _eval(node.right))
+
+ elif node.type == NodeType.ASSIGNMENT:
+ runtime[node.left.value] = _eval(node.right)
def main(*argv):
if len(argv) != 0:
data = argv[0]
else:
- data = "2 + 3 * 4"
+ # data = "2 + 3 * 4"
+ data = "let a = 2 + 3; let e = 4;"
# data = "(3 + 3 * 2) * -4"
# data = "(2 + factorial(4, )) * 9"
tokens = tokenize(data)
- node1 = build_tree(tokens)
- print(expr_eval(node1))
+ # print(tokens)
+ statements = parse(tokens)
+ for statement in statements:
+ _eval(statement)
+ # node, _ = parse_expr(tokens, 0)
+ # print(expr_eval(node))
+ print(1)
if __name__ == "__main__":