codea: refactor, teil1
[uebersetzerbau-ss10.git] / codea / tree.c
index 1490ae6302c0b58891775605fa0977f7a26229f6..2e430f22fc6b57f152d63d98150b123cc4eda419 100644 (file)
@@ -1,8 +1,9 @@
 #include <stdio.h>
 #include <stdlib.h>
+#include <string.h>
 #include "tree.h"
 
-#if 1
+#if 0
 #define DDTREE
 #endif
 
@@ -14,32 +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_number(long val)
+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, 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_field(char *name, struct treenode *l, struct treenode *r, int soffset, int exprcount)
+{
+       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 = _new_plain(O_NUM);
+       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);
+       }
+}
+