From 49df60f32aca6428706bc895b7e48ab2d68444b5 Mon Sep 17 00:00:00 2001 From: Andrew Date: Mon, 12 Jul 2021 12:32:15 +0400 Subject: Added ability to set variables. --- main.py | 38 +++++++++++++++++++++++++------------- 1 file changed, 25 insertions(+), 13 deletions(-) (limited to 'main.py') 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__": -- cgit v1.2.3