diff options
| author | Andrew <saintruler@gmail.com> | 2021-07-12 12:32:15 +0400 |
|---|---|---|
| committer | Andrew <saintruler@gmail.com> | 2021-07-12 12:32:15 +0400 |
| commit | 49df60f32aca6428706bc895b7e48ab2d68444b5 (patch) | |
| tree | d78ba857afd5940c63ba4da11a9324b94f8c448f /main.py | |
| parent | e3ae2c6c9b3a9d766b76f790ed18621765ed890d (diff) | |
Added ability to set variables.
Diffstat (limited to 'main.py')
| -rw-r--r-- | main.py | 38 |
1 files changed, 25 insertions, 13 deletions
@@ -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__": |