43 lines
1.3 KiB
C
43 lines
1.3 KiB
C
#ifndef _AST_CTX_H_
|
|
#define _AST_CTX_H_
|
|
|
|
#include <blue/core/queue.h>
|
|
#include <ivy/lang/ast.h>
|
|
#include <ivy/status.h>
|
|
|
|
#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;
|
|
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);
|
|
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);
|
|
|
|
#endif
|