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) { \
|
if (!self) { \
|
||||||
return NULL; \
|
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
|
( (ast_node*)self )->node.destroy = (ast_node_delete*)destroyfn
|
||||||
|
|
||||||
/* It must not be possible to get here. */
|
/* 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 */
|
/* 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.context = ctx;
|
||||||
self->node.destroy = &_ast_node_destroy;
|
self->node.destroy = &_ast_node_destroy;
|
||||||
self->node.keep = false;
|
self->node.keep = false;
|
||||||
|
self->node.nodetype = nodetype;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* General expression initialization */
|
/* 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_unary_s ast_unary;
|
||||||
typedef struct ast_return_s ast_return;
|
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
|
/* Node interface with common components
|
||||||
*/
|
*/
|
||||||
typedef void ast_node_delete(ast_node*);
|
typedef void ast_node_delete(ast_node*);
|
||||||
|
@ -52,6 +71,7 @@ typedef struct
|
||||||
lex_ctx context;
|
lex_ctx context;
|
||||||
/* I don't feel comfortable using keywords like 'delete' as names... */
|
/* I don't feel comfortable using keywords like 'delete' as names... */
|
||||||
ast_node_delete *destroy;
|
ast_node_delete *destroy;
|
||||||
|
int nodetype;
|
||||||
/* keep: if a node contains this node, 'keep'
|
/* keep: if a node contains this node, 'keep'
|
||||||
* prevents its dtor from destroying this node as well.
|
* prevents its dtor from destroying this node as well.
|
||||||
*/
|
*/
|
||||||
|
|
Loading…
Reference in a new issue