summaryrefslogtreecommitdiff
path: root/myfind/ast_evaluation/ast_evaluation.c
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;
        }
    }
}