+void
+print_ind(int num, char c)
+{
+ int i;
+
+ for (i = 0; i < num; i++){
+ putchar(c);
+ }
+}
+
+void
+print_tree(struct tree* t, int ind)
+{
+ if (!t)
+ return;
+
+ switch (t->st){
+ case ST_IF:
+ print_ind(ind,' ');
+ puts("if");
+ print_tree(t->pt.tif.c,ind+1);
+ print_ind(ind,' ');
+ puts("then");
+ print_tree(t->pt.tif.i,ind+1);
+ print_ind(ind,' ');
+ puts("else");
+ print_tree(t->pt.tif.e,ind+1);
+ break;
+ case ST_COND:
+#define UPPER(a) ((a) >> 8)
+#define LOWER(a) ((a) & 0xFF)
+ print_tree(t->pt.cond.left, ind+1);
+ print_ind(ind,' ');
+
+ if (UPPER(t->pt.cond.op) > 0)
+ putchar(UPPER(t->pt.cond.op));
+ putchar(LOWER(t->pt.cond.op));
+ putchar('\n');
+ print_tree(t->pt.cond.right, ind+1);
+ break;
+ case ST_BLOCK:
+ print_tree(t->pt.block.head,ind);
+ print_tree(t->pt.block.tail,ind);
+ break;
+ case ST_ASS:
+ print_tree(t->pt.ass.left, ind+1);
+ print_ind(ind,' ');
+ puts("=");
+ print_tree(t->pt.ass.right, ind+1);
+ break;
+ case ST_LEAF:
+ print_ind(ind, ' ');
+ switch (t->pt.leaf.type){
+ case L_VAR:
+ putchar('$');
+ case L_CONST:
+ puts(t->pt.leaf.value.s);
+ break;
+ case L_NUM:
+ printf("%d\n",t->pt.leaf.value.n);
+ break;
+ }
+ break;
+ case ST_EMPTY:
+ break;
+
+
+ }
+}
+
+