У меня есть много структур, которые выглядят примерно так:
typedef struct ast_function_node
{
int node_type;
ast_node* arguments;
symbol* sym;
} ast_function_node;
typedef struct ast_while_node
{
int node_type;
ast_node* condition;
ast_node* while_branch;
} ast_while_node;
typedef struct ast_assignment_node
{
int node_type;
symbol* sym;
ast_node* value;
} ast_assignment_node;
typedef struct ast_number_node
{
int node_type;
double value;
} ast_number_node;
typedef struct ast_string_node
{
int node_type;
char* value;
} ast_string_node;
etc...
И базовая структура:
typedef struct // Basic AST node
{
int node_type;
struct ast_node* left;
struct ast_node* right;
} ast_node;
Я могу довольно легко заполнить этот AST, но когда дело доходит до его обхода, я застреваю в аду приведения типов. Если я хотел посетить каждый узел, посмотреть на его тип и затем сделать что-то соответственно, каков наилучший способ сделать это? Простое приведение к базовому узлу ast_node
, конечно, не сделает этого.