import sys from consts import * from tokenizer import tokenize from parser import parse, parse_expr # 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, "print": print, } # END OF RUNTIME def _eval(node): if node.type == NodeType.NUMBER: return node.value elif node.type == NodeType.SYMBOL: return runtime.get(node.value) elif node.type == NodeType.FUNCALL: fun_name = node.left.value args = list(map(_eval, node.right.value)) return runtime_functions.get(fun_name)(*args) 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)(_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 = "let a = 2 + 3; let e = 4;" # data = "(3 + 3 * 2) * -4" # data = "(2 + factorial(4, )) * 9" data = "print(2);" tokens = tokenize(data) # print(tokens) statements = parse(tokens) for statement in statements: _eval(statement) # node, _ = parse_expr(tokens, 0) # print(_eval(node)) pass if __name__ == "__main__": main(*sys.argv[1:])