X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=codea%2Ftree.c;h=2e430f22fc6b57f152d63d98150b123cc4eda419;hb=c2a8a36f40f5dd2bdb26b07c4f9fc61801abbe3d;hp=b85fe6ac96a859acb4bfd0adca5ee90259d5f109;hpb=777a3cb3a801b3ab86e9a77fe045676ed498e350;p=uebersetzerbau-ss10.git diff --git a/codea/tree.c b/codea/tree.c index b85fe6a..2e430f2 100644 --- a/codea/tree.c +++ b/codea/tree.c @@ -1,5 +1,6 @@ #include #include +#include #include "tree.h" #if 0 @@ -14,43 +15,106 @@ static struct treenode *_new_plain(int op) new->parent = TREENULL; new->label = NULL; new->name = new->reg = (char *)NULL; - new->val = new->skip = 0; + new->val = new->exprcount = 0; new->param_index = -1; return new; } -struct treenode *new_node(int op, struct treenode *l, struct treenode *r) +struct treenode *new_node(int op, struct treenode *l, struct treenode *r, int exprcount) { - struct treenode *new = _new_plain(op); + struct treenode *new = TREENULL; #ifdef DDTREE fprintf(stderr, "new_node: %i (%s)\n", op, o_names[op]); #endif - - new->kids[0] = l; - new->kids[1] = r; + if(op == O_SUB && l != TREENULL && r != TREENULL && l->op == O_NUM && r->op == O_NUM) { + new = new_number(l->val - r->val, exprcount); + free(l); free(r); + } else { + new = _new_plain(op); + new->kids[0] = l; + new->kids[1] = r; + new->exprcount = exprcount; + } new->name = (char *)NULL; return new; } -struct treenode *new_param(int op, struct treenode *l, struct treenode *r, int param_index) +struct treenode *new_param(int op, char *name, struct treenode *l, struct treenode *r, int param_index, int exprcount) { - struct treenode *new = new_node(op, l, r); + struct treenode *new = new_node(op, l, r, exprcount); #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_number(long val) +struct treenode *new_field(char *name, struct treenode *l, struct treenode *r, int soffset, int exprcount) { - struct treenode *new = _new_plain(O_NUM); + struct treenode *new = new_node(O_FIELD, l, r, exprcount); + +#ifdef DDTREE + fprintf(stderr, "new_field: %i (soffset)\n", soffset); +#endif + new->soffset = soffset; + new->name = name; + return new; +} + +struct treenode *new_number(long val, int exprcount) +{ + 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; + new->exprcount = exprcount; + 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 (%i). \"%s\"\n", o_names[node->op], node->reg, node->exprcount, 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); + } +} +