diff --git a/src/evaluator.c b/src/evaluator.c index cbaf776..219f854 100644 --- a/src/evaluator.c +++ b/src/evaluator.c @@ -1,22 +1,31 @@ #include "evaluator.h" #include "lexer.h" #include +#include int64_t evaluate(ASTNode *tree) { if (tree->type == NODE_BINARY_OP) { - switch (tree->data.binary.op) { + Operator op = tree->data.binary.op; + ASTNode *left = tree->data.binary.left; + ASTNode *right = tree->data.binary.right; + + free(tree); + + switch (op) { case OP_ADD: - return evaluate(tree->data.binary.left) + evaluate(tree->data.binary.right); + return evaluate(left) + evaluate(right); case OP_SUB: - return evaluate(tree->data.binary.left) - evaluate(tree->data.binary.right); + return evaluate(left) - evaluate(right); case OP_MUL: - return evaluate(tree->data.binary.left) * evaluate(tree->data.binary.right); + return evaluate(left) * evaluate(right); case OP_DIV: - return evaluate(tree->data.binary.left) / evaluate(tree->data.binary.right); + return evaluate(left) / evaluate(right); } } else { - return tree->data.integer; + int64_t return_val = tree->data.integer; + free(tree); + return return_val; } }