#ifndef TREE_H #define TREE_H #include "lex.h" #include "math_functions.h" enum expr_type { EXPR_CONST, EXPR_NEG, EXPR_ADD, EXPR_SUB, EXPR_MULT, EXPR_DIV, EXPR_POW, EXPR_X, EXPR_FN }; struct expr_node { enum expr_type type; union expr_vals { struct expr_binop_vals { struct expr_node *left; struct expr_node *right; } binop; struct expr_fn_vals { size_t fn_idx; struct expr_node *args[MAX_MATH_FUNCTION_ARGS]; } fn; struct expr_node *unop; double num; } vals; }; extern struct expr_node *node_create_const(double val); extern struct expr_node *node_create_neg(struct expr_node *unop); extern struct expr_node *node_create_add(struct expr_node *left, struct expr_node *right); extern struct expr_node *node_create_sub(struct expr_node *left, struct expr_node *right); extern struct expr_node *node_create_mult(struct expr_node *left, struct expr_node *right); extern struct expr_node *node_create_div(struct expr_node *left, struct expr_node *right); extern struct expr_node *node_create_pow(struct expr_node *base, struct expr_node *power); extern struct expr_node *node_create_x(void); extern struct expr_node *node_create_fn(size_t fn_idx, struct expr_node **args); extern void node_debug_print(struct expr_node *node); extern void node_debug_print_gv(const struct expr_node *node, FILE *output); extern double node_eval(const struct expr_node *node, double x); extern void node_free(struct expr_node *node); #endif /* TREE_H */