X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;ds=sidebyside;f=codea%2Ftree.c;h=098f975e14bb3442c29cc0951becc55d2c6dcfce;hb=87d8329bf334039ff85cac0f833f63f4b9b8ceca;hp=7e7c715fab3f69dce60e446701a4b591147ccb7b;hpb=f8ffd35d181c49b0ad1c1f056dea43fc8e80ac13;p=uebersetzerbau-ss10.git diff --git a/codea/tree.c b/codea/tree.c index 7e7c715..098f975 100644 --- a/codea/tree.c +++ b/codea/tree.c @@ -22,16 +22,21 @@ static struct treenode *_new_plain(int op) 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; - new->exprcount = exprcount; return new; } @@ -61,10 +66,21 @@ struct treenode *new_field(char *name, struct treenode *l, struct treenode *r, i struct treenode *new_number(long val, int exprcount) { - struct treenode *new = _new_plain(O_NUM); + struct treenode *new; /* TODO: maximal groesse? */ #define BUFMAX 40 char *t = (char*) malloc(BUFMAX); + 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 if(val == -1) { + new = _new_plain(O_MONE); + } else { + new = _new_plain(O_NUM); + } #ifdef DDTREE fprintf(stderr, "new_number: %i\n", val);