-
-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_ARROW:
- if (t->pt.arrow.kw_left){
- print_ind(ind+1, ' ');
- puts(t->pt.arrow.kw_left);
- }
- print_ind(ind, ' ');
- printf("->\n");
- if (t->pt.arrow.kw_right){
- print_ind(ind+1, ' ');
- puts(t->pt.arrow.kw_right);
- }
- print_tree(t->pt.arrow.s,ind+1);
- break;
- case ST_OP:
- print_tree(t->pt.op.left, ind+1);
- print_ind(ind,' ');
- putchar(t->pt.op.op);
- putchar('\n');
- print_tree(t->pt.op.right, ind+1);
- break;
- case ST_EMPTY:
- break;
-
-
- }
-}
-
-
-int
-main(void)
-{
-// yydebug=1;
- yyparse ();
-
- print_tree(input_tree,0);
- return 0;
-}