#ifndef IR_H
#define IR_H

/* This is the tree node structure */
typedef struct n {
    node_index_t type;
    void *data;
    struct s *entry;
    uint64_t n_children;
    struct n **children;
} node_t;

/**Export the initializer function, it is needed by the parser
 * @param *nd node to initialize
 * @param type type of node (see nodetype.h)
 * @param *data associated data. Declared void to allow any type
 * @param n_children number of children
 * @param ... variable argument list of child nodes (node_t *)
 * 
 * @return Pointer to the initialized node
 * */
node_t* node_init (
    node_t *nd, node_index_t type, void *data, uint64_t n_children, ...
);

typedef enum {
    SYM_GLOBAL_VAR, SYM_FUNCTION, SYM_PARAMETER, SYM_LOCAL_VAR
} symtype_t;

typedef struct s {
    char *name;
    symtype_t type;
    node_t *node;
    size_t seq;
    size_t nparms;
    tlhash_t *locals;
} symbol_t;
#endif
