#ifndef TREE_H #define TREE_H #include "lex.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 { enum math_fn fn; struct expr_node *arg; } 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(enum math_fn fn, struct expr_node *arg); extern void node_debug_print(struct expr_node *node); extern double node_eval(struct expr_node *node, double x); extern void node_free(struct expr_node *node); #endif /* TREE_H */