98 lines
2.0 KiB
C
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';
|
|
}
|