gesamt: bei leeren expression, baum bis zum ersten O_CALL durchwandern
[uebersetzerbau-ss10.git] / gesamt / tree.c
index 593709c5c71ce7fc17171a07eef934013ec3af5d..1c3f88841305506d57885490be2ddc9366e7e315 100644 (file)
@@ -15,11 +15,16 @@ static struct treenode *_new_plain(int op)
        new->parent = TREENULL;
        new->label = NULL;
        new->name = new->reg = (char *)NULL;
-       new->val = 0;
+       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;
@@ -63,6 +68,32 @@ struct treenode *new_field(char *name, struct treenode *l, struct treenode *r, i
        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;
@@ -116,3 +147,14 @@ void write_tree(struct treenode *node, int indent)
        }
 }
 
+void just_calls(struct treenode *node)
+{
+       if(node == TREENULL) {
+               return;
+       } else if(node->op == O_CALL) {
+               write_tree(node, 0); burm_label(node); burm_reduce(node, 1);
+       } else {
+               just_calls(node->kids[0]);
+               just_calls(node->kids[1]);
+       }
+}