51 lines
1.5 KiB
C
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 */ |