#ifndef _AST_CTX_H_ #define _AST_CTX_H_ #include #include #include #define parser_push_state(parser, node_id, node_type, state_type) \ ((state_type *)parser_push_state_generic( \ parser, node_id, sizeof(node_type), sizeof(state_type))) #define parser_get_state(parser, state_type) \ ((state_type *)parser_get_state_generic(parser)) struct parser_state { b_queue_entry s_entry; struct ivy_ast_node *s_parent; struct ivy_ast_node *s_node; }; struct ivy_parser { enum ivy_status p_status; b_queue p_state; b_queue p_token_queue; b_queue p_node_queue; }; enum pop_state_flags { STATE_ADD_NODE_TO_PARENT = 0x01u, }; extern struct parser_state *parser_push_state_generic( struct ivy_parser *parser, enum ivy_ast_node_type node_type, size_t node_size, size_t state_size); extern void parser_pop_state(struct ivy_parser *parser, enum pop_state_flags flags); extern struct parser_state *parser_get_state_generic(struct ivy_parser *parser); #endif