#include #include #include #include "tree.h" #if 0 #define DDTREE #endif static struct treenode *_new_plain(int op) { struct treenode *new = (TREECAST) malloc(TREESIZE); new->op = op; new->kids[0] = new->kids[1] = TREENULL; new->parent = TREENULL; new->label = NULL; new->name = new->reg = (char *)NULL; new->val = new->paramges = new->vars = 0; new->param_index = -1; return new; } struct treenode *new_nothing(void) { return new_node(O_NOTHING, TREENULL, TREENULL); } struct treenode *new_node(int op, struct treenode *l, struct treenode *r) { struct treenode *new = TREENULL; #ifdef DDTREE fprintf(stderr, "new_node: %i (%s)\n", op, o_names[op]); #endif if(op == O_SUB && l != TREENULL && r != TREENULL && l->op == O_NUM && r->op == O_NUM) { new = new_number(l->val - r->val); free(l); free(r); } else { new = _new_plain(op); new->kids[0] = l; new->kids[1] = r; } new->name = (char *)NULL; return new; } struct treenode *new_param(int op, char *name, struct treenode *l, struct treenode *r, int param_index) { struct treenode *new = new_node(op, l, r); #ifdef DDTREE fprintf(stderr, "new_param: %i (index)\n", param_index); #endif new->param_index = param_index; new->name = name; return new; } struct treenode *new_field(char *name, struct treenode *l, struct treenode *r, int soffset) { struct treenode *new = new_node(O_FIELD, l, r); #ifdef DDTREE fprintf(stderr, "new_field: %i (soffset)\n", soffset); #endif new->soffset = soffset; new->name = name; return new; } struct treenode *new_arg(struct treenode *l, struct treenode *r, int soffset) { struct treenode *new = new_node(O_ARG, l, r); #ifdef DDTREE fprintf(stderr, "new_arg: %i (soffset)\n", soffset); #endif new->soffset = soffset; new->name = (char *) malloc(10); sprintf(new->name, "%i", soffset); return new; } struct treenode *new_call(char *name, struct treenode *l, struct treenode *r, int paramges, int vars) { struct treenode *new = new_node(O_CALL, l, r); #ifdef DDTREE fprintf(stderr, "new_call\n"); #endif new->name = name; new->paramges = paramges; new->vars = vars; return new; } struct treenode *new_number(long val) { struct treenode *new; /* TODO: maximal groesse? */ #define BUFMAX 40 char *t = (char*) malloc(BUFMAX); if (val == 0) { new = _new_plain(O_NULL); } else if(val == -1) { new = _new_plain(O_MONE); } else if(val == -2) { new = _new_plain(O_MTWO); } else if(val == -4) { new = _new_plain(O_MFOUR); } else if(val == -8) { new = _new_plain(O_MEIGHT); } else { new = _new_plain(O_NUM); } #ifdef DDTREE fprintf(stderr, "new_number: %i\n", val); #endif new->val = val; memset(t, 0, BUFMAX); sprintf(t, "%li", val); new->name = t; return new; } static void write_indent(int i) { int a; for(a = 0; a < i; a++) { fprintf(stderr, "| "); } } void write_tree(struct treenode *node, int indent) { if(node == TREENULL) return; write_indent(indent); fprintf(stderr, "%s @ %%%s. \"%s\"\n", o_names[node->op], node->reg, node->name == (char*) NULL ? "" : node->name); if(node->kids[0] != TREENULL) { write_tree(node->kids[0], indent+1); } if(node->kids[1] != TREENULL) { write_tree(node->kids[1], indent+1); } }