#ifndef _AST_CTX_H_ #define _AST_CTX_H_ #include #include #include #include #include #define parser_get_state(parser, state_type) \ ((state_type *)parser_get_state_generic(parser)) #define parser_get_parent_state(parser, type_id, state_type) \ ((state_type *)parser_get_parent_state_generic(parser, type_id)) 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; struct ivy_diag_ctx *p_diag_ctx; 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( struct ivy_parser *parser, enum ivy_ast_node_type node_type, uintptr_t arg); 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); extern struct parser_state *parser_get_parent_state_generic( struct ivy_parser *parser, enum ivy_ast_node_type type); extern void parser_replace_current_node( struct ivy_parser *parser, struct ivy_ast_node *new_node); extern enum ivy_status parser_add_child( struct ivy_parser *parser, struct ivy_ast_node *new_node); extern struct ivy_diag *parser_push_diag( struct ivy_parser *parser, unsigned long diag_class, unsigned long msg, struct ivy_token *tok); #endif