calc-tb/expr.c
2025-03-13 12:32:17 +01:00

98 lines
2.0 KiB
C

#include "calc.h"
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
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';
}