PC_graph/tree.h
2024-12-23 12:27:13 +01:00

141 lines
3.2 KiB
C

#ifndef TREE_H
#define TREE_H
#include "lex.h"
#include "math_functions.h"
/**
* @brief Typ uzlu
*/
enum expr_type {
EXPR_CONST,
EXPR_NEG,
EXPR_ADD,
EXPR_SUB,
EXPR_MULT,
EXPR_DIV,
EXPR_POW,
EXPR_X,
EXPR_FN
};
/**
* @brief Uzel výrazu
*/
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;
};
/**
* @brief Vytvoří uzel reprezentující konstantu
*
* @param val Hodnota konstanty
* @return Adresa uzlu
*/
struct expr_node *node_create_const(double val);
/**
* @brief Vytvoří uzel reprezentující negaci výrazu
*
* @param unop Negovaný výraz (unární operand)
* @return Adresa uzlu
*/
struct expr_node *node_create_neg(struct expr_node *unop);
/**
* @brief Vytvoří uzel reprezentující sčítání
*
* @param left Levý operand
* @param right Pravý operand
* @return Adresa uzlu
*/
struct expr_node *node_create_add(struct expr_node *left, struct expr_node *right);
/**
* @brief Vytvoří uzel reprezentující odčítání
*
* @param left Levý operand
* @param right Pravý operand
* @return Adresa uzlu
*/
struct expr_node *node_create_sub(struct expr_node *left, struct expr_node *right);
/**
* @brief Vytvoří uzel reprezentující násobení
*
* @param left Levý operand
* @param right Pravý operand
* @return Adresa uzlu
*/
struct expr_node *node_create_mult(struct expr_node *left, struct expr_node *right);
/**
* @brief Vytvoří uzel reprezentující dělení
*
* @param left Levý operand
* @param right Pravý operand
* @return Adresa uzlu
*/
struct expr_node *node_create_div(struct expr_node *left, struct expr_node *right);
/**
* @brief Vytvoří uzel reprezentující mocnění
*
* @param left Levý operand
* @param right Pravý operand
* @return Adresa uzlu
*/
struct expr_node *node_create_pow(struct expr_node *base, struct expr_node *power);
/**
* @brief Vytvoří uzel reprezentující proměnnou
*
* @return Adresa uzlu
*/
struct expr_node *node_create_x(void);
/**
* @brief Vytvoří uzel reprezentující funkci
*
* @param fn_idx Index funkce v poli vráceném fns_get()
* @param args Ukazatel na pole uzlů, které funkce obdrží jako argumenty
* @return Adresa uzlu
*/
struct expr_node *node_create_fn(size_t fn_idx, struct expr_node **args);
void node_debug_print(struct expr_node *node);
void node_debug_print_gv(const struct expr_node *node, FILE *output);
/**
* @brief Vyhodnotí uzel
*
* @param node Uzel
* @param x Proměnná
* @param y Výsledek vyhodnocení
* @return Stav vyhodnocení
*/
enum eval_result node_eval(const struct expr_node *node, double x, double *y);
/**
* @brief Uvolní uzel
*
* Tato funkce uvolní i potomky uzlu (operandy, argumenty, ...)
*
* @param node Uzel pro uvolnění
*/
void node_free(struct expr_node *node);
#endif /* TREE_H */