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) { \
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
View file

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