PC_graph/tree.h
2024-10-13 19:32:55 +02:00

51 lines
1.5 KiB
C

#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 */