PC_graph/tree.h
2024-11-28 17:30:29 +01:00

53 lines
1.6 KiB
C

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