blob: 7ad91affcb8fc36d958842d7961dfd0defff31d4 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
#include <err.h>
#include <stdio.h>
#include "expression.h"
int eval_expr(struct my_expr *expr)
{
if (expr->type == EXPR_NUMBER)
return expr->data.value;
else if (expr->type == EXPR_NEGATION)
return -1 * eval_expr(expr->data.children.left);
else
{
int right = eval_expr(expr->data.children.right);
switch (expr->type)
{
case EXPR_ADDITION:
return eval_expr(expr->data.children.left) + right;
case EXPR_SUBTRACTION:
return eval_expr(expr->data.children.left) - right;
case EXPR_MULTIPLICATION:
return eval_expr(expr->data.children.left) * right;
default:
if (expr->data.children.right == NULL || (right == 0))
err(1, "Division by zero not allowed!");
return eval_expr(expr->data.children.left) / right;
}
}
}
|