mirror of
https://github.com/DarkPlacesEngine/gmqcc.git
synced 2024-11-30 15:41:12 +00:00
ast nodes now store their type id, and can be checked via ast_istype
This commit is contained in:
parent
03307a0903
commit
47a8a69f1c
2 changed files with 23 additions and 2 deletions
5
ast.c
5
ast.c
|
@ -32,7 +32,7 @@
|
|||
if (!self) { \
|
||||
return NULL; \
|
||||
} \
|
||||
ast_node_init((ast_node*)self, ctx); \
|
||||
ast_node_init((ast_node*)self, ctx, TYPE_##T); \
|
||||
( (ast_node*)self )->node.destroy = (ast_node_delete*)destroyfn
|
||||
|
||||
/* It must not be possible to get here. */
|
||||
|
@ -43,11 +43,12 @@ static GMQCC_NORETURN void _ast_node_destroy(ast_node *self)
|
|||
}
|
||||
|
||||
/* Initialize main ast node aprts */
|
||||
static void ast_node_init(ast_node *self, lex_ctx ctx)
|
||||
static void ast_node_init(ast_node *self, lex_ctx ctx, int nodetype)
|
||||
{
|
||||
self->node.context = ctx;
|
||||
self->node.destroy = &_ast_node_destroy;
|
||||
self->node.keep = false;
|
||||
self->node.nodetype = nodetype;
|
||||
}
|
||||
|
||||
/* General expression initialization */
|
||||
|
|
20
ast.h
20
ast.h
|
@ -44,6 +44,25 @@ typedef struct ast_call_s ast_call;
|
|||
typedef struct ast_unary_s ast_unary;
|
||||
typedef struct ast_return_s ast_return;
|
||||
|
||||
enum {
|
||||
TYPE_ast_node,
|
||||
TYPE_ast_expression,
|
||||
TYPE_ast_value,
|
||||
TYPE_ast_function,
|
||||
TYPE_ast_block,
|
||||
TYPE_ast_binary,
|
||||
TYPE_ast_store,
|
||||
TYPE_ast_entfield,
|
||||
TYPE_ast_ifthen,
|
||||
TYPE_ast_ternary,
|
||||
TYPE_ast_loop,
|
||||
TYPE_ast_call,
|
||||
TYPE_ast_unary,
|
||||
TYPE_ast_return
|
||||
};
|
||||
|
||||
#define ast_istype(x, t) ( ((ast_node_common*)x)->nodetype == (t) )
|
||||
|
||||
/* Node interface with common components
|
||||
*/
|
||||
typedef void ast_node_delete(ast_node*);
|
||||
|
@ -52,6 +71,7 @@ typedef struct
|
|||
lex_ctx context;
|
||||
/* I don't feel comfortable using keywords like 'delete' as names... */
|
||||
ast_node_delete *destroy;
|
||||
int nodetype;
|
||||
/* keep: if a node contains this node, 'keep'
|
||||
* prevents its dtor from destroying this node as well.
|
||||
*/
|
||||
|
|
Loading…
Reference in a new issue