#include "calc.h" #include #include #include Expr* exprNew(Expr expr) { Expr* myNode = malloc(sizeof(Expr)); *myNode = expr; return myNode; } Expr* intExprNew(int int_value) { Expr* myNode = malloc(sizeof(Expr)); *myNode = (Expr) { .type = ET_Int, .int_value = int_value }; return myNode; } Expr* binaryExprNew(ExprType type, Expr* left, Expr* right) { Expr* myNode = malloc(sizeof(Expr)); *myNode = (Expr) { .type = type, .left = left, .right = right }; return myNode; } void exprFree(Expr* expr) { switch (expr->type) { case ET_Add: case ET_Subtract: case ET_Multiply: case ET_Divide: exprFree(expr->left); exprFree(expr->right); break; case ET_Int: break; } free(expr); } int exprEval(const Expr* expr) { switch (expr->type) { case ET_Add: return exprEval(expr->left) + exprEval(expr->right); case ET_Subtract: return exprEval(expr->left) - exprEval(expr->right); case ET_Multiply: return exprEval(expr->left) * exprEval(expr->right); case ET_Divide: return exprEval(expr->left) / exprEval(expr->right); case ET_Int: return expr->int_value; } return 0; } void exprPrint(const Expr* expr) { switch (expr->type) { case ET_Add: case ET_Subtract: case ET_Multiply: case ET_Divide: { printf("%c ", binarySymbol(expr->type)); exprPrint(expr->left); printf(" "); exprPrint(expr->right); break; } case ET_Int: printf("%d", expr->int_value); break; } } char binarySymbol(ExprType type) { switch (type) { case ET_Add: return '+'; case ET_Subtract: return '-'; case ET_Multiply: return '*'; case ET_Divide: return '/'; default: break; } return '\0'; }