ast nodes now store their type id, and can be checked via ast_istype

This commit is contained in:
Wolfgang Bumiller 2012-07-29 10:03:13 +02:00
parent 03307a0903
commit 47a8a69f1c
2 changed files with 23 additions and 2 deletions

5
ast.c
View file

@ -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
View file

@ -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.
*/ */